容器互联
除了端口映射之外,容器互联是另一种跟容器应用交互的方式。它会在源容器和接收容器之间建立一个隧道,接收容器可以看到源容器指定的信息。
要实现容器互联,需要为容器指定一个好听的名字,通过--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指定端口,避免了数据库端口暴露在外部网络,这样很安全。