1. 端口映射

1.1. 外部访问容器内的应用

如果外部要访问容器,需要将容器的端口开放出来,使用 -p-P (大写)参数来映射容器端口和宿主机端口的关系:

  • -p:明确指定端口映射,每个端口只能绑定一个容器,格式包括:IP:HOST_PORT:CONTAINER_PORT|IP:CONTAINER_PORT|HOST_PORT:COINTAINER_PORT

举例:

docker run -p 8080:80 nginx

该命令表示启动容器是将宿主机的8080端口映射为容器的80端口,外部访问宿主机的8080端口就是在访问容器的80端口。

  • -P(大写):随机映射一个宿主机的可用端口到容器

举例:

docker run -P nginx

通过docker ps命令可以看到端口的映射结果:

root@ubuntu:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
9e4cb770c5cc        nginx               "nginx -g 'daemon of…"   17 seconds ago      Up 16 seconds       0.0.0.0:32768->80/tcp   peaceful_robinson

可以看到,宿主机的32768端口映射到容器的80端口

1.2. 映射多个端口

多次使用 -p 参数,可以将容器的多个端口与宿主机的多个端口进行映射 例如:

docker run -p 8080:80 -p 8081:80 nginx

1.3. 映射指定地址的指定端口

使用 IP:HOST_PORT:CONTAINER_PORT 格式来指定IP地址下的端口

例如:

docker run -p 127.0.0.1:8080:80 nginx

将127.0.0.1所在的机器(本机)的8080端口映射到本机容器的80端口上。

1.4. 查看端口映射配置

docker port 容器 端口
docker [container] inspect 容器ID

2. 容器互联

容器互联(linking)是一种让多个容器中的应用进行快速交互的方式。

查看容器名称:

docker [container) inspect -f " { { .Name } } " CONTAINER

启动时给容器命名:加上 --name 参数,便于记忆和管理

docker [container] run 时加上 --rm 参数,则容器在终止后会自动删除,不能与 -d 同时使用

(1)下载一个新的数据库容器

docker run -d --name db training/postgres

(2)创建一个新的web容器,并将其连接到db容器

dokcer run -d -P --name web --link db:db training/webapp python app.py
  • --link参数格式为:--link name:alias,name 为要连接的容器名称,alias 是别名

Docker相当于在两个互联的容器之间创建了虚拟通道,而且不用映射他们的端口到宿主机上,避免暴露数据库服务端口到外网上。

Docker通过两种方式为容器公开连接信息:

  • 更新环境变量

  • 更新 /etc/hosts 文件

使用env命令查看web容器的环境变量:

$ docker run --rm --name web2 --link db:db training/webapp env
……
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
……

DB开头的环境变量是提供web容器连接db容器使用。

另外,docker还添加host信息到父容器的/etc/hosts文件中:

docker run -it --rm --link db:db training/webapp /bin/bash
root@aed84ee2lbde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee2lbde
172.17.0.5 db

这里有 2 个 hosts 信息, 第一个是 web 容器, web 容器用自己的 id 作为默认主机名,第二个是 db 容器的 IP 和主机名.

使用ping命令来测试跟db容器的联通情况:

root@aed84ee2lbde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee2lbde:/op七/webapp# ping db
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=O ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=l ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

将db容器解析到ip地址172.17.0.5上边了.


相关阅读