Docker网络基础配置

简介 

  大量的互联网应用服务包括多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合。
  Docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务。
  本文将讲解如何使用Docker的网络功能。包括使用端口映射机制来将容器内应用服务提供给外部网络,以及通过容器互联系统让多个容器之间进行快捷的网络通信。

端口映射实现容器访问

从外部访问容器应用

  在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
  当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射。当使用-P标记时,Docker会随机映射一个49000~49900的端口至容器内部开放的网络端口:

[root@gavin ~]# sudo docker run -d -P tomcat:latest
afe8064a2e604ebd212ec2a620fde7d0c2f72b51d298066f3e4c454df1b74e6e
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
afe8064a2e60        tomcat:latest       "catalina.sh run"   13 seconds ago      Up 12 seconds       0.0.0.0:32769->8080/tcp   festive_panini

  此时,可以使用docker ps看到,本地主机的32769被映射到了容器的8080端口。
  访问宿主主机的32769端口即可访问容器内Web应用提供的界面。

Docker网络基础配置

  同样,可以通过docker logs命令来查看应用的信息:

[root@gavin ~]# sudo docker logs afe8
28-Aug-2019 14:18:27.546 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.45
28-Aug-2019 14:18:27.548 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Aug 14 2019 22:21:25 UTC
28-Aug-2019 14:18:27.548 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.5.45.0
28-Aug-2019 14:18:27.549 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
28-Aug-2019 14:18:27.549 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-957.el7.x86_64
...

  -p(小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostport:containerPort l ip::containerPort I hostPort:containerPort。

映射所有接口地址

  使用hostPort:containerPort格式将本地的8080端口映射到容器的8080端口,可以执行如下命令:

[root@gavin ~]# sudo docker run -d -p 8080:8080 tomcat:latest
b7b692ed0bc99bf73f68b92ddca20a1ae5ab510c42ae234f76a4b36093e1fd31
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
b7b692ed0bc9        tomcat:latest       "catalina.sh run"   9 seconds ago       Up 8 seconds        0.0.0.0:8080->8080/tcp    tender_wescoff

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

[root@gavin ~]# sudo docker run -d -p 8088:8088 -p 8099:8099 tomcat:latest
c1629208e59a8953369b2229de6c352ae83faa00154c7acdb5178931e84bedce
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
c1629208e59a        tomcat:latest       "catalina.sh run"   6 seconds ago       Up 5 seconds        0.0.0.0:8088->8088/tcp, 8080/tcp, 0.0.0.0:8099->8099/tcp   nervous_robinson

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

  可以使用ip:hostPort:containerPort格式指定映射使用一个特定地址,比如我的IP为192.168.1.16:

[root@gavin ~]# sudo docker run -d -p 192.168.1.16:8081:8080 tomcat:latest 
7f5eab8748fe3fcb0ffd3b2828928be05f8193d88ff80d2f88aee9ae262f6114
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
7f5eab8748fe        tomcat:latest       "catalina.sh run"   10 seconds ago      Up 9 seconds        192.168.1.16:8081->8080/tcp                                stoic_robinson

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

  使用ip::containerPort绑定192.168.1.16的任意端口到容器的8080端口,本地主机会自动分配一个端口:

[root@gavin ~]# sudo docker run -d -p 192.168.1.16::8080 tomcat:latest 
8108af81e853076df2a55d125b559476422df4d16c4560afd6439f51cb67bcfc
[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
8108af81e853        tomcat:latest       "catalina.sh run"   7 seconds ago       Up 6 seconds        192.168.1.16:32768->8080/tcp                               inspiring_zhukovsky

查看映射端口配置

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

[root@gavin ~]# sudo docker port 8108
8080/tcp -> 192.168.1.16:32768

容器互联实现容器间通信

  容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。
  它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。

自定义容器命名

  连接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
  虽然当创建容器的时候,系统默认会分配一个名字,但自定义命名容器有两个好处:

  1. 自定义的命名,比较好记,比如一个Web应用容器,我们可以给它起名叫web。
  2. 当要连接其他容器时候,可以作为一个有用的参考点,比如连接Web容器到db容器。

  使用--name标记可以为容器自定义命名:

[root@gavin ~]# sudo docker run -d -P --name web tomcat:latest
47a03555a3aa0c4581df781f906baaa0e3c0b8fcc1ebc5764ad94eb0c14716a8

  使用docker ps来验证设定的命名

[root@gavin ~]# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                      NAMES
47a03555a3aa        tomcat:latest       "catalina.sh run"   46 seconds ago      Up 45 seconds       0.0.0.0:32770->8080/tcp                                    web

容器互联

  使用--link参数可以让容器之间安全的进行交互。
  下面先创建一个新的数据库容器:

[root@gavin ~]# sudo docker run -d --name db postgres

  删除之前创建的web容器

[root@gavin ~]# sudo docker rm -f web

  然后创建一个新的web容器,并将它连接到db容器:

[root@gavin ~]# sudo docker run -d -P --name web --link db:db tomcat:latest 

  此时,db容器和web容器建立互联关系。
  --link参数的格式为--link name:alias,其中name是要链接的容器的名称,alias是这个连接的别名。
  使用docker ps查看容器的连接:

[root@gavin ~]# sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
ea74df6bc843        tomcat:latest       "catalina.sh run"        2 minutes ago       Up 2 minutes        0.0.0.0:32774->8080/tcp                                    web
44c6d026afe2        postgres            "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        5432/tcp                                                   db

  进入web容器中ping db容器:

[root@gavin ~]# sudo docker exec -ti web /bin/bash
root@ea74df6bc843:/usr/local/tomcat# ping db
PING db (172.17.0.7) 56(84) bytes of data.
64 bytes from db (172.17.0.7): icmp_seq=1 ttl=64 time=0.299 ms
64 bytes from db (172.17.0.7): icmp_seq=2 ttl=64 time=0.105 ms
64 bytes from db (172.17.0.7): icmp_seq=3 ttl=64 time=0.067 ms

  可以看到web容器可以访问到db容器。
  Docker在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动db容器的时候并没有使用-p和-P标记,从而避免了暴露数据库端口到外部网络上。
  Docker通过环境变量查看公开连接信息,使用env命令来查看web容器的环境变量:

[root@gavin ~]# sudo docker run --name web2 --link db:db tomcat:latest env
...
DB_PORT=tcp://172.17.0.7:5432
DB_PORT_5432_TCP=tcp://172.17.0.7:5432
DB_PORT_5432_TCP_ADDR=172.17.0.7
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_GOSU_VERSION=1.11
DB_ENV_LANG=en_US.utf8
DB_ENV_PG_MAJOR=11
DB_ENV_PG_VERSION=11.5-1.pgdg90+1
DB_ENV_PGDATA=/var/lib/postgresql/data
...

  其中DB开头的环境变量是供web容器连接db容器使用,前缀采用大写的连接别名。
  用户可以链接多个子容器到父容器,比如可以链接多个web到db容器上。

 

这篇文章是我学习 Docker 的记录,内容参考自《Docker技术入门与实战》

 

上一篇:Linux 中的 ~/. 表示的意思


下一篇:PHPer面试指南-PHP 篇