端口映射实现容器访问
1.从外部访问容器的应用
在容器启动的时候,如果不指定对应的参数,在容器外部使无法通过网络来访问容器内的网络应用和服务的。
可是使用 -P 或 -p 来指定端口映射,当使用 -P 时,会随机映射一个 49000~49900 的端口到容器内部开放的网络端口
docker run -d -P training/webapp python app.py
docker ps -l
docker logs -f nostalgic-morse
-p 可以指定要映射的端口,并且一个端口只可以绑定一个容器。支持的格式有:
- IP:HostPort:ContainerPort | IP::ContainerPort | HostPort:ContainerPort
2.映射所有接口地址
使用 HostPort:ContainerPort 格式本地的 5000 端口映射到容器的 5000 端口:
docker run -d -p 5000:5000 training/webapp python app.py
此时默认会绑定本地所有接口上的所有地址。多次使用 -p 可以绑定多个端口
3.映射到制定接口的指定端口
IP:HostPort:ContainerPort
4.映射到指定地址的任意端口
IP::ContainerPort
还可以使用 udp 标记来指定 udp 端口:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
5.查看映射端口配置
docker port CONTAINER 5000
容器有自己的内部网络和IP地址,使用 docker [container] inspect CONTAINER 获取容器具体信息
互联机制实现便捷访问
接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址
1.自定义容器名
- 好记,一目了然
- 重启不会改变
docker run -d -P --name web training/webapp python app.py
使用 docker ps -l 或 docker [container] inspect -f "{{ .Name }}" ID 查看容器名
容器名是唯一的,docker rm 删除之前的同名容器
执行 docker run 的时候添加 --rm 标记,则容器会在停止后立刻删除,--rm 和 -d 不能同时使用
2.容器互联
被连接的必须处于运行状态?
--link name:alias name是要连接的容器名称,alias是别名
创建一个新的数据库容器:
docker run -d --name db training/postgres
删除之前创建的web容器:
docker rm -f web
创建一个新的web容器,并将它连接到db容器:
docker run -d -P --name web --link db:db training/webapp python app.py
docker 通过两种方式为容器公开连接信息
- 更新环境变量
- 更新 /etc/hosts 文件
使用 env 命令查看web容器环境变量
- docker run --rm --name web2 --link db:db training/webapp env
其中,DB_ 开头的环境变量是提供给web容器连接db容器使用,前缀采用大写的连接别名。
ubuntu@ip-172-31-17-146:~$ docker run --rm --name web3 --link keen_chaum:keen_chaum ubuntu env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=bc3b072374e3
KEEN_CHAUM_NAME=/web3/keen_chaum
HOME=/root
父容器web的hosts文件
docker run -t -i --rm --link db:db training/webapp /bin/bash
cat /etc/hostsdockersdoc
可以在容器中安装ping命令测试跟db的连通
apt-get install -yqq inetutils-ping
ping db db会解析成它的IP
可以连接多个子容器到父容器
生产环境中,可能需要跨主机,跨数据中心,需要进入额外的机制,例如 SDN(软件定义网络) 或 NFV(网络功能虚拟化)的相关技术