大量的互聯網應用服務包括多個服務組件,這每每須要多個容器之間經過網絡通訊進行相互配合。
Docker 目前提供了映射容器端口到宿主主機和容器互聯機制來爲容器提供網絡服務。
本文將講解如何使用Docker的網絡功能。包括使用端口映射機制來將容器內應用服務提供給外部網絡,以及經過容器互聯繫統讓多個容器之間進行快捷的網絡通訊。web
在啓動容器的時候,若是不指定對應參數,在容器外部是沒法經過網絡來訪問容器內的網絡應用和服務的。
當容器中運行一些網絡應用,要讓外部訪問這些應用時,能夠經過-P或-p參數來指定端口映射。當使用-P標記時,Docker會隨機映射一個49000~49900的端口至容器內部開放的網絡端口:sql
[root@gavin ~]# sudo docker run -d -P tomcat:latest afe8064a2e604ebd212ec2a620fde7d0c2f72b51d298066f3e4c454df1b74e6e [root@gavin ~]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afe8064a2e60 tomcat:latest "catalina.sh run" 13 seconds ago Up 12 seconds 0.0.0.0:32769->8080/tcp festive_panini
此時,可使用docker ps看到,本地主機的32769被映射到了容器的8080端口。
訪問宿主主機的32769端口便可訪問容器內Web應用提供的界面。docker
一樣,能夠經過docker logs命令來查看應用的信息:數據庫
[root@gavin ~]# sudo docker logs afe8 28-Aug-2019 14:18:27.546 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.5.45 28-Aug-2019 14:18:27.548 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Aug 14 2019 22:21:25 UTC 28-Aug-2019 14:18:27.548 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.5.45.0 28-Aug-2019 14:18:27.549 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux 28-Aug-2019 14:18:27.549 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 3.10.0-957.el7.x86_64 ...
-p(小寫的)則能夠指定要映射的端口,而且,在一個指定端口上只能夠綁定一個容器。支持的格式有ip:hostport:containerPort l ip::containerPort I hostPort:containerPort。apache
使用hostPort:containerPort格式將本地的8080端口映射到容器的8080端口,能夠執行以下命令:tomcat
[root@gavin ~]# sudo docker run -d -p 8080:8080 tomcat:latest b7b692ed0bc99bf73f68b92ddca20a1ae5ab510c42ae234f76a4b36093e1fd31 [root@gavin ~]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7b692ed0bc9 tomcat:latest "catalina.sh run" 9 seconds ago Up 8 seconds 0.0.0.0:8080->8080/tcp tender_wescoff
此時默認會綁定本地全部接口上的全部地址。屢次使用-p標記能夠綁定多個端口。
例如:安全
[root@gavin ~]# sudo docker run -d -p 8088:8088 -p 8099:8099 tomcat:latest c1629208e59a8953369b2229de6c352ae83faa00154c7acdb5178931e84bedce [root@gavin ~]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c1629208e59a tomcat:latest "catalina.sh run" 6 seconds ago Up 5 seconds 0.0.0.0:8088->8088/tcp, 8080/tcp, 0.0.0.0:8099->8099/tcp nervous_robinson
可使用ip:hostPort:containerPort格式指定映射使用一個特定地址,好比個人IP爲192.168.1.16:bash
[root@gavin ~]# sudo docker run -d -p 192.168.1.16:8081:8080 tomcat:latest 7f5eab8748fe3fcb0ffd3b2828928be05f8193d88ff80d2f88aee9ae262f6114 [root@gavin ~]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7f5eab8748fe tomcat:latest "catalina.sh run" 10 seconds ago Up 9 seconds 192.168.1.16:8081->8080/tcp stoic_robinson
使用ip::containerPort綁定192.168.1.16的任意端口到容器的8080端口,本地主機會自動分配一個端口:網絡
[root@gavin ~]# sudo docker run -d -p 192.168.1.16::8080 tomcat:latest 8108af81e853076df2a55d125b559476422df4d16c4560afd6439f51cb67bcfc [root@gavin ~]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8108af81e853 tomcat:latest "catalina.sh run" 7 seconds ago Up 6 seconds 192.168.1.16:32768->8080/tcp inspiring_zhukovsky
使用docker port來查看當前映射的端口配置,也能夠查看到綁定的地址:tcp
[root@gavin ~]# sudo docker port 8108 8080/tcp -> 192.168.1.16:32768
容器的鏈接(linking)系統是除了端口映射外另外一種能夠與容器中應用進行交互的方式。
它會在源和接收容器之間建立一個隧道,接收容器能夠看到源容器指定的信息。
鏈接系統依據容器的名稱來執行。所以,首先須要自定義一個好記的容器命名。
雖然當建立容器的時候,系統默認會分配一個名字,但自定義命名容器有兩個好處:
使用--name標記能夠爲容器自定義命名:
[root@gavin ~]# sudo docker run -d -P --name web tomcat:latest
47a03555a3aa0c4581df781f906baaa0e3c0b8fcc1ebc5764ad94eb0c14716a8
使用docker ps來驗證設定的命名
[root@gavin ~]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 47a03555a3aa tomcat:latest "catalina.sh run" 46 seconds ago Up 45 seconds 0.0.0.0:32770->8080/tcp web
使用--link參數可讓容器之間安全的進行交互。
下面先建立一個新的數據庫容器:
[root@gavin ~]# sudo docker run -d --name db postgres
刪除以前建立的web容器
[root@gavin ~]# sudo docker rm -f web
而後建立一個新的web容器,並將它鏈接到db容器:
[root@gavin ~]# sudo docker run -d -P --name web --link db:db tomcat:latest
此時,db容器和web容器創建互聯關係。
--link參數的格式爲--link name:alias,其中name是要連接的容器的名稱,alias是這個鏈接的別名。
使用docker ps查看容器的鏈接:
[root@gavin ~]# sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea74df6bc843 tomcat:latest "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:32774->8080/tcp web 44c6d026afe2 postgres "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp db
進入web容器中ping db容器:
[root@gavin ~]# sudo docker exec -ti web /bin/bash root@ea74df6bc843:/usr/local/tomcat# ping db PING db (172.17.0.7) 56(84) bytes of data. 64 bytes from db (172.17.0.7): icmp_seq=1 ttl=64 time=0.299 ms 64 bytes from db (172.17.0.7): icmp_seq=2 ttl=64 time=0.105 ms 64 bytes from db (172.17.0.7): icmp_seq=3 ttl=64 time=0.067 ms
能夠看到web容器能夠訪問到db容器。
Docker在兩個互聯的容器之間建立了一個安全隧道,並且不用映射它們的端口到宿主主機上。在啓動db容器的時候並無使用-p和-P標記,從而避免了暴露數據庫端口到外部網絡上。
Docker經過環境變量查看公開鏈接信息,使用env命令來查看web容器的環境變量:
[root@gavin ~]# sudo docker run --name web2 --link db:db tomcat:latest env ... DB_PORT=tcp://172.17.0.7:5432 DB_PORT_5432_TCP=tcp://172.17.0.7:5432 DB_PORT_5432_TCP_ADDR=172.17.0.7 DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_PROTO=tcp DB_NAME=/web2/db DB_ENV_GOSU_VERSION=1.11 DB_ENV_LANG=en_US.utf8 DB_ENV_PG_MAJOR=11 DB_ENV_PG_VERSION=11.5-1.pgdg90+1 DB_ENV_PGDATA=/var/lib/postgresql/data ...
其中DB開頭的環境變量是供web容器鏈接db容器使用,前綴採用大寫的鏈接別名。
用戶能夠連接多個子容器到父容器,好比能夠連接多個web到db容器上。
這篇文章是我學習 Docker 的記錄,內容參考自《Docker技術入門與實戰》