docker network基础
前面介紹了nginx與php兩個(gè)容器間是如何進(jìn)行通信的:
[root@docker ~]# docker run -d --name=php -v /www:/usr/local/nginx/html php [root@docker ~]# docker run -d --name=nginx --link=php:php -v /www:/usr/local/nginx/html -p 81:80 nginx [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58280fe851f9 nginx "/usr/local/nginx/..." 15 seconds ago Up 14 seconds 0.0.0.0:81->80/tcp nginx 9ea150c35587 php "/usr/local/php/sb..." 36 seconds ago Up 35 seconds 9000/tcp php通過(guò)容器間的選項(xiàng)--link指定容器名稱(chēng)進(jìn)行不同容器間的通信(--link container_name或者將container_name取一個(gè)別名)
現(xiàn)在使用另外一種方式替代--link來(lái)達(dá)到容器間的通信:docker network
查看local的網(wǎng)絡(luò)信息:
[root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 5133ec415c3c bridge bridge local f359ca4e2d39 host host local 8d68673c045c none null local現(xiàn)在創(chuàng)建一個(gè)網(wǎng)絡(luò)名為my_net且driver為bridge的網(wǎng)絡(luò):(默認(rèn)創(chuàng)建的就是bridge)
[root@docker ~]# docker network create my_net 67e29f0e4a77c79144efc337a081a889188b5b8e289968f22be6e4ddd9b80610 [root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 5133ec415c3c bridge bridge local f359ca4e2d39 host host local 67e29f0e4a77 my_net bridge local 8d68673c045c none null local利用--network啟動(dòng)容器提供服務(wù):
[root@docker ~]# docker run -d --name=php --network my_net --network-alias php -v /www:/usr/local/nginx/html php 6b493cbe8207dee4cb4d5945cfce305dba96914083bd7f46841b0b42376bcb99 [root@docker ~]# docker run -d --name=nginx --network my_net --network-alias nginx -v /www:/usr/local/nginx/html -p 80:80 nginx 5ab220196b52bb768bef508433f0b920eecee70c3ee47880ebc5e2a74b5ee254通過(guò)選項(xiàng)--network-alias將取名的my_net起了一個(gè)別名
[root@docker ~]# docker exec -it nginx ping php PING php (172.18.0.2) 56(84) bytes of data. 64 bytes from php.my_net (172.18.0.2): icmp_seq=1 ttl=64 time=0.079 ms 64 bytes from php.my_net (172.18.0.2): icmp_seq=2 ttl=64 time=0.090 ms這里為啥能夠ping通過(guò)php這個(gè)容器呢,因?yàn)檫@兩個(gè)容器在同一個(gè)網(wǎng)絡(luò)m'y_net內(nèi),而nginx里面ping的php是容器名(這里管理的是容器級(jí)別)
由于能夠ping通php,所以在nginx中配置的:
server {listen 80;root /usr/local/nginx/html;index index.htm index.html index.php;location ~ \.php$ {root /usr/local/nginx/html;fastcgi_pass php:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;} }所以配置文件中的php不會(huì)導(dǎo)致nginx啟動(dòng)失敗,通過(guò)network的driver bridge實(shí)現(xiàn)了容器間的訪問(wèn)
?
上面在容器啟動(dòng)的時(shí)候使用的是選項(xiàng)--network,而在compose的配置文件中則是networks,現(xiàn)在通過(guò)配置文件來(lái)進(jìn)行闡述該參數(shù)的作用:
[root@docker lnmp]# cat lnmp.yml version: '3' services:nginx:image: nginxcontainer_name: lnmp-nginxdepends_on:- phpports:- "80:80"networks:- "net1"volumes:- "/www:/usr/local/nginx/html"php:image: phpcontainer_name: lnmp-phpexpose: - "9000"networks:- "net1"volumes:- "/www:/usr/local/nginx/html"networks:net1:driver: bridge由上述文件中可以知道networks定義了一個(gè)名稱(chēng)為net1的網(wǎng)絡(luò),由于networks是top-level(頂層級(jí)別,所以需要在頂層設(shè)置),而在創(chuàng)建的網(wǎng)絡(luò)時(shí)候需要指定driver(單一網(wǎng)絡(luò)使用bridge,swarm集群使用overlay),而且driver內(nèi)容不能省略,在nginx和php兩個(gè)service中使用了同一網(wǎng)絡(luò)net1,現(xiàn)在將服務(wù)啟動(dòng):
[root@docker lnmp]# docker-compose -f lnmp.yml up Creating network "lnmp_net1" with driver "bridge" Creating lnmp-php ... Creating lnmp-php ... done Creating lnmp-nginx ... Creating lnmp-nginx ... done Attaching to lnmp-php, lnmp-nginx可以看出在啟動(dòng)服務(wù)的時(shí)候創(chuàng)建了服務(wù)級(jí)別的網(wǎng)絡(luò)lnmp_net1
[root@docker lnmp]# docker network ls NETWORK ID NAME DRIVER SCOPE 5133ec415c3c bridge bridge local f359ca4e2d39 host host local 29d798852b52 lnmp_net1 bridge local 67e29f0e4a77 my_net bridge local 8d68673c045c none null local服務(wù)nginx和php在網(wǎng)絡(luò)lnmp_net1實(shí)現(xiàn)了互聯(lián)通信
[root@docker lnmp]# docker-compose -f lnmp.yml exec nginx ping php PING php (172.19.0.2) 56(84) bytes of data. 64 bytes from lnmp-php.lnmp_net1 (172.19.0.2): icmp_seq=1 ttl=64 time=0.060 ms在nginx服務(wù)中能夠訪問(wèn)php的服務(wù),在compose編排中級(jí)別的訪問(wèn)是對(duì)service級(jí)別的訪問(wèn),所以在nginx服務(wù)配置文件中對(duì)應(yīng)的php能夠?qū)崿F(xiàn),不會(huì)導(dǎo)致nginx啟動(dòng)失敗
及在compose的配置文件設(shè)置并對(duì)應(yīng)的是service級(jí)別,當(dāng)使用參數(shù)links也是配置的php服務(wù),使得nginx服務(wù)能夠ping通php服務(wù)并實(shí)現(xiàn)訪問(wèn)通信
[root@docker lnmp]# cat lnmp.yml version: '3' services:nginx:image: nginxcontainer_name: lnmp-nginxdepends_on:- phpports:- "80:80"links:- php:phpvolumes:- "/www:/usr/local/nginx/html"php:image: phpcontainer_name: lnmp-phpexpose: - "9000"volumes:- "/www:/usr/local/nginx/html"將networks參數(shù)改為了links參數(shù),使得兩個(gè)服務(wù)能夠繼續(xù)互聯(lián)訪問(wèn)
[root@docker lnmp]# docker-compose -f lnmp.yml up Creating network "lnmp_default" with the default driver Creating lnmp-php ... Creating lnmp-php ... done Creating lnmp-nginx ... Creating lnmp-nginx ... done Attaching to lnmp-php, lnmp-nginx而且啟動(dòng)的時(shí)候創(chuàng)建的默認(rèn)的網(wǎng)絡(luò)
[root@docker lnmp]# docker-compose -f lnmp.yml exec nginx ping php PING php (172.19.0.2) 56(84) bytes of data. 64 bytes from lnmp-php.lnmp_default (172.19.0.2): icmp_seq=1 ttl=64 time=0.091 ms 64 bytes from lnmp-php.lnmp_default (172.19.0.2): icmp_seq=2 ttl=64 time=0.107 ms--links也是能夠使得服務(wù)間進(jìn)行訪問(wèn)的
?
現(xiàn)在通過(guò)案例講解參數(shù)external_links的作用:external_links類(lèi)似于links針對(duì)的也是service級(jí)別,但是external_links對(duì)應(yīng)的是外部的service而不是同一compose配置文件中的service
[root@docker lnmp]# cat lnmp.yml version: '3' services:nginx:image: nginxcontainer_name: lnmp-nginxdepends_on:- phpports:- "80:80"networks:- "net1"volumes:- "/www:/usr/local/nginx/html"external_links:- php1:phpphp:image: phpcontainer_name: lnmp-phpexpose: - "9000"networks:- "net1"volumes:- "/www:/usr/local/nginx/html"networks:net1:driver: bridge上面可以看見(jiàn)external_links配置了php1的服務(wù),并且將php1的服務(wù)也取別名為了php,然后編寫(xiě)另一個(gè)compose配置文件,并配置服務(wù)名為php1的服務(wù):
[root@docker lnmp]# cat php1.yml version: '3' services:php1:image: phpcontainer_name: lnmp-php1expose: - "9000"networks:- "net1"volumes:- "/www:/usr/local/nginx/html"networks:net1:driver: bridge結(jié)合兩個(gè)compose配置文件,可以知道有nginx、php、php1的服務(wù),并且php1的服務(wù)也有php的別名,現(xiàn)在依次開(kāi)啟php1,和nginx與php:
[root@docker lnmp]# docker-compose -f php1.yml up Creating network "lnmp_net1" with driver "bridge" Creating lnmp-php1 ... Creating lnmp-php1 ... done Attaching to lnmp-php1 [root@docker lnmp]# docker-compose -f lnmp.yml up --build WARNING: Found orphan containers (lnmp-php1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. Creating lnmp-php ... Creating lnmp-php ... done Creating lnmp-nginx ... Creating lnmp-nginx ... done Attaching to lnmp-php, lnmp-nginx查看啟動(dòng)的容器狀態(tài):
[root@docker www]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a089cd261279 nginx "/usr/local/nginx/..." 25 seconds ago Up 25 seconds 0.0.0.0:80->80/tcp lnmp-nginx 4ff4bf7c1bf9 php "/usr/local/php/sb..." 25 seconds ago Up 25 seconds 9000/tcp lnmp-php 4e39cdf62bf1 php "/usr/local/php/sb..." 51 seconds ago Up 51 seconds 9000/tcp lnmp-php1現(xiàn)在將nginx一起的php的這個(gè)服務(wù)停止掉,看下nginx服務(wù)是否將會(huì)被停止:
[root@docker lnmp]# docker-compose -f lnmp.yml stop php Stopping lnmp-php ... done而在nginx這里的輸出如下:
lnmp-php exited with code 0 [root@docker www]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a089cd261279 nginx "/usr/local/nginx/..." 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp lnmp-nginx 4ff4bf7c1bf9 php "/usr/local/php/sb..." 2 minutes ago Exited (0) 52 seconds ago lnmp-php而php服務(wù)對(duì)應(yīng)的容器lnmp-php也停止了,但是nginx的服務(wù)卻沒(méi)有停止,為什么呢?那是因?yàn)閜hp1的服務(wù)并沒(méi)有停止,而php1的服務(wù)也是別名php服務(wù)的,而external_links就是實(shí)現(xiàn)這種情況的
使一個(gè)compose中的服務(wù)能與另一個(gè)compose中的服務(wù)能夠互聯(lián)通信,compose就是service級(jí)別的實(shí)現(xiàn),配置文件中對(duì)應(yīng)的都是service級(jí)別,而不是容器名
而在另一個(gè)compose中也必須定義與之相同的網(wǎng)絡(luò)名稱(chēng),也就是說(shuō)配置external_links時(shí),兩者服務(wù)間的網(wǎng)絡(luò)名稱(chēng)必須一致,不然依舊不能進(jìn)行互相訪問(wèn)
當(dāng)使用了external_links時(shí),必須啟動(dòng)另一個(gè)compose的service,如果僅僅啟動(dòng)的是包含此函數(shù)的compose那么service將會(huì)啟動(dòng)報(bào)錯(cuò)
[root@docker lnmp]# cat lnmp.yml_external_links version: '3' services:nginx:image: nginxcontainer_name: lnmp-nginxdepends_on:- phpports:- "80:80"networks:- "net1"volumes:- "/www:/usr/local/nginx/html"external_links:- php1:phpphp:image: phpcontainer_name: lnmp-phpexpose: - "9000"networks:- "net1"volumes:- "/www:/usr/local/nginx/html"networks:net1:driver: bridge [root@docker lnmp]# docker-compose -f lnmp.yml up --build Creating network "lnmp_net1" with driver "bridge" Creating lnmp-php ... Creating lnmp-php ... done Creating lnmp-nginx ... Creating lnmp-nginx ... done Attaching to lnmp-php, lnmp-nginx lnmp-nginx | nginx: [emerg] host not found in upstream "php" in /usr/local/nginx/conf/vhost/www.conf:7 lnmp-nginx exited with code 1參數(shù)external_links連接的外部php服務(wù)并沒(méi)有啟動(dòng),所以nginx還是啟動(dòng)報(bào)錯(cuò)
總結(jié)
以上是生活随笔為你收集整理的docker network基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Dockerfile构建MySQL
- 下一篇: docker-compose初试及命令基