7.1 端口映射实现访问容器
7.1.1 从外部访问容器应用
在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个端口到内部容器开放的网络端口:
[[email protected] ~]# docker run -d -P training/webapp python app.py
f48059b82c2cbf0109e8a40a8bde1923b493469e643b7e5113ac2833ae1eca66
[[email protected] ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f48059b82c2c training/webapp "python app.py" 5 seconds ago Up 3 seconds 0.0.0.0:32777->5000/tcp affectionate_jepsen
此时,可以看到本地主机的32777被映射到容器的5000端口。访问宿主机的32777端口即可访问容器内web应用提供的界面。
[[email protected] ~]# curl http://192.168.161.128:32777
Hello world!
-p 可以指定要映射的端口,并且,在一个指定端口上至可以绑定一个容器。支持的格式有IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort。
[[email protected] ~]# docker run -d --name web02 -p 8089:5000 training/webapp python app.py
c776c888d1d7a27acc8d01686a15b96da1cd455a5e0d9a1b4571b17e68131828
[[email protected] ~]# docker run -d --name web01 -p 192.168.161.128:8088:5000 training/webapp python app.py
E036037074b5c25e813447ceabbfc84f7cc6efeca0a9cc627df7ebccda05f920
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c776c888d1d7 training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:8089->5000/tcp web02
e036037074b5 training/webapp "python app.py" 2 minutes ago Up 2 minutes 192.168.161.128:8088->5000/tcp web01
f48059b82c2c training/webapp "python app.py" 8 minutes ago Up 8 minutes 0.0.0.0:32777->5000/tcp affectionate_jepsen
[[email protected] ~]# curl http://192.168.161.128:8088
Hello world!
[[email protected] ~]# curl http://192.168.161.128:8089
Hello world!
7.1.2 映射所有接口地址
使用HostPort:ContainerPort格式将本地的5000端口映射到容器的5000端口,
[[email protected] ~]# docker run -d --name web04 -p 5000:5000 training/webapp python app.py
b7fb414302a3537032a01b1f5f6c4d45a2a14911fc97ff36b466cf242fe59650
此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口,
[[email protected] ~]# docker run -d --name web05 -p 5001:5000 -p 8090:80 training/webapp python app.py
0cf58b4564dbc23d92bb6e80c40e8b66f54856f0a78db00ba4f39a0189f56e75
7.1.3 映射到指定地址的指定端口
使用IP:HostPort:ContainerPort格式指定映射应用一个特定地址,比如localhost地址127.0.0.1:
[[email protected] ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
eb60a00dca4d17409a8366fb0d3d58412835dd1875e104b185e50366b87d17e4
[[email protected] ~]# curl http://192.168.161.128:5000
curl: (7) Failed connect to 192.168.161.128:5000; 拒绝连接
[[email protected] ~]# curl http://127.0.0.1:5000
Hello world!
7.1.4 映射到指定地址的任意端口
使用 IP::ContainerPort 绑定本地IP的任意端口到容器的5000端口。本地主机会自动分配一个端口。
[[email protected] ~]# docker run -d --name web1 -p 192.168.161.128::5000 training/webapp python app.py
56fda1da9d504b1f7ced696c38f66d75ccd7c23fa8732c3ff9485aa6f6ac0367
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56fda1da9d50 training/webapp "python app.py" 17 seconds ago Up 17 seconds 192.168.161.128:32768->5000/tcp web1
7.1.5 查看映射端口配置
使用docker port 命令来查看当前映射的端口配置。也可以查看到绑定的地址:
[[email protected] ~]# docker port 56
5000/tcp -> 192.168.161.128:32768
[[email protected] ~]# docker port f4
5000/tcp -> 0.0.0.0:32777
容器有自己的内部网络和IP地址,使用docker inspect +容器ID 可以获取容器的具体信息。
7.2 互联机制实现便捷互访
容器的互联(linking)是一种让多个容器中应用进行快速交互的方式。它会在源和接受容器之间创建连接关系,接受容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
7.2.1 自定义容器命名
虽然当创建容器的时候,系统默认会分配一个名字,但不容易记忆,因此需要我们使用--name 来自定义一个名字,而且重启后也不会发生改变。
[[email protected] ~]# docker run -d --name web -P training/webapp python app.py
5d8ccca093ff696b45ad139f47294b270034d02aeabb7709986513f423a03916
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d8ccca093ff training/webapp "python app.py" 2 seconds ago Up 1 second 0.0.0.0:32778->5000/tcp web
容器的名称是唯一的。
[[email protected] ~]# docker run --name web01 --rm -P training/webapp python app.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
使用docker inspect 查看容器的名字:
[[email protected] ~]# docker inspect -f "{{.Name}}" web
/web
在执行docker run 的时候如果使用--rm参数。则容器在终止后立刻删除。--rm与-d参数不能同时使用。
7.2.2 容器互联
使用--link参数可以让容器之间安全地进行交互。
创建一个DB容器
[[email protected] ~]# docker run -d --name db training/postgres
77a70288dfe54528134c44dbfe6d076f4bacb4969d510d077dcf483c6647be0a
创建一个WEB容器,并将它连接到DB容器
[[email protected] ~]# docker run -d -P --name web --link db:db training/webapp python app.py
5623902d6820fe2e7880bf0a6c2a2849633c6eaccd9b5d22891985e27b089850
[[email protected] ~]# docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5623902d6820fe2e7880bf0a6c2a2849633c6eaccd9b5d22891985e27b089850 training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:32780->5000/tcp web
77a70288dfe54528134c44dbfe6d076f4bacb4969d510d077dcf483c6647be0a training/postgres "su postgres -c ‘/usr/lib/postgresql/$PG_VERSION/bin/postgres -D /var/lib/postgresql/$PG_VERSION/main/ -c config_file=/etc/postgresql/$PG_VERSION/main/postgresql.conf‘" 3 minutes ago Up 3 minutes 5432/tcp db,web/db
--link参数的格式为--link name:alias ,其中name是要连接的容器名称,alias是这个容器连接的别名。
可以看到两个容器db和web,db容器的name列有db也有web/db。这表示web容器连接到db容器,这允许web容器访问db容器的信息。
Docker相当于在两个互联的容器之间创建了一个虚拟通道,而且不用映射它们的端口到宿主机主机上。在启动DB容器的时候并没有使用-p或-P标记,从而避免了暴露数据库服务端口到外部网络上。
Docker通过两种方式为容器公开连接信息:
□ 更新环境变量;
□ 更新/etc/hosts文件。
使用env命令来查看web容器的环境变量
[[email protected] ~]# docker run --rm --name web02 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=71ee2c52219b
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=/web02/db
DB_ENV_PG_VERSION=9.3
HOME=/root
#--rm 参数在命令env执行完之后,马上会停止,退出,删除容器。
其中DB_开头的环境变量提供Web容器连接DB容器使用,前缀采用大写的连接别名。
除了环境变量之外,Docker 还添加host信息到父容器的/etc/hosts文件。
[[email protected] ~]# docker run -it --rm --link db:db training/webapp /bin/bash
[email protected]:/opt/webapp# 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 77a70288dfe5
172.17.0.4 7504aee7305c
这里面两个hosts信息,第一个是web容器,web容器用主机的id作为默认主机名,第二个是db容器的IP和主机名。可以在web容器中用ping命令来测试与db容器的连通:
[email protected]:/opt/webapp# 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.421 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.271 ms
用户可以连接多个子容器到父容器,比如可以连接多个web到同一个db容器上。
原文地址:https://www.cnblogs.com/lingxiaolong/p/9209265.html