容器互联详解架构师

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

要实现容器互联,需要为容器指定一个好听的名字,通过–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://blog.ytso.com/7063.html

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论