本篇內容介紹了“Docker容器互聯怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
使用-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之后,就掛載為只讀了。
如果你有一些持續更新的數據需要在容器之間共享,最好創建數據卷容器。
數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。
首先,創建一個命名的數據卷容器 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命令來指定同時刪除關聯的容器。 這可以讓用戶在容器之間升級和移動數據卷。
容器中可以運行一些網絡應用,要讓外部也可以訪問這些應用,可以通過-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
使用--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容器互聯怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。