您好,登錄后才能下訂單哦!
本篇內容主要講解“Docker端口映射與容器互聯怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker端口映射與容器互聯怎么實現”吧!
1、端口映射實現訪問容器
1.從外部訪問容器應用
在啟動容器的時候,如果不指定對應的參數,在容器外部是無法通過網絡來訪問容器內部的網絡應用和服務的。
當容器中運行一些網絡應用,要讓外部訪問這些應用時,可以通過-p或-p參數來指定端口映射。當使用-p(大寫p)標記時,docker會隨機映射一個端口到內部容器開放的網絡端口(端口范圍在linux系統使用的端口之外,一般都過萬):
[root@docker ~]# docker run -d --name nginx_1 -p nginx:latest f769af3e98478b27b87e008f3ad785e2055da4047442c4a8dcb8f621f810dbea [root@docker ~]# docker ps container id image command created status ports names f769af3e9847 nginx:latest "nginx -g 'daemon ..." 3 seconds ago up 2 seconds 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
通過docker ps可以看到nginx_1容器的80端口被映射到本機的32768端口上。訪問宿主主機的32768端口就可以訪問容器內的應用程序提供的web界面:
同樣,可以通過docker logs命令查看應用信息:
[root@docker ~]# docker logs nginx_1 10.0.0.253 - - [29/nov/2017:06:25:38 +0000] "get / http/1.1" 200 612 "-" "mozilla/5.0 (windows nt 6.1; win64; x64; rv:57.0) gecko/20100101 firefox/57.0" "-" 10.0.0.253 - - [29/nov/2017:06:25:39 +0000] "get /favicon.ico http/1.1" 404 169 "-" "mozilla/5.0 (windows nt 6.1; win64; x64; rv:57.0) gecko/20100101 firefox/57.0" "-" 2017/11/29 06:25:39 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: no such file or directory), client: 10.0.0.253, server: localhost, request: "get /favicon.ico http/1.1", host: "10.0.0.31:32768" 10.0.0.253 - - [29/nov/2017:06:25:39 +0000] "get /favicon.ico http/1.1" 404 169 "-" "mozilla/5.0 (windows nt 6.1; win64; x64; rv:57.0) gecko/20100101 firefox/57.0" "-" 2017/11/29 06:25:39 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: no such file or directory), client: 10.0.0.253, server: localhost, request: "get /favicon.ico http/1.1", host: "10.0.0.31:32768" 10.0.0.253 - - [29/nov/2017:06:26:55 +0000] "get / http/1.1" 200 612 "-" "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/61.0.3163.100 safari/537.36" "-" 10.0.0.253 - - [29/nov/2017:06:26:56 +0000] "get /favicon.ico http/1.1" 404 571 "http://10.0.0.31:32768/" "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/61.0.3163.100 safari/537.36" "-" 2017/11/29 06:26:56 [error] 5#5: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: no such file or directory), client: 10.0.0.253, server: localhost, request: "get /favicon.ico http/1.1", host: "10.0.0.31:32768", referrer: "http://10.0.0.31:32768/" [root@docker ~]#
-p(小寫p)可以指定要映射的端口,并且在一個指定的端口上只可以綁定一個容器。支持的格式有:ip:hostport:containerport | ip::containerport | hostport:containerport 。
2.映射所有接口地址
使用hostport:containerport格式將本地的5000端口映射到容器的5000端口:
[root@docker ~]# docker run -itd -p 5000:5000 --name nginx_2 nginx:latest 5bdca2bde33d7db72861399ca49e82f0d209d13289d20b181843da5b10e6f2d3 [root@docker ~]# docker ps container id image command created status ports names 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 8 seconds ago up 7 seconds 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 15 minutes ago up 15 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
此時默認會綁定本地所有接口上的所有地址。多次使用-p參數可以綁定多個端口:
[root@docker ~]# docker run -itd -p 3000:2700 -p 2389:8863 --name nginx_3 nginx:latest 65fbfbe9761eb5146501311016d681f210b1891ca5f5af62dc978ad6f2a22750 [root@docker ~]# docker ps container id image command created status ports names 65fbfbe9761e nginx:latest "nginx -g 'daemon ..." 3 seconds ago up 2 seconds 80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 2 minutes ago up 2 minutes 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 18 minutes ago up 18 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
3.映射到指定地址的指定端口
可以使用ip:hostport:containerport格式指定映射使用一個特定地址:
[root@docker ~]# docker run -itd -p 10.0.0.31:89:8081 --name nginx_4 nginx:latest 16a476837222d413926053e1c8175c993b0495732073fbc6251dfd4696db8242 [root@docker ~]# docker ps container id image command created status ports names 16a476837222 nginx:latest "nginx -g 'daemon ..." 4 seconds ago up 3 seconds 80/tcp, 10.0.0.31:89->8081/tcp nginx_4 65fbfbe9761e nginx:latest "nginx -g 'daemon ..." 2 minutes ago up 2 minutes 80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 5 minutes ago up 5 minutes 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 20 minutes ago up 20 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
4.映射到指定地址的任意端口
使用ip::containerport格式綁定本機的任意端口到容器的指定端口:
[root@docker ~]# docker run -itd -p 10.0.0.31::8082 --name nginx_5 nginx:latest 3436fd5fbdca6529c70c664f42edfd10d51edb0fb541b096b47c9b168887b2ca [root@docker ~]# docker ps container id image command created status ports names 3436fd5fbdca nginx:latest "nginx -g 'daemon ..." 2 seconds ago up 2 seconds 80/tcp, 10.0.0.31:32769->8082/tcp nginx_5 16a476837222 nginx:latest "nginx -g 'daemon ..." 2 minutes ago up 2 minutes 80/tcp, 10.0.0.31:89->8081/tcp nginx_4 65fbfbe9761e nginx:latest "nginx -g 'daemon ..." 4 minutes ago up 4 minutes 80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 7 minutes ago up 7 minutes 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 22 minutes ago up 22 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
容器啟動后,本機會隨機自動分配一個未被占用的端口。
5.查看映射端口配置
使用docker port命令來查看當前映射的端口配置,也可以查看綁定的地址
[root@docker ~]# docker port nginx_1 80/tcp -> 0.0.0.0:32768 [root@docker ~]# docker port nginx_2 5000/tcp -> 0.0.0.0:5000 [root@docker ~]# docker port nginx_3 2700/tcp -> 0.0.0.0:3000 8863/tcp -> 0.0.0.0:2389 [root@docker ~]# docker port nginx_4 8081/tcp -> 10.0.0.31:89 [root@docker ~]# docker port nginx_5 8082/tcp -> 10.0.0.31:32769 [root@docker ~]#
注意:
容器有自己的內部網絡和ip地址,使用docker inspect +容器id可以獲取容器的具體信息。
2、互聯機制實現便捷訪問
容器的互聯是一種讓多個容器中應用進行快速交互的方式,它會在源和接收容器之間建立連接關系,接收容器可以通過容器名快速訪問到源容器,而不用指定具體的ip地址。
1.自定義容器命名
連接系統依據容器的名稱來執行。因此,首先要給容器定義一個簡單好記的名字。在容器創建的時候,系統會隨機創建一個容器名,但是并沒有特殊的意義也不便于記憶,所有自定義容器名有一下亮點好處:
1.自定義的命名比較好記,比如一個web應用容器,就可以起名web,既方便記憶也方便理解容器的作用;
2.當要連接其他容器時,即使重啟,也可以使用自定義的容器名,,比如web容器連接到db容器。
使用--name參數可以為容器自定義命名:
[root@docker ~]# docker run -itd --name centos_1 centos:latest 4d58a9f6f324185caf53dbe5eaee85f35e853842ffb037cf272c2a92cee89716 [root@docker ~]# docker ps container id image command created status ports names 4d58a9f6f324 centos:latest "/bin/bash" 6 seconds ago up 5 seconds centos_1 3436fd5fbdca nginx:latest "nginx -g 'daemon ..." 11 minutes ago up 11 minutes 80/tcp, 10.0.0.31:32769->8082/tcp nginx_5 16a476837222 nginx:latest "nginx -g 'daemon ..." 13 minutes ago up 13 minutes 80/tcp, 10.0.0.31:89->8081/tcp nginx_4 65fbfbe9761e nginx:latest "nginx -g 'daemon ..." 15 minutes ago up 15 minutes 80/tcp, 0.0.0.0:3000->2700/tcp, 0.0.0.0:2389->8863/tcp nginx_3 5bdca2bde33d nginx:latest "nginx -g 'daemon ..." 18 minutes ago up 18 minutes 80/tcp, 0.0.0.0:5000->5000/tcp nginx_2 f769af3e9847 nginx:latest "nginx -g 'daemon ..." 34 minutes ago up 34 minutes 0.0.0.0:32768->80/tcp nginx_1 [root@docker ~]#
通過docker ps或者docker ps -a可以查看到容器的自定義名字,利用docker inspect也可以獲取到容器自定義名字:
[root@docker ~]# docker inspect -f "{{.name}}" 4d58a9f6f324 /centos_1 [root@docker ~]#
注意:
容器的名稱是唯一的。如果已經命名了一個web的容器,當再次使用web這個命名的時候會報錯,如果一定要使用,需要先用docker rm刪除之前創建的web容器。
在執行docker run的時候如果添加--rm參數,則容器終止后會立刻刪除。--rm參數和-d參數不能同時使用。
2、容器互聯
使用--link參數可以讓容器之間安全地進行交互。
創建一個數據庫容器:
[root@docker ~]# docker run -itd --name db --env mysql_root_password=example mariadb b239b124946c99b7da63e00c22df802e9612fbe8bc636389205baf6c2f6963bd [root@docker ~]# docker ps container id image command created status ports names b239b124946c mariadb "docker-entrypoint..." 3 seconds ago up 2 seconds 3306/tcp db [root@docker ~]#
創建一個web容器并將它連接到db容器:
[root@docker ~]# docker run -itd -p --name web --link db:db nginx:latest 42fa6662784010368b5e615d495e71920d85cc1bc089a5d181657514973ee90a [root@docker ~]# docker ps container id image command created status ports names 86ef0f632ffe nginx:latest "nginx -g 'daemon ..." 44 seconds ago up 43 seconds 80/tcp web b239b124946c mariadb "docker-entrypoint..." about a minute ago up 59 seconds 3306/tcp db [root@docker ~]#
此時web容器已經和db容器建立互聯關系:--link參數的格式為:--link name:alias,其中name是要連接的容器名稱,alias是這個連接的別名。
docker相當于在兩個互聯的容器之間創建了一個虛擬通道,而不用映射它們的端口到宿主機上。在啟動db容器的時候并沒有使用-p或者-p參數,從而避免了暴露數據庫服務端口到外部網絡上。
docker通過兩種方式為容器公開連接信息:
1.更新環境變量;
2.更新/etc/hosts文件。
使用env命令來查看web容器的環境變量:
[root@docker ~]# docker run --rm --name web3 --link db:db nginx:latest env path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin hostname=7258de738125 db_port=tcp://172.17.0.2:3306 db_port_3306_tcp=tcp://172.17.0.2:3306 db_port_3306_tcp_addr=172.17.0.2 db_port_3306_tcp_port=3306 db_port_3306_tcp_proto=tcp db_name=/web3/db db_env_mysql_root_password=example db_env_gosu_version=1.10 db_env_gpg_keys=199369e5404bd5fc7d2fe43bcbcb082a1bb943db 430bdf5c56e7c94e848ee60c1c4cbdcdcd2efd2a 4d1bb29d63d98e422b2113b19334a25f8507efa5 db_env_mariadb_major=10.2 db_env_mariadb_version=10.2.11+maria~jessie nginx_version=1.13.7-1~stretch njs_version=1.13.7.0.1.15-1~stretch home=/root [root@docker ~]#
其中db_開頭的環境變量是提供web容器連接db容器使用的,前綴采用大寫的連接別名。
除了環境變量之外,docker還添加host信息到父容器的/etc/hosts文件。
[root@docker ~]# docker run -it --rm --link db:db nginx:latest /bin/bash root@16b8e6fde27f:/# cat /etc/hosts 172.17.0.2 db b239b124946c 172.17.0.5 16b8e6fde27f root@16b8e6fde27f:/#
這里有兩個hosts信息,第一個是db容器的ip和容器名+容器id,第二個是web自己的ip和容器id,web容器中hosts文件采用容器的id作為主機名。互聯的容器之間是可以ping通的。
到此,相信大家對“Docker端口映射與容器互聯怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。