到如今为止,咱们会从 docker hub 拉取本身须要的 image 文件并执行起来. 还会基于已有的 image 来制做本身特殊须要的 image . 可是若是咱们完成一个功能须要多个 image 组合起来使用该怎么办呢?
虽然能够经过 Dockerfile 来制做一个这样的 image , 可是若是全部的功能都作在一个 image 中, 若是有一个模块需呀改变的话就须要从新构建整个 image.
做为一个程序员你知道,若是把全部的功能作到一个 image 里面至关于不断的"继承" 不一样 image 的功能, 显然这个而不是一个好方法. 并且有前人告诉咱们 "组合优于继承"!nginx
在前一节,咱们作好了一个 hello world 的 http 服务器工做在3000端口上. 如今我想用 nginx
做为反向代理到8080端口上访问这个服务.程序员
如何将两个 container 组合起来呢? 经过网络. docker 安装以后应建立一些 networkdocker
$docker network ls NETWORK ID NAME DRIVER SCOPE a3ccacd179e5 bridge bridge local 10768aaf02ae host host local c2df063c31ab none null local
其中最经常使用的就是这个叫 bridge
的网络. 经过命令 docker network inspect bridge
来查看 network 的具体状况. 能够发现默认方式启动的 continer 都是在这个 bridge
的网络下. 而这些container 之间是相同的. 只是相互之间访问必须才用 ip 的方式来访问, 并且每次 container 启动的时候 ip 地址会是变化的. 因此要在 bridge network 下相互访问网路服务很是的麻烦.bash
$docker network inspect bridge [ { "Name": "bridge", # 忽略.... "Containers": { "91c3adde0212956c4cc2800dc9795165b1aea2a59547f74b441ec27e2427ac5a": { "Name": "graphite", "EndpointID": "f1e4c35371035e7149d80b9bb567282e686ae99cb118bc81bb6e7996efbe1993", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "d7ae7809b8530b4ee473991bd65cb6446c382c462e7d4702b7b81b8ec58b4362": { "Name": "grafana", "EndpointID": "9341a8a43bff28fb9077ba1a3d2b6609fd6a91214109e075658acbd9ba7ef840", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }, # 忽略... } ]
好在 docker 在用户本身建立的网络中提供了从 container 名字到对应 ip 的解析. 换句话说, 能够直接经过 container 的名字来访问须要的服务.服务器
首先咱们为咱们的 nginx 和 helloworld 网络服务器建立一个叫 "supernet" 的网络.网络
$docker network create supernet
而后经过--network
和 --name
启动一个加入到 supernet 网络的 hello world 网路服务.3d
$ docker run --network supernet --name hello --rm pshu/helloworld:1.0.0
接着建立一个 default.conf
文件做为 nginx 服务器的反向代理配置文件, 将全部http 请求代理到 hello 容器的3000端口上.代理
server { listen 8080; server_name localhost; location / { proxy_pass http://hello:3000; } }
一样采用 --network
将运行 nginx 的容器也加入到 supernet 的网络中去;同时映射对应的配置文件和端口.code
$docker run -it --rm --network supernet \ -v $PWD/conf.d:/etc/nginx/conf.d -p 8080:8080 nginx
最后我就能经过 http://127.0.0.0:8080
访问到来自 hello container 中的 http 服务了.server
但愿你们喜欢.