濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 詳解Docker 端口映射與容器互聯(lián)

詳解Docker 端口映射與容器互聯(lián)

熱門(mén)標(biāo)簽:電銷機(jī)器人價(jià)值 外呼系統(tǒng)坐席費(fèi)計(jì)入會(huì)計(jì)哪個(gè)科目 大連400電話如何申請(qǐng) 撫順地圖標(biāo)注 達(dá)亞電銷機(jī)器人官網(wǎng) 新余高德地圖標(biāo)注怎么修改 電銷機(jī)器人怎么接線路 高德地圖標(biāo)注好做嗎 如何分析地圖標(biāo)注

1、端口映射實(shí)現(xiàn)訪問(wèn)容器

1.從外部訪問(wèn)容器應(yīng)用

在啟動(dòng)容器的時(shí)候,如果不指定對(duì)應(yīng)的參數(shù),在容器外部是無(wú)法通過(guò)網(wǎng)絡(luò)來(lái)訪問(wèn)容器內(nèi)部的網(wǎng)絡(luò)應(yīng)用和服務(wù)的。

當(dāng)容器中運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部訪問(wèn)這些應(yīng)用時(shí),可以通過(guò)-p或-P參數(shù)來(lái)指定端口映射。當(dāng)使用-P(大寫(xiě)P)標(biāo)記時(shí),Docker會(huì)隨機(jī)映射一個(gè)端口到內(nèi)部容器開(kāi)放的網(wǎng)絡(luò)端口(端口范圍在Linux系統(tǒng)使用的端口之外,一般都過(guò)萬(wàn)):

[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 ~]#

通過(guò)docker ps可以看到nginx_1容器的80端口被映射到本機(jī)的32768端口上。訪問(wèn)宿主主機(jī)的32768端口就可以訪問(wèn)容器內(nèi)的應(yīng)用程序提供的Web界面:

同樣,可以通過(guò)docker logs命令查看應(yīng)用信息:

[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(小寫(xiě)p)可以指定要映射的端口,并且在一個(gè)指定的端口上只可以綁定一個(gè)容器。支持的格式有: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 ~]# 

此時(shí)默認(rèn)會(huì)綁定本地所有接口上的所有地址。多次使用-p參數(shù)可以綁定多個(gè)端口:

[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格式指定映射使用一個(gè)特定地址:

[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格式綁定本機(jī)的任意端口到容器的指定端口:

[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 ~]# 

容器啟動(dòng)后,本機(jī)會(huì)隨機(jī)自動(dòng)分配一個(gè)未被占用的端口。

 5.查看映射端口配置

使用docker port命令來(lái)查看當(dāng)前映射的端口配置,也可以查看綁定的地址

[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 ~]#

注意:

容器有自己的內(nèi)部網(wǎng)絡(luò)和IP地址,使用docker inspect +容器ID可以獲取容器的具體信息。

2、互聯(lián)機(jī)制實(shí)現(xiàn)便捷訪問(wèn)

容器的互聯(lián)是一種讓多個(gè)容器中應(yīng)用進(jìn)行快速交互的方式,它會(huì)在源和接收容器之間建立連接關(guān)系,接收容器可以通過(guò)容器名快速訪問(wèn)到源容器,而不用指定具體的IP地址。

1.自定義容器命名

連接系統(tǒng)依據(jù)容器的名稱來(lái)執(zhí)行。因此,首先要給容器定義一個(gè)簡(jiǎn)單好記的名字。在容器創(chuàng)建的時(shí)候,系統(tǒng)會(huì)隨機(jī)創(chuàng)建一個(gè)容器名,但是并沒(méi)有特殊的意義也不便于記憶,所有自定義容器名有一下亮點(diǎn)好處:

1.自定義的命名比較好記,比如一個(gè)Web應(yīng)用容器,就可以起名web,既方便記憶也方便理解容器的作用;
2.當(dāng)要連接其他容器時(shí),即使重啟,也可以使用自定義的容器名,,比如web容器連接到db容器。

使用--name參數(shù)可以為容器自定義命名:

[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 ~]# 

通過(guò)docker ps或者docker ps -a可以查看到容器的自定義名字,利用docker inspect也可以獲取到容器自定義名字:

[root@docker ~]# docker inspect -f "{{.Name}}" 4d58a9f6f324
/centos_1
[root@docker ~]#

注意:

容器的名稱是唯一的。如果已經(jīng)命名了一個(gè)web的容器,當(dāng)再次使用web這個(gè)命名的時(shí)候會(huì)報(bào)錯(cuò),如果一定要使用,需要先用docker rm刪除之前創(chuàng)建的web容器。

在執(zhí)行docker run的時(shí)候如果添加--rm參數(shù),則容器終止后會(huì)立刻刪除。--rm參數(shù)和-d參數(shù)不能同時(shí)使用。

2、容器互聯(lián)

使用--link參數(shù)可以讓容器之間安全地進(jìn)行交互。

創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)容器:

[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 ~]#

創(chuàng)建一個(gè)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 ~]# 

此時(shí)web容器已經(jīng)和db容器建立互聯(lián)關(guān)系:--link參數(shù)的格式為:--link name:alias,其中name是要連接的容器名稱,alias是這個(gè)連接的別名。

Docker相當(dāng)于在兩個(gè)互聯(lián)的容器之間創(chuàng)建了一個(gè)虛擬通道,而不用映射它們的端口到宿主機(jī)上。在啟動(dòng)db容器的時(shí)候并沒(méi)有使用-p或者-P參數(shù),從而避免了暴露數(shù)據(jù)庫(kù)服務(wù)端口到外部網(wǎng)絡(luò)上。

Docker通過(guò)兩種方式為容器公開(kāi)連接信息:

1.更新環(huán)境變量;
2.更新/etc/hosts文件。

使用env命令來(lái)查看web容器的環(huán)境變量:

[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_開(kāi)頭的環(huán)境變量是提供web容器連接db容器使用的,前綴采用大寫(xiě)的連接別名。

除了環(huán)境變量之外,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:/#

這里有兩個(gè)hosts信息,第一個(gè)是db容器的IP和容器名+容器ID,第二個(gè)是web自己的IP和容器ID,web容器中hosts文件采用容器的ID作為主機(jī)名。

互聯(lián)的容器之間是可以ping通的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:湖南 南通 楊凌 遼源 黃石 海東 新鄉(xiāng) 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解Docker 端口映射與容器互聯(lián)》,本文關(guān)鍵詞  詳解,Docker,端口,映射,與,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解Docker 端口映射與容器互聯(lián)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于詳解Docker 端口映射與容器互聯(lián)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    肃宁县| 甘德县| 赤壁市| 宁强县| 甘肃省| 渭南市| 华宁县| 遂溪县| 宁安市| 平谷区| 新龙县| 宜宾市| 洞头县| 二连浩特市| 滨海县| 奉节县| 桦川县| 焉耆| 长葛市| 吉木萨尔县| 旺苍县| 交城县| 万安县| 荥经县| 黔东| 闻喜县| 孟连| 海宁市| 宝坻区| 广河县| 清涧县| 禹城市| 嘉荫县| 民丰县| 海口市| 大丰市| 丰原市| 阳朔县| 阜城县| 鄱阳县| 洛浦县|