7、端口映射和容器互联
Docker 除了经过网络访间外, 还提供了两个很方便的功能来知足服务访问的基本需求:
一个是容许映射容器内应用的服务端口到本地宿主主机;
另外一个是互联机制实现多个容器间经过容器名来快速访问。
端口映射实现容器访问
在启动容器的时候, 若是不指定对应参数, 在容器外部是没法经过网络来访问容器内的
网络应用和服务的。
当容器中运行一些网络应用, 要让外部访问这些应用时, 能够经过 -P 或 -p 参数来指
定端口映射。
-P(大写的)标记时, Docker 会随机映射一个 49000 ~ 49900 的端口到内部容器开放的网络端口。
-p (小写的)则能够指定要映射的端口,而且,在一个指定端口上只能够绑定 一个容器。
支持的格式有 IP: HostPort: ContainerPort 或 IP:: ContainerPort 或 HostPort: ContainerPort。
HostPort: ContainerPort 格式(映射全部接口地址):默认会绑定本地全部接口上的全部地址。屡次使用-p标记能够绑定多个端口。
IP: HostPort: ContainerPort 格式(映射到指定地址的指定端口):指定映射使用一个特定地址。
IP:: ContainerPort 格式(映射到指定地址的任意端口): 绑定IP的任意端口到容器的xxx端口,本地主机会自动分配一个端口。
注意:
能够经过 docker logs 命令来查看应用的信息。
使用docker port 来查看当前映射的端口配置,也能够查看到绑定的地址。
互联机制实现便捷互访
容器的互联是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间建立链接关系,接收容器能够经过容器名快速访问到源容器,而不用指定具体的IP地址。
一、自定义容器名(使用 docker run --name标记能够为容器自定义命名)
链接系统依据容器的名称来执行。所以,首先须要自定义一个好记的容器命名。虽然当建立容器的时候,系统默认会分配一个名字,但自定义命名容器有两个好处:1、自定义的命名,比较好记;2、当要链接其余容器时候(即使重启),也可使用容器名而不用改变
注意:容器的名称是惟一的。若是巳经命名了一个叫web的容器,当你要再次使用web这个名称的时候,须要先用docker rm命令删除以前建立的同名容器。
在执行docker run的时候若是添加--rm标记,则容器在终止后会马上删除。注意,- -rm 和-d参数不能同时使用。
二、容器互联
使用 docker run --link参数可让容器之间安全地进行交互
--link参数的格式为 --link name: alias, 其中name是要连接的容器的名称 ,alias是别名
docker run -d -P --name web --link db:db training/webapp python app.py
Docker 至关于在两个互联的容器之间建立了一个虚机通道, 并且不用映射它们的端口到宿主主机上。
随着 Docker 网络的完善,强烈建议你们将容器加入自定义的 Docker 网络来链接多个容器,而不是使用 --link 参数。
2.1 建立一个新的 Docker 网络。
$ docker network create -d bridge my-net
-d 参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于
Swarm mode,在本小节中你能够忽略它。
2.2 链接容器。
运行一个容器并链接到新建的 my-net 网络
$ docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到 my-net 网络
$ docker run -it --rm --name busybox2 --network my-net busybox sh
这样,busybox1 容器和 busybox2 容器创建了互联关系。可经过 ping 容器名 来证实 busybox1 容器和 busybox2 容器创建了互联关系。
DNS配置
cat /etc/resolv.conf
配置所有容器的 DNS ,也能够在 /etc/docker/daemon.json 文件中增长如下内容来设置。
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
若是用户想要手动指定容器的配置,能够在使用 docker run 命令启动容器时加入以下参数:
-h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其余的容器的 /etc/hosts 看到。
--dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析全部不在 /etc/hosts 中的主机名。
注意:若是在容器启动时没有指定最后两个参数,Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。