zl程序教程

您现在的位置是:首页 >  工具

当前栏目

容器互联详解架构师

容器 详解 架构师 互联
2023-06-13 09:20:20 时间

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

要实现容器互联,需要为容器指定一个好听的名字,通过 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指定端口,避免了数据库端口暴露在外部网络,这样很安全。

7063.html

架构架构师架构设计