容器互联

除了端口映射之外,容器互联是另一种跟容器应用交互的方式。它会在源容器和接收容器之间建立一个隧道,接收容器可以看到源容器指定的信息。

要实现容器互联,需要为容器指定一个好听的名字,通过--name来制定,若不指定,docker会随机生成一个容器的名称,但这不利于记忆。

$ docker run -d myfirstapp python app.py
95d21066a81ad3631c4ce0bcbbab867bf46ac7304034b608221bf623f8a1246a
$ docker run -d --name myfirst myfirstapp python app.py ##为容器指定名字
fe7b63a08819f92b8ddb6d66b26bbe77d20ae3a88ae01a03dc99d4e0a70d9f0c
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fe7b63a08819        myfirstapp          "python app.py"     3 seconds ago       Up 3 seconds        80/tcp              myfirst
95d21066a81a        myfirstapp          "python app.py"     19 seconds ago      Up 18 seconds       80/tcp              trusting_edison

docker inspect可以查看容器的详细信息。查看容器名称可以使用:

$ docker inspect -f "{{.Name}}" myfirst
/myfirst

不指定-f "{{.Name}}"则会显示所有的信息:docker inspect myfirst
若一个容器是临时的,运行完成之后要自动删除,需要加上--rm标记。

容器互联:使用--link参数,可以让容器之间安全的进行交互

a、下载postgres镜像

$ docker pull postgres:9.4

b、新建一个数据库容器

$ docker run -d --name mydb postgres:9.4

c、新建一个web容器和postgres容器互联

$ docker run -d -P --name myweb --link mydb:db myfirstapp python app.py

--link表示建立容器互联,参数为name:alias,name是要链接的容器名称,alias是我们取得别名

d、查看新建的容器

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
e993cc312bb2        myfirstapp          "python app.py"          3 seconds ago       Up 2 seconds        0.0.0.0:32774->80/tcp   myweb
ee203462405d        postgres:9.4        "docker-entrypoint..."   16 seconds ago      Up 15 seconds       5432/tcp                mydb

通过--link的方式,是myweb和mydb建立了链接,我们可以查看下web容器的环境变量

$ docker run --rm --name myweb2 --link mydb:db myfirstapp env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=18fb6fd9da67
DB_PORT=tcp://172.17.0.2:5432
DB_PORT_5432_TCP=tcp://172.17.0.2:5432
DB_PORT_5432_TCP_ADDR=172.17.0.2
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/myweb2/db
DB_ENV_GOSU_VERSION=1.10
DB_ENV_LANG=en_US.utf8
DB_ENV_PG_MAJOR=9.4
DB_ENV_PG_VERSION=9.4.17-1.pgdg80+1
DB_ENV_PGDATA=/var/lib/postgresql/data
LANG=C.UTF-8
GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
PYTHON_VERSION=3.6.4
PYTHON_PIP_VERSION=9.0.3
NAME=HELLO
HOME=/root

可以看到环境变量中以要链接的容器的名字的别名的大写作为前缀,和mydb建立连接之后,除了myweb容器环境变量发生了变化,在myweb容器的hosts文件也发生了变化,我们可以看下

$ docker run -it --rm --link mydb:db myfirstapp /bin/bash
$ cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    db ee203462405d mydb ####mydb ip
172.17.0.4    a378870c0316  ####myweb ip

这里面有两个ip,一个是web的,一个是db的,我们可以用ping命令查看这个两个ip之间能否ping通

$ ping db
PING db (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.229 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.089 ms
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.089/0.159/0.229/0.070 ms

$ ping mydb
PING db (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.138 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.089 ms
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.089/0.114/0.138/0.025 ms

$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.146 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.086 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.087 ms
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.086/0.106/0.146/0.028 ms

建立链接没问题!
我们启动mydb容器的时候,没有通过-p指定端口,避免了数据库端口暴露在外部网络,这样很安全。

原文地址:https://www.cnblogs.com/linjiqin/p/8678959.html