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上边了.