Docker container中services/applications與主機或者其它containers之間通訊的兩種方式python
port mapping(端口映射)git
container linking(容器鏈接)web
使用端口映射來鏈接docker
經常使用的命令(以training/webapp
爲例):shell
docker run -d -P traning/webapp ... docker run -d -p traning/webapp ...
-P
flag當container被建立而且運行時,-P標記馬上生效數據庫
它container內部的任意端口映射到docker host的port編程
Docker host的port是隨機的ubuntu
它的生命力是短暫的(容器中止後端口映射就會失效)後端
e.g.安全
adolph@geek:~$ docker run -d -P training/webapp python app.py 3f30e81a01cdf9895a70828beebea32910f848ac00f92303e6af77faeee1db0a adolph@geek:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f30e81a01cd training/webapp:latest "python app.py" 8 seconds ago Up 8 seconds 0.0.0.0:32769->5000/tcp agitated_hawking
內部的5000端口映射到外部的主機的32769
端口
-p
flag能夠指定container內外的端口
內外的5000端口映射
docker run -d -p 5000:5000 training/webapp python app.py adolph@geek:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cf6bd021034d training/webapp:latest "python app.py" 4 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp compassionate_lalande
這樣作的很差的地方在於你只把congtainer內外的5000端口映射在一塊兒,container內的其它端口被拋棄了
映射到主機的××端口
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到主機的某個隨機端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
注意127.0.0.1:
有個冒號
-p參數使用的次數不少,主要用來配置多個端口
Docker有自帶的
linking system
用來鏈接多個container,而且容許從一個container發送信息到另外一個。發送信息的稱爲source container
,接收信息的稱爲recipient container
,recipient container智能看到一些通過篩選的關於source container的某些信息
Docker依賴於容器的名字來創建鏈接,Docker啓動容器時會自動給它起個名字,固然你也能夠本身命名
命名有兩個很是棒的好處:
告知container的做用或者屬於哪一種類型,如traning/webapp
能夠看出是webapp的container
方便Docker經過name指定container
在運行container時經過--name
標記來命名新的container
adolph@geek:~$ docker run -d -P --name web training/webapp python app.py 1be7fc1ca8f9b683a8c309a1f6315c65819db15e8105ddd1b198e50c4082842f adolph@geek:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1be7fc1ca8f9 training/webapp:latest "python app.py" 4 seconds ago Up 3 seconds 0.0.0.0:32770->5000/tcp web adolph@geek:~$ docker inspect -f "{{.Name}}" 1be7f /web
<span style="color:red;">注意:</span>container的name必須是惟一的,好比說剛纔的web
,若是你想給另外一個容器起名爲web
,那隻能把原來的web
container刪除(docker rm [-f])。另外,docker run --rm --name..
會在容器中止運行後當即刪除
經過鏈接通訊
links容許容器發現對方而且創建安全的信息傳輸通道,link建立好後容器間通訊的通道就創建好了。
注意事項:
須要運行的兩個容器不能重名
不能和其它已經存在的(無論有沒有運行)容器重名
docker ps -a
查看全部容器的信息
docker rm [container name]
刪除容器
link代碼
--link <name or id>:alias
name or id
指咱們要鏈接的container的名字
shell1的代碼(我在一個shell中運行這些命令總會有1個容器在啓動後就EXIT(0)
)
adolph@geek:~$ docker run -i -t --name db adolph/ubuntu:14.04 root@a1bb409128b9:/#
shell2
adolph@geek:~$ docker run -d -P --name web --link db:db training/webapp python app.py 09fed08b63e709e61d17f698ccec55a6d04ddb6e33c1aea3879f78d1970451ce adolph@geek:~$ docker inspect -f "{{.HostConfig.Links}}" web [/db:/web/db]
we can see that the
web
container is now linked to thedb
containerweb/db
. Which allows it to access information about the db container.
recipient container | source container |
---|---|
web | db |
爲了作到容器間的通訊,Docker沒有使用端口,而是本身創建了tunnel
(隧道),使用link
鏈接容器的好處是咱們不須要將source container
的端口暴露給網絡,Docker的tunnel使用兩種方式實現鏈接:
Environment variables(環境變量)
Updating the /etc/hosts file(更新/etc/hosts
文件)
當咱們鏈接容器是Docker會建立不少環境變量,而且它會在目標容器自動基於
--link
後面的參數建立環境變量。Docker會公開來自source container
的全部環境變量,這些變量包括:
the ENV commands in the source container's Dockerfile(源容器Dockerfile中的ENV
命令)
the -e
, --env
and --env-file
options on the docker run command when the source container is started(容器運行時run
後面的-e
, --env
和 --env-file
參數)
這些環境變量容許咱們經過編程從目標容器發現來自源容器的信息
警告:理解docker link鏈接容器的機制很重要,link容許全部目標容器得到源容器的指定數據和信息,因此從安全性的角度,不建議在源容器中存儲敏感的數據
<alias>_NAME
docker run -d -P --name web --link db:db training/webapp python app.py
這個變量是爲目標容器創建的,如上,--link db:db
後web
容器被連接到db
容器,這是Docker會在web
容器中建立DB_NAME=/web/db
<name>_PORT_<port>_<protocol>
Docker爲每個源容器暴露的每個端口。
<name>指--link中指定的目標容器的別名
<port>源容器暴露的端口號
<protocol> TCP或UDP
Docker使用不一樣的前綴格式來規定3種不一樣的環境變量:
prefix_ADDR
來自URL的ip地址。例如:WEBDB_PORT_8080_TCP_ADDR=172.17.0.82.
prefix_PORT
來自URL的端口。例如:WEBDB_PORT_8080_TCP_PORT=8080.
prefix_PROTO
來自URL的協議。例如:WEBDB_PORT_8080_TCP_PROTO=tcp.
每一組環境變量對應一個端口,若是容器公開多個端口(好比3個),Docker就會建立9個環境變量,每一個端口3個。
此外,Docker還會爲源容器
第一個公開的端口建立<alias>_PORT
,這裏的第一個
指的是具備lowest port
的端口。例如:WEBDB_PORT=tcp://172.17.0.82:8080
,若是它嗎知足tcp和udp,那指的是tcp
最後,Docker還會建立這樣一個變量:<alias>_ENV_<name>
,用來鏈接源容器和目標容器的橋樑。Docker使用這個值來啓動源容器。
e.g:
adolph@geek:~$ sudo docker run --rm --name web2 --link db:db training/webapp env [sudo] password for adolph: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=20fb0166d9c6 DB_NAME=/web2/db HOME=/
個人電腦上並無看到環境變量!可能由於個人db容器和官網例子上的容器不一直吧,並且個人db容器中並無安裝數據庫。
Docker建立的這些變量有助於咱們用來鏈接和配置源容器裏的工具,好比鏈接數據庫...
更新
/etc/hosts
文件
這部分本身有不懂的地方,之後慢慢看吧。
-p
,-P
標記容器的命名是惟一的,不能重複。能夠更改容器的名字
docker rename oldname newname
--link <name or id>:alias,name指要鏈接的容器,alais指目標容器/簡稱
可以清除代碼中那個是目標容器,哪一個是源容器,資源開放共享的方向
docker run -d -P --name web --link db:webdb training/webapp python app.py
這條命令中db
是要鏈接的容器,是源容器,web是目標容器,webdb是web的別稱
adolph@geek:~$ docker inspect -f "{{.HostConfig.Links}}" web [/db:/web/webdb]
都是我的理解,可能有錯誤,還請指正。