Docker学习笔记(四)

使用docker nginx

首先参考官方docker nginx

nginx

可以看到有很多不同标签的镜像,有基于debian的,也有基于alpine的,这里我们选择alpine,我们首先pull选择的镜像

1
docker pull nginx:1.11.4-alpine

最好还是看下该镜像的Dockerfile文件,对镜像的内容有些了解还是很有用的

下载完镜像之后我们继续查看文档,第一个例子就是利用nginx托管简单的静态文件

1
docker run --name nginx-test -v /some/content:/usr/share/nginx/html:ro -d nginx:1.11.4-alpine

--name设置容器的名称,-v挂载宿主主机目录到nginx容器指定的web目录,ro表示只读,rw表示可读可写,-d表示在宿主主机的后台运行,之后就是利用的镜像,下面是一片文章来回答docker容器在后台运行和前台运行的区别:

Docker 容器后台运行和前台运行的区别

那么到目前为止一个简单的web应用就搭建好了,现在来说明一下windows环境下的各种问题

windows环境说明

  • 物理机win10 x64企业版
  • 本人安装的是docker toolbox(在virtual box中创建一个名字为default的虚拟机来作为docker容器的宿主机)

而每个容器其实也就相当于是一个linux,所以这样其实在我电脑上有三层:

win10物理机 -> default(linux)虚拟机(宿主机) -> 容器

这所以强调这一点是因为如果是正常的生产环境的话,应该是直接在一台linux服务器中安装docker,然后运行容器,也就是只有两层:

linux(宿主机) -> 容器

那么三层会带来什么影响呢?

挂载卷

在选择挂载目录时,Kitematic提示只能挂载物理机上本用户的目录到/usr/share/nginx/html,也就是只能挂载C:\Users\zzx(zzx为我windows当前用户)目录下的文件夹到/usr/share/nginx/html,又看到default虚拟机设置中与windows物理机的共享文件夹是C:\Users,以为是只设置了c盘的原因,于是添加了一个f盘,发现还是只能挂载C:\Users\zzx下的目录,无奈,创建了C:\Users\zzx\.docker\docker\static_web,并将spring帮助文档中的index.html放在了该目录下,可以通过Kitematic修改挂载目录,挺方便的:

那我我们如何访问到该index.html文件呢?由此引发第二个问题

如何访问

首先查看该容器Ports信息:

可以看到容器暴露了80和443端口,而容器的80和443端口分别映射到宿主机的32769和32768端口,而192.168.99.100则是宿主机的ip,也可以通过以下命令查看端口映射:

1
docker port docker-name/id 需要查询的端口

那么在物理机windows中,就需要用http://192.168.99.100:32769/来访问该index.html文件了。因为windows只能和宿主机通信,只能看到32769和32768这两个端口,而宿主机才能和容器通信,宿主机才能看到容器暴露的80和443端口

容器的ip

每个容器的ip都是docker设置的,并且使用的是172.17.x.x这个网段,所以容器间能够实现共享,因为都在同一个子网下,而宿主机和容器是通过网桥连接的,网桥的一端是宿主机中的适配器,另一端则是容器中代表172.17.x.x这个ip的适配器

在我此次实验中,容器nginx-test的ip是172.17.0.2

所以在宿主机中能够通过http://localhost/访问到index.html文件

连接容器

1
docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp:/opt/webapp alpine sh

以上命令基于alpine镜像创建了一个名为webapp的容器,并暴露了该容器的4567端口,同时挂载了一个目录,最主要的是--linke选项

--link标志创建了两个容器间的父子连接,该标识需要两个参数,一个是要连接的容器的名称,第二个是连接后容器的别名。以上操作,我们把新容器连接到redis容器,并使用db作为别名。

通过把容器连接在一起,可以让父容器直接访问任何子容器的公开端口。更好的是,只有使用--link标志连接到这个容器的容器才能连接到这个端口,容器的端口不需要对本地宿主机公开。通过这个安全模型,可以限制容器化应用程序的被攻击面,减少应用暴露的网络。

坚持原创技术分享,您的支持将鼓励我继续创作!