1、端口映射实现容器访问
1.1 从外部访问容器应用
启动容器时如果不指定对应的参数,容器是无法从外部网络来访问容器内的应用及服务的。在容器中运行一些网络应用,要让外部访问这些应用,可以通过-P或-p参数来指定端口映射。用-P时,会随机映射一个端口。
[root@study ~ 10:31:37]# docker run -dP training/webapp
[root@study ~ 10:32:13]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79bdebb04da9 training/webapp "python app.py" 27 seconds ago Up 26 seconds 0.0.0.0:32784->5000/tcp serene_yalow
可以看到本地的32784端口被映射到了容器的5000端口
通过宿主机的32784端口即可访问容器内web应用提供的界面。
-p(小写)可以指定端口,在一个指定端口上只可以绑定一个容器。支持的格式有:
IP:HostPort:ContainerPort |IP::ContainerPort |HostPort:ContainerPort
1.2 映射所有接口地址
使用"HostPort:ContainerPort"这种格式,将本地的5000端口映射到容器的5000端口。
[root@study ~ 10:32:16]# docker run -d -p 5000:5000 training/webapp
[root@study ~ 10:59:06]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b54e5ee69d5e training/webapp "python app.py" 4 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp pedantic_hawking
1.3 映射到指定地址的指定端口
使用"IP:HostPort:ContainerPort"这种格式,映射使用一个特定地址。例如localhost地址127.0.0.1
[root@study ~ 11:01:14]# docker run -d -p 127.0.0.1:5000:5000 training/webapp
e1200e4bb26179e7a6d77a0b53f9c2d066b37e78994024722e707a482a1bf5bf
[root@study ~ 11:01:17]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1200e4bb261 training/webapp "python app.py" 4 seconds ago Up 2 seconds 127.0.0.1:5000->5000/tcp blissful_hugle
1.4 映射到指定地址的任意端口
使用"IP::ContainerPort"这种格式,绑定localhost的任意端口到容器的5000端口。
[root@study ~ 11:01:20]# docker run -d -p 127.0.0.1::5000 training/webapp
dbca5fe5b4e7684060541b56e9d7522b7ca3227ba36d77c500eaed8bbdb8026c
[root@study ~ 11:02:38]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbca5fe5b4e7 training/webapp "python app.py" 4 seconds ago Up 2 seconds 127.0.0.1:32768->5000/tcp recursing_murdock
还可以使用udp标记来指定udp端口
[root@study ~ 11:02:41]# docker run -d -p 127.0.0.1::5000/udp training/webapp
5f09400160068e6fe852230b5f007d650c7274f40aafc2b960a5a1ebde9128f7
[root@study ~ 11:03:01]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f0940016006 training/webapp "python app.py" 2 seconds ago Up 1 second 5000/tcp, 127.0.0.1:32768->5000/udp dreamy_hellman
1.5 查看映射端口配置
使用docker port
[root@study ~ 11:05:45]# docker port `docker ps -lq`
5000/udp -> 127.0.0.1:32768
2、互联机制实现便捷互访
容器的互联时一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
2.1 自定义容器名
连接系统依据容器的名称来执行,虽然当容器创建的时候系统会默认分配一个名字,但是我们自定义容器名,可以方面我们记住这个容器的应用。
使用--name 自定义容器名
[root@study ~ 11:12:29]# docker run -d -P --name web training/webapp
[root@study ~ 11:12:51]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a3c7a33c554 training/webapp "python app.py" 8 seconds ago Up 7 seconds 0.0.0.0:32785->5000/tcp web
[root@study ~ 11:13:09]# docker inspect -f "{{.Name}}" 1a3c7a33c554
/web
2.2 容器互联
使用–link参数可以让容器之间安全的进行交互 --link name:alias alias为别名
创建一个新的数据库容器
[root@study ~ 11:29:47]# docker run -d --name db training/postgres
启动一个新的web容器,并连接到db容器
[root@study ~ 11:37:26]# docker run -d -P --name web --link db:db training/webapp
[root@study ~ 11:46:37]# docker inspect -f "{{.HostConfig.Links}}" web
[/db:/web/db]
Docker相当于在两个互联的容器之间创建了一个虚拟通道,而且不用映射它们的端口到宿主机上。从而避免了暴露数据库服务端口到外部网络上。
2.3 Dcoker 通过两种方式为容器公开连接信息:
- 更新环境变量;
- 更新/etc/hosts文件
通过env查看web容器环境变量,其中DB_开头的环境变量是供web容器连接db容器使用,前缀采用大写的连接别名。
[root@study ~ 11:56:04]# docker exec web env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=dc43842d75b3
DB_PORT=tcp://172.17.0.4:5432
DB_PORT_5432_TCP=tcp://172.17.0.4:5432
DB_PORT_5432_TCP_ADDR=172.17.0.4
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web/db
DB_ENV_PG_VERSION=9.3
HOME=/root
除了环境变量,Docker还添加host信息到父容器的/etc/hosts的文件。
[root@study ~ 12:04:01]# docker exec web 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.4 db 28f8260deec3 #db容器
172.17.0.3 dc43842d75b3 #web容器id
在web容器ping测试
[root@study ~ 12:04:53]# docker exec web ping db
PING db (172.17.0.4) 56(84) bytes of data.
64 bytes from db (172.17.0.4): icmp_seq=1 ttl=64 time=0.659 ms
64 bytes from db (172.17.0.4): icmp_seq=2 ttl=64 time=0.266 m