第七章 端口映射与容器互联

Posted lingxiaolong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七章 端口映射与容器互联相关的知识,希望对你有一定的参考价值。

 

7.1 端口映射实现访问容器

7.1.1 从外部访问容器应用

       在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。

       当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个端口到内部容器开放的网络端口

[[email protected] ~]# docker run -d -P training/webapp python app.py

f48059b82c2cbf0109e8a40a8bde1923b493469e643b7e5113ac2833ae1eca66

[[email protected] ~]# docker ps -l

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES

f48059b82c2c        training/webapp     "python app.py"     5 seconds ago       Up 3 seconds        0.0.0.0:32777->5000/tcp   affectionate_jepsen

       此时,可以看到本地主机的32777被映射到容器的5000端口。访问宿主机的32777端口即可访问容器内web应用提供的界面。

[[email protected] ~]# curl http://192.168.161.128:32777

Hello world!

      -p 可以指定要映射的端口,并且,在一个指定端口上至可以绑定一个容器。支持的格式有IPHostPortContainerPort  |  IP::ContainerPort  |  HostPortContainerPort

[[email protected] ~]# docker run -d --name web02 -p 8089:5000 training/webapp python app.py

c776c888d1d7a27acc8d01686a15b96da1cd455a5e0d9a1b4571b17e68131828

[[email protected] ~]# docker run -d --name web01 -p 192.168.161.128:8088:5000 training/webapp python app.py

E036037074b5c25e813447ceabbfc84f7cc6efeca0a9cc627df7ebccda05f920

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                            NAMES

c776c888d1d7        training/webapp     "python app.py"     About a minute ago   Up About a minute   0.0.0.0:8089->5000/tcp           web02

e036037074b5        training/webapp     "python app.py"     2 minutes ago        Up 2 minutes        192.168.161.128:8088->5000/tcp   web01

f48059b82c2c        training/webapp     "python app.py"     8 minutes ago        Up 8 minutes        0.0.0.0:32777->5000/tcp          affectionate_jepsen

 

[[email protected] ~]# curl http://192.168.161.128:8088

Hello world!

[[email protected] ~]# curl http://192.168.161.128:8089

Hello world!

7.1.2 映射所有接口地址

       使用HostPortContainerPort格式将本地的5000端口映射到容器的5000端口,

[[email protected] ~]# docker run -d --name web04 -p 5000:5000 training/webapp python app.py

b7fb414302a3537032a01b1f5f6c4d45a2a14911fc97ff36b466cf242fe59650

       此时默认会绑定本地所有接口上的所有地址。多次使用-p标记可以绑定多个端口,

[[email protected] ~]# docker run -d --name web05 -p 5001:5000 -p 8090:80 training/webapp python app.py

0cf58b4564dbc23d92bb6e80c40e8b66f54856f0a78db00ba4f39a0189f56e75

7.1.3 映射到指定地址的指定端口

      使用IPHostPortContainerPort格式指定映射应用一个特定地址,比如localhost地址127.0.0.1

