溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker容器互聯(lián)怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-13 14:31:45 來(lái)源:億速云 閱讀:164 作者:iii 欄目:云計(jì)算

本篇內(nèi)容介紹了“Docker容器互聯(lián)怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1. 掛載一個(gè)主機(jī)目錄作為數(shù)據(jù)卷

使用-v標(biāo)記也可以指定掛載一個(gè)本地主機(jī)的目錄到容器中去。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

上面的命令加載主機(jī)的/src/webapp目錄到容器的/opt/webapp目錄。這個(gè)功能在進(jìn)行測(cè)試的時(shí)候十分方便,比如用戶可以放置一些程序到本地目錄中,來(lái)查看容器是否正常工作。本地目錄的路徑必須是絕對(duì)路徑,如果目錄不存在 Docker 會(huì)自動(dòng)為你創(chuàng)建它。

*注意:Dockerfile 中不支持這種用法,這是因?yàn)?Dockerfile 是為了移植和分享用的。然而,不同操作系統(tǒng)的路徑格式不一樣,所以目前還不能支持。

Docker 掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫(xiě),用戶也可以通過(guò):ro指定為只讀。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py

加了:ro之后,就掛載為只讀了。

2. 數(shù)據(jù)卷容器

如果你有一些持續(xù)更新的數(shù)據(jù)需要在容器之間共享,最好創(chuàng)建數(shù)據(jù)卷容器。

數(shù)據(jù)卷容器,其實(shí)就是一個(gè)正常的容器,專門(mén)用來(lái)提供數(shù)據(jù)卷供其它容器掛載的。

首先,創(chuàng)建一個(gè)命名的數(shù)據(jù)卷容器 dbdata:

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

然后,在其他容器中使用--volumes-from來(lái)掛載 dbdata 容器中的數(shù)據(jù)卷。

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres

還可以使用多個(gè)--volumes-from參數(shù)來(lái)從多個(gè)容器掛載多個(gè)數(shù)據(jù)卷。 也可以從其他已經(jīng)掛載了容器卷的容器來(lái)掛載數(shù)據(jù)卷。

$ sudo docker run -d --name db3 --volumes-from db1 training/postgres

*注意:使用--volumes-from參數(shù)所掛載數(shù)據(jù)卷的容器自己并不需要保持在運(yùn)行狀態(tài)。

如果刪除了掛載的容器(包括 dbdata、db1 和 db2),數(shù)據(jù)卷并不會(huì)被自動(dòng)刪除。如果要?jiǎng)h除一個(gè)數(shù)據(jù)卷,必須在刪除最后一個(gè)還掛載著它的容器時(shí)使用docker rm -v命令來(lái)指定同時(shí)刪除關(guān)聯(lián)的容器。 這可以讓用戶在容器之間升級(jí)和移動(dòng)數(shù)據(jù)卷。

3. 外部訪問(wèn)容器

容器中可以運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部也可以訪問(wèn)這些應(yīng)用,可以通過(guò)-P或-p參數(shù)來(lái)指定端口映射。

當(dāng)使用 -P 標(biāo)記時(shí),Docker 會(huì)隨機(jī)映射一個(gè)49000~49900的端口到內(nèi)部容器開(kāi)放的網(wǎng)絡(luò)端口。

使用docker ps可以看到,本地主機(jī)的 49155 被映射到了容器的 5000 端口。此時(shí)訪問(wèn)本機(jī)的 49115 端口即可訪問(wèn)容器內(nèi) web 應(yīng)用提供的界面。

$ sudo docker run -d -P training/webapp python app.py
$ sudo docker ps -l
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

同樣的,可以通過(guò)docker logs命令來(lái)查看應(yīng)用的信息。

$ sudo docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

-p(小寫(xiě)的)則可以指定要映射的端口,并且,在一個(gè)指定端口上只可以綁定一個(gè)容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。

映射所有接口地址

使用hostPort:containerPort格式本地的 5000 端口映射到容器的 5000 端口,可以執(zhí)行

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

此時(shí)默認(rèn)會(huì)綁定本地所有接口上的所有地址。

映射到指定地址的指定端口

可以使用ip:hostPort:containerPort格式指定映射使用一個(gè)特定地址,比如 localhost 地址 127.0.0.1

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

映射到指定地址的任意端口

使用ip::containerPort綁定 localhost 的任意端口到容器的 5000 端口,本地主機(jī)會(huì)自動(dòng)分配一個(gè)端口。

$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

還可以使用 udp 標(biāo)記來(lái)指定 udp 端口

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

查看映射端口配置

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

$ docker port nostalgic_morse 5000
127.0.0.1:49155.

注意:

  • 容器有自己的內(nèi)部網(wǎng)絡(luò)和 ip 地址(使用docker inspect可以獲取所有的變量,Docker 還可以有一個(gè)可變的網(wǎng)絡(luò)配置。)

  • -p 標(biāo)記可以多次使用來(lái)綁定多個(gè)端口

例如

$ sudo docker run -d -p 5000:5000  -p 3000:80 training/webapp python app.py

4. 容器互聯(lián)

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

下面先創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)容器。

$ sudo docker run -d --name db training/postgres

刪除之前創(chuàng)建的 web 容器

$ docker rm -f web

然后創(chuàng)建一個(gè)新的 web 容器,并將它連接到 db 容器

$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

此時(shí),db 容器和 web 容器建立互聯(lián)關(guān)系。

--link參數(shù)的格式為--link name:alias,其中name是要鏈接的容器的名稱,alias是這個(gè)連接的別名。

使用docker ps來(lái)查看容器的連接

$ docker ps
CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES
349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db, web/db
aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  web

可以看到自定義命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。這表示 web 容器鏈接到 db 容器,web 容器將被允許訪問(wèn) db 容器的信息。

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

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

  • 環(huán)境變量

  • 更新/etc/hosts文件

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

$ sudo docker run --rm --name web2 --link db:db training/webapp env
. . .
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .

其中 DB_ 開(kāi)頭的環(huán)境變量是供 web 容器連接 db 容器使用,前綴采用大寫(xiě)的連接別名。

除了環(huán)境變量,Docker 還添加 host 信息到父容器的/etc/hosts的文件。下面是父容器 web 的 hosts 文件

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db

這里有 2 個(gè) hosts,第一個(gè)是 web 容器,web 容器用 id 作為他的主機(jī)名,第二個(gè)是 db 容器的 ip 和主機(jī)名。 可以在 web 容器中安裝 ping 命令來(lái)測(cè)試跟db容器的連通。

root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

用 ping 來(lái)測(cè)試db容器,它會(huì)解析成172.17.0.5。 *注意:官方的 ubuntu 鏡像默認(rèn)沒(méi)有安裝 ping,需要自行安裝。

用戶可以鏈接多個(gè)子容器到父容器,比如可以鏈接多個(gè) web 到 db 容器上。

“Docker容器互聯(lián)怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI