EchoDemo's Blogs

Docker的网络与容器互联

Docker允许通过外部访问容器或容器互联的方式来提供网络服务。

外部访问容器

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

[root@localhost ~]# docker run -d -P training/webapp python app.py
60f400b387ae5d54fc38788837c00f88b4e38c176b495fa28640c030b2071cf5
[root@localhost ~]# docker container ls -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
60f400b387ae        training/webapp     "python app.py"     10 seconds ago      Up 5 seconds        0.0.0.0:32769->5000/tcp   zealous_bartik

使用“docker container ls”可以看到,本地宿主机的32769被映射到了容器的5000端口。此时访问本机的32769端口即可访问容器内web应用提供的界面。同样的,可以通过 docker logs 命令来查看应用的信息。

[root@localhost ~]# docker logs  60f400b387ae
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.16.213.132 - - [08/Dec/2018 14:29:51] "GET / HTTP/1.1" 200 -
172.16.213.132 - - [08/Dec/2018 14:29:52] "GET /favicon.ico HTTP/1.1" 404 -

2、另一个参数“-p”则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有:

ip:hostPort:containerPort 
ip::containerPort 
hostPort:containerPort

例如:使用“hostPort:containerPort”格式将宿主机的5000端口映射到容器的5000端口,可以执行如下命令:

[root@localhost ~]# docker run -d -p 5000:5000 training/webapp python app.py

此时默认会绑定宿主机本地所有网络接口上的所有地址。还可以映射到指定地址的指定端口,使用“ip:hostPort:containerPort”格式指定映射使用一个特定地址,比如localhost地址127.0.0.1,可以执行如下命令:

[root@localhost ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

也可以映射到指定地址的任意端口,使用“ip::containerPort”绑定“localhost”的任意端口到容器的5000端口,本地宿主机会自动分配一个端口。看下面这个例子:

[root@localhost ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以使用udp标记来指定udp端口,例如:

[root@localhost ~]# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

最后,如何查看映射端口配置呢,可以使用“docker port”命令来查看当前映射的端口配置,也可以查看绑定的地址,例如:

[root@localhost ~]# docker port 60f400b387ae
5000/tcp -> 0.0.0.0:32769

通过“-p”参数还可以多次使用来绑定多个端口,例如:

[root@localhost ~]# docker run -d  -p 6000:5000 -p 3000:80  training/webapp   python app.py

容器互联

如果你之前有Docker使用经验,那么你对“–link”参数应该比较熟悉,它就是用来进行容器互联的。但是,随着Docker网络的完善和版本的升级,强烈建议大家将容器加入自定义的Docker网络来连接多个容器,而不是使用“–link”参数。

首先,新建一个docker网络,命令如下:

[root@localhost ~]# docker network create -d bridge mynet

其中,“-d”参数指定Docker网络类型,有bridge、overlay等。接着,新运行两个容器,先运行第一个容器并连接到新建的mynet网络,命令如下:

[root@localhost ~]# docker run -it --rm --name busybox1 --network mynet busybox sh

然后,打开一个新的终端,再运行一个容器并加入到mynet网络

[root@localhost ~]# docker run -it --rm --name busybox2 --network mynet busybox sh

继续打开第三个终端,查看容器信息:

[root@localhost ~]# docker container ls

最后,在第一个容器busybox1中ping第二个容器busybox2,看是否能通,如果可以通,那么说明这两个容器已经建立了互联关系。如果你有多个容器之间需要互相连接,推荐使用Docker Compose。

🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------