Linking Containers Together

Docker container中services/applications與主機或者其它containers之間通訊的兩種方式python

  • port mapping(端口映射)git

  • container linking(容器鏈接)web

Connect using Network port mapping

使用端口映射來鏈接docker

經常使用的命令(以training/webapp爲例):shell

docker run -d -P traning/webapp ...
docker run -d -p traning/webapp ...

-Pflag

  • 當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端口

-pflag

能夠指定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參數使用的次數不少,主要用來配置多個端口

Connect with the linking system

Docker有自帶的linking system用來鏈接多個container,而且容許從一個container發送信息到另外一個。發送信息的稱爲source container,接收信息的稱爲recipient container,recipient container智能看到一些通過篩選的關於source container的某些信息

The importance of naming

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,那隻能把原來的webcontainer刪除(docker rm [-f])。另外,docker run --rm --name..會在容器中止運行後當即刪除

Communication across links

經過鏈接通訊

links容許容器發現對方而且創建安全的信息傳輸通道,link建立好後容器間通訊的通道就創建好了。

注意事項:

  1. 須要運行的兩個容器不能重名

  2. 不能和其它已經存在的(無論有沒有運行)容器重名

  3. docker ps -a查看全部容器的信息

  4. 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 the db container web/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:dbweb容器被連接到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建立的這些變量有助於咱們用來鏈接和配置源容器裏的工具,好比鏈接數據庫...

Updating the /etc/hosts file

更新/etc/hosts文件

這部分本身有不懂的地方,之後慢慢看吧。

總結

鏈接容器的兩種方法

-p-P標記

link system

  • 容器的命名是惟一的,不能重複。能夠更改容器的名字

    • 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]

都是我的理解,可能有錯誤,還請指正。

相關文章
相關標籤/搜索