Docker 容器毗连

前面咱们完成了经由过程收集端口来拜候运转在 docker 容器内的办事。

容器中能够运转一些收集利用,要让外部也能够拜候这些利用,能够经由过程 -P-p 参数来指定端口映照。

上面咱们来完成经由过程端口毗连到一个 docker 容器。


收集端口映照

咱们成立了一个 python 利用的容器。

jishudaxue@jishudaxue:~$ docker run -d -P training/webapp python app.py
fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d

别的,咱们能够指定容器绑定的收集地点,比方绑定 127.0.0.1。

咱们利用 -P 参数成立一个容器,利用 docker ps 能够看到容器端口 5000 绑定主机端口 32768。

jishudaxue@jishudaxue:~$ docker ps
CONTAINER ID    IMAGE               COMMAND            ...           PORTS                     NAMES
fce072cc88ce    training/webapp     "python app.py"    ...     0.0.0.0:32768->5000/tcp   grave_hopper

咱们也能够利用 -p 标识来指定容器端口绑定到主机端口。

两种体例的区分是:

  • -P :是容器外部端口随机映照到主机的高端口。
  • -p : 是容器外部端口绑定到指定的主机端口。
jishudaxue@jishudaxue:~$ docker run -d -p 5000:5000 training/webapp python app.py
33e4523d30aaf0258915c368e66e03b49535de0ef20317d3f639d40222ba6bc0
jishudaxue@jishudaxue:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...           PORTS                     NAMES
33e4523d30aa        training/webapp     "python app.py"   ...   0.0.0.0:5000->5000/tcp    berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...   0.0.0.0:32768->5000/tcp   grave_hopper

别的,咱们能够指定容器绑定的收集地点,比方绑定 127.0.0.1。

jishudaxue@jishudaxue:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
jishudaxue@jishudaxue:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...     PORTS                                NAMES
95c6ceef88ca        training/webapp     "python app.py"   ...  5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...  0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

如许咱们就能够经由过程拜候 127.0.0.1:5001 来拜候容器的 5000 端口。

上面的例子中,默许都是绑定 tcp 端口,若是要绑定 UDP 端口,能够在端口前面加上 /udp

jishudaxue@jishudaxue:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
jishudaxue@jishudaxue:~$ docker ps
CONTAINER ID        IMAGE               COMMAND           ...   PORTS                                NAMES
6779686f06f6        training/webapp     "python app.py"   ...   5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"   ...    5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"   ...     0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"   ...    0.0.0.0:32768->5000/tcp              grave_hopper

docker port 号令能够让咱们快速地检查端口的绑定环境。

jishudaxue@jishudaxue:~$ docker port adoring_stonebraker 5000
127.0.0.1:5001

Docker 容器互联

端口映照并不是独一把 docker 毗连到别的一个容器的方式。

docker 有一个毗连体系许可将多个容器毗连在一路,同享毗连信息。

docker 毗连会成立一个父子干系,此中父容器能够看到子容器的信息。


容器定名

当咱们成立一个容器的时辰,docker 会主动对它停止定名。别的,咱们也能够利用 --name 标识来定名容器,比方:

jishudaxue@jishudaxue:~$  docker run -d -P --name jishudaxue training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441

咱们能够利用 docker ps 号令来检查容器称号。

jishudaxue@jishudaxue:~$ docker ps -l
CONTAINER ID     IMAGE            COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...     0.0.0.0:32769->5000/tcp   jishudaxue

新建收集

上面先成立一个新的 Docker 收集。
$ docker network create -d bridge test-net

参数申明:

-d:参数指定 Docker 收集范例,有 bridge、overlay。

此中 overlay 收集范例用于 Swarm mode,在本末节中你能够疏忽它。

毗连容器

运转一个容器并毗连到新建的 test-net 收集:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

翻开新的终端,再运转一个容器并插手到 test-net 收集:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

点击图片检查大图:

上面经由过程 ping 来证实 test1 容器和 test2 容器成立了互联干系。

若是 test1、test2 容器内里无 ping 号令,则在容器内履行以下号令装置 ping(即学即用:能够在一个容器里装置好,提交容器到镜像,在以新的镜像从头运转以上俩个容器)。

apt-get update
apt install iputils-ping

在 test1 容器输入以下号令:

点击图片检查大图:

同理在 test2 容器也会胜利毗连到:

点击图片检查大图:

如许,test1 容器和 test2 容器成立了互联干系。

若是你有多个容器之间须要相互毗连,保举利用 Docker Compose,前面会先容。


设置装备摆设 DNS

咱们能够在宿主机的 /etc/docker/daemon.json 文件中增添以下内容来设置全数容器的 DNS:

{
  "dns" : 
    "114.114.114.114",
    "8.8.8.8"
  
}

设置后,启动容器的 DNS 会主动设置装备摆设为 114.114.114.114 和 8.8.8.8。

设置装备摆设完,须要重启 docker 能力失效。

检查容器的 DNS 是不是失效能够利用以下号令,它会输入容器的 DNS 信息:

$ docker run -it --rm ubuntu  cat etc/resolv.conf

点击图片检查大图:

手动指定容器的设置装备摆设

若是只想在指定的容器设置 DNS,则能够利用以下号令:

$ docker run -it --rm host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数申明:

-h HOSTNAME 或 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

--dns=IP_ADDRESS: 增加 DNS 办事器到容器的 /etc/resolv.conf 中,让容器用这个办事器来剖析一切不在 /etc/hosts 中的主机名。

--dns-search=DOMAIN: 设定容器的搜刮域,当设定搜刮域为 .example.com 时,在搜刮一个名为 host 的主机时,DNS 不只搜刮 host,还会搜刮 host.example.com。

点击图片检查大图:

若是在容器启动时不指定 --dns--dns-search,Docker 会默许用宿主主机上的 /etc/resolv.conf 来设置装备摆设容器的 DNS。