[[email protected] ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

eb60a00dca4d17409a8366fb0d3d58412835dd1875e104b185e50366b87d17e4

[[email protected] ~]# curl http://192.168.161.128:5000

curl: (7) Failed connect to 192.168.161.128:5000; 拒绝连接

[[email protected] ~]# curl http://127.0.0.1:5000

Hello world!

7.1.4 映射到指定地址的任意端口

       使用  IP::ContainerPort  绑定本地IP的任意端口到容器的5000端口。本地主机会自动分配一个端口。

[[email protected] ~]# docker run -d --name web1 -p 192.168.161.128::5000 training/webapp python app.py

56fda1da9d504b1f7ced696c38f66d75ccd7c23fa8732c3ff9485aa6f6ac0367

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                             NAMES

56fda1da9d50        training/webapp     "python app.py"     17 seconds ago      Up 17 seconds       192.168.161.128:32768->5000/tcp   web1

7.1.5 查看映射端口配置

       使用docker port 命令来查看当前映射的端口配置。也可以查看到绑定的地址:

[[email protected] ~]# docker port 56

5000/tcp -> 192.168.161.128:32768

[[email protected] ~]# docker port f4

5000/tcp -> 0.0.0.0:32777

      容器有自己的内部网络和IP地址,使用docker inspect +容器ID  可以获取容器的具体信息。

7.2 互联机制实现便捷互访

       容器的互联(linking)是一种让多个容器中应用进行快速交互的方式。它会在源和接受容器之间创建连接关系,接受容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址。

7.2.1 自定义容器命名

       虽然当创建容器的时候,系统默认会分配一个名字,但不容易记忆,因此需要我们使用--name 来自定义一个名字,而且重启后也不会发生改变。

[[email protected] ~]# docker run -d --name web -P training/webapp python app.py

5d8ccca093ff696b45ad139f47294b270034d02aeabb7709986513f423a03916

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                             NAMES

5d8ccca093ff        training/webapp     "python app.py"     2 seconds ago       Up 1 second         0.0.0.0:32778->5000/tcp           web

      容器的名称是唯一的。

[[email protected] ~]# docker run --name web01 --rm -P training/webapp python app.py

 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

       使用docker inspect 查看容器的名字:

[[email protected] ~]# docker inspect -f "{{.Name}}" web

/web

       在执行docker  run 的时候如果使用--rm参数。则容器在终止后立刻删除。--rm-d参数不能同时使用。

7.2.2 容器互联

       使用--link参数可以让容器之间安全地进行交互。

       创建一个DB容器

[[email protected] ~]# docker run -d --name db training/postgres

77a70288dfe54528134c44dbfe6d076f4bacb4969d510d077dcf483c6647be0a

       创建一个WEB容器,并将它连接到DB容器

[[email protected] ~]# docker run -d -P --name web --link db:db training/webapp python app.py

5623902d6820fe2e7880bf0a6c2a2849633c6eaccd9b5d22891985e27b089850

[[email protected] ~]# docker ps --no-trunc

CONTAINER ID                                                       IMAGE               COMMAND                                                                                                                                                                    CREATED              STATUS              PORTS                     NAMES

5623902d6820fe2e7880bf0a6c2a2849633c6eaccd9b5d22891985e27b089850   training/webapp     "python app.py"                                                                                                                                                            About a minute ago   Up About a minute   0.0.0.0:32780->5000/tcp   web

77a70288dfe54528134c44dbfe6d076f4bacb4969d510d077dcf483c6647be0a   training/postgres   "su postgres -c ‘/usr/lib/postgresql/$PG_VERSION/bin/postgres -D /var/lib/postgresql/$PG_VERSION/main/ -c config_file=/etc/postgresql/$PG_VERSION/main/postgresql.conf‘"   3 minutes ago        Up 3 minutes        5432/tcp                  db,web/db

       --link参数的格式为--link name:alias ,其中name是要连接的容器名称,alias是这个容器连接的别名。

       可以看到两个容器db和web,db容器的name列有db也有web/db。这表示web容器连接到db容器,这允许web容器访问db容器的信息。

       Docker相当于在两个互联的容器之间创建了一个虚拟通道,而且不用映射它们的端口到宿主机主机上。在启动DB容器的时候并没有使用-p-P标记,从而避免了暴露数据库服务端口到外部网络上。

       Docker通过两种方式为容器公开连接信息:

□ 更新环境变量;

□ 更新/etc/hosts文件。

       使用env命令来查看web容器的环境变量

[[email protected] ~]# docker run --rm --name web02 --link db:db training/webapp env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=71ee2c52219b

DB_PORT=tcp://172.17.0.2:5432

DB_PORT_5432_TCP=tcp://172.17.0.2:5432

DB_PORT_5432_TCP_ADDR=172.17.0.2

DB_PORT_5432_TCP_PORT=5432

DB_PORT_5432_TCP_PROTO=tcp

DB_NAME=/web02/db

DB_ENV_PG_VERSION=9.3

HOME=/root

#--rm 参数在命令env执行完之后,马上会停止,退出,删除容器。

       其中DB_开头的环境变量提供Web容器连接DB容器使用,前缀采用大写的连接别名。

       除了环境变量之外,Docker 还添加host信息到父容器的/etc/hosts文件。

[[email protected] ~]# docker run -it --rm --link db:db training/webapp /bin/bash

[email protected]:/opt/webapp# cat /etc/hosts

127.0.0.1        localhost

::1        localhost ip6-localhost ip6-loopback

fe00::0        ip6-localnet

ff00::0        ip6-mcastprefix

ff02::1        ip6-allnodes

ff02::2        ip6-allrouters

172.17.0.2        db 77a70288dfe5

172.17.0.4        7504aee7305c

       这里面两个hosts信息,第一个是web容器,web容器用主机的id作为默认主机名,第二个是db容器的IP和主机名。可以在web容器中用ping命令来测试与db容器的连通:

[email protected]:/opt/webapp# ping db

PING db (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.421 ms

64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.271 ms

       用户可以连接多个子容器到父容器,比如可以连接多个web到同一个db容器上。

 

以上是关于第七章 端口映射与容器互联的主要内容,如果未能解决你的问题,请参考以下文章

端口映射与容器互联

端口映射与容器互联

docker——端口映射与容器互联

7.Docker技术入门与实战 --- 端口映射与容器互联

Docker-端口映射与容器互联

Docker端口映射与容器互联