溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker容器互聯怎么實現

發布時間:2021-12-13 14:31:45 來源:億速云 閱讀:203 作者:iii 欄目:云計算

本篇內容介紹了“Docker容器互聯怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1. 掛載一個主機目錄作為數據卷

使用-v標記也可以指定掛載一個本地主機的目錄到容器中去。

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

上面的命令加載主機的/src/webapp目錄到容器的/opt/webapp目錄。這個功能在進行測試的時候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作。本地目錄的路徑必須是絕對路徑,如果目錄不存在 Docker 會自動為你創建它。

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

Docker 掛載數據卷的默認權限是讀寫,用戶也可以通過:ro指定為只讀。

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

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

2. 數據卷容器

如果你有一些持續更新的數據需要在容器之間共享,最好創建數據卷容器。

數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。

首先,創建一個命名的數據卷容器 dbdata:

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

然后,在其他容器中使用--volumes-from來掛載 dbdata 容器中的數據卷。

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

還可以使用多個--volumes-from參數來從多個容器掛載多個數據卷。 也可以從其他已經掛載了容器卷的容器來掛載數據卷。

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

*注意:使用--volumes-from參數所掛載數據卷的容器自己并不需要保持在運行狀態。

如果刪除了掛載的容器(包括 dbdata、db1 和 db2),數據卷并不會被自動刪除。如果要刪除一個數據卷,必須在刪除最后一個還掛載著它的容器時使用docker rm -v命令來指定同時刪除關聯的容器。 這可以讓用戶在容器之間升級和移動數據卷。

3. 外部訪問容器

容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過-P或-p參數來指定端口映射。

當使用 -P 標記時,Docker 會隨機映射一個49000~49900的端口到內部容器開放的網絡端口。

使用docker ps可以看到,本地主機的 49155 被映射到了容器的 5000 端口。此時訪問本機的 49115 端口即可訪問容器內 web 應用提供的界面。

$ 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

同樣的,可以通過docker logs命令來查看應用的信息。

$ 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(小寫的)則可以指定要映射的端口,并且,在一個指定端口上只可以綁定一個容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。

映射所有接口地址

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

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

此時默認會綁定本地所有接口上的所有地址。

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

可以使用ip:hostPort:containerPort格式指定映射使用一個特定地址,比如 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 端口,本地主機會自動分配一個端口。

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

還可以使用 udp 標記來指定 udp 端口

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

查看映射端口配置

使用docker port來查看當前映射的端口配置,也可以查看到綁定的地址

$ docker port nostalgic_morse 5000
127.0.0.1:49155.

注意:

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

  • -p 標記可以多次使用來綁定多個端口

例如

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

4. 容器互聯

使用--link參數可以讓容器之間安全的進行交互。

下面先創建一個新的數據庫容器。

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

刪除之前創建的 web 容器

$ docker rm -f web

然后創建一個新的 web 容器,并將它連接到 db 容器

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

此時,db 容器和 web 容器建立互聯關系。

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

使用docker ps來查看容器的連接

$ 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 容器將被允許訪問 db 容器的信息。

Docker 在兩個互聯的容器之間創建了一個安全隧道,而且不用映射它們的端口到宿主主機上。在啟動 db 容器的時候并沒有使用-p和-P標記,從而避免了暴露數據庫端口到外部網絡上。

Docker 通過 2 種方式為容器公開連接信息:

  • 環境變量

  • 更新/etc/hosts文件

使用env命令來查看 web 容器的環境變量

$ 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_ 開頭的環境變量是供 web 容器連接 db 容器使用,前綴采用大寫的連接別名。

除了環境變量,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 個 hosts,第一個是 web 容器,web 容器用 id 作為他的主機名,第二個是 db 容器的 ip 和主機名。 可以在 web 容器中安裝 ping 命令來測試跟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 來測試db容器,它會解析成172.17.0.5。 *注意:官方的 ubuntu 鏡像默認沒有安裝 ping,需要自行安裝。

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

“Docker容器互聯怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女