Docker之十一:端口映射与容器互联
端口映射
外部访问容器应用
默认情况下,容器启动,容器外部是无法通过网络来访问容器内的网络应用和服务的。
docker run 启动网络可以通过 -P 和 -p 参数来指定端口映射:
参数 | 说明 |
---|---|
-P | Docker会随机映射一个49000~49900的端口到内部容器开放的网络端口 |
-p | 可以指定网络端口 IP:HostPort:ContainerPort 或 IP: :ContainerPort 或 HostPort:ContainerPort |
# 创建并开始运行一个 web 容器
~$ docker run -d -P training/webapp python app.py
# 查看容器信息
$ docker ps -l
可以发现宿主主机的32768端口被映射到容器的5000端口。我们可以用浏览器访问http://192.168.194.132:32768/,192.168.194.132为宿主机的IP:
# 查看应用信息
$ docker logs -f 526d4f761031
映射所有接口地址
# HostPort:ContainerPort 本地的5000端口映射容器的5000端口,默认会绑定本地所有接口上的所有地址
$ docker run -d -p 5000:5000 training/webapp python app.py
# 使用 -p 可以绑定多个端口
$ docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
映射到指定地址的指定端口
# IP:HostPort:ContainerPort 指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
# 执行下列命令后,本地就可以通过 127.0.0.1:5001 来访问容器5000端口
$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
映射到指定地址的任意端口
# IP::ContainerPort 绑定 localhost 的任意端口到容器的5000端口,本地主机自动分配一个端口
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
绑定 UDP 端口
# 使用 -p 参数默认绑定 tcp 端口,可以使用 udp 标记来指定 udp 端口
$ docker run -d -p 127.0.0.1:5001:5000/udp training/webapp python app.py
查看映射端口配置
# 使用 docker port 来查看当前映射的端口配置
$ docker port 526d4f761031 5000
查看容器内部网络和 IP 地址
$ docker inspect 526d4f761031
Docker 容器互联
容器互联(linking)是一种让多个容器中的应用快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。
自定义容器命名
# 创建一个别名为 web 的容器
$ docker run -d -P --name web training/webapp python app.py
基于 network 的容器互联
- 使用 docker network create 创建一个网络
$ docker network create -d bridge test-net
- 运行两个个容器并连接到新建的 test-net 网络
$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
$ docker run -itd --name test2 --network test-net ubuntu /bin/bash
- 在两个终端中进入容器
$ docker exec -it test1 /bin/bash
root@8d0c0dc9d82e:/# apt-get update
$ docker exec -it test2 /bin/bash
root@72cb3de50bf3:/# apt-get update
- 在 test1 和 test2 容器内安装 ping 工具
# test1 安装 iputils-ping
root@8d0c0dc9d82e:/# apt install iputils-ping
# test2 安装 iputils-ping
root@72cb3de50bf3:/# apt install iputils-ping
- ping
test1 与 test2 建立了容器连接。
容器互联 --link
# 运行一个数据库容器 db
$ docker run -d --name db training/postgres
# 运行一个网站容器 web,连接到 db
# --link 参数格式为 --link name:alias,name为容器名,alias 为容器别名
$ docker run -d -P --name web --link db:db training/webapp python app.py
此时,进入 web 容器,安装 ping 工具, ping db:
fgd@ubuntu:~$ docker exec -it web /bin/bash
root@ef59f8dc53da:/opt/webapp# apt-get update
root@ef59f8dc53da:/opt/webapp# apt install inetutils-ping
oot@ef59f8dc53da:/opt/webapp# ping db
web 可以联通 db。
配置 DNS
容器启动时没有配置或没有使用 –dns 和 –dns-search 指定 DNS,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。
配置 DNS 可以通过两种方式:
- 配置 /etc/docker/daemon.json ,并重启 Docker。
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
查看容器的 DNS 是否生效,可以查看容器的/etc/resolv.conf
$ docker run -it --rm ubuntu cat etc/resolv.conf
- 只为指定的容器设置 DNS
$ docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu