到如今爲止,咱們會從 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
但願你們喜歡.