Docker入门与实践:Docker中的网络功能简介
Docker提供网络服务的方法包括两种:
- 通过外部访问docker容器的方式;
- 通过Docker容器间互联的方式。
一、外部访问docker容器
在docker容器中可以运行一些网络应用,外部想要访问docker容器内的应用,可以通过-p
或-P
选项来指定端口映射,两个选项的区别如下所示:
- (1)
-p
:指定要映射的端口,通过该端口绑定一个docker容器; - (2)
-P
:docker会随机映射一个范围的端口到内部容器开放的网络端口。其中这个随机的端口范围可以在/proc/sys/net/ipv4/ip_local_port_range
文件中查看,如下图所示,我的电脑中的端口范围为32768-60999
。
1.1 使用-P
选项外部访问docker容器
如下图所示,使用docker run -d -P training/webapp python app.py
命令创建一个可以通过外部网络访问的docker容器;然后使用docker container ls -l
查看容器的端口信息。这样就创建了一个本地主机49159
端口映射到容器5000
端口的容器。
1.2 使用-p
选项外部访问docker容器
如上所述,-p
指定特定的端口绑定到一个容器上,其支持的格式有:
hostPort:containerPort
:映射本地特定端口所有ip地址到容器的特定端口;ip:hostPort:containerPort
:映射本地特定端口的特定ip地址到容器的特定端口;ip::containerPort
:映射本地主机特定ip地址的随机端口到容器特定的端口;
其中,上面的hostPort
表示主机端口或本地端口;containerPort
表示容器端口;ip
表示网址,下面分别罗列这三种格式的使用方法:
1、映射本地特定端口所有ip地址到容器的特定端口
使用hostPort:containerPort
格式可以将本地主机特定端口映射到容器的特定端口,以实现外部访问容器的目的,指令如下所示:
docker run -d -p 5000:5000 training/webapp python app.py
如下图所示,默认会绑定本地接口5000
上所有ip地址到容器的5000
端口上。
上图中的0.0.0.0:5000
表示本地主机5000
端口上的所有ip地址。
2、映射本地特定端口的特定ip地址到容器的特定端口
使用ip:hostPort:containerPort
格式可以将本地主机的特定端口的特定ip地址映射到容器的特定端口,以实现外部访问容器的目的,比如这里的ip
为127.0.0.1
,指令如下所示:
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
如下图所示,默认会绑定本地端口5000
上127.0.0.1
的ip地址到容器的5000
端口上。
3、映射本地主机特定ip地址的随机端口到容器特定的端口
使用ip::containerPort
格式可以将本地主机特定的ip地址的随机端口到容器的特定端口,以实现外部访问容器的目的,比如这里的ip
为127.0.0.1
,指令如下所示:
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
如下图所示,绑定本地主机随机端口上的127.0.0.1
ip地址到容器的5000
端口上,这里的随机分配的主机端口为49154
。
代码语言:javascript复制注意:
-p
可以多次使用来绑定多个端口,指令如下所示:
docker run -d
-p 5000:5000
-p 3000:80
training/webapp
python app.py
执行完上面指令,使用docker container ls
命令就可以看出绑定了两组端口:
二、Docker容器的互联
Docker容器不仅可以通过网络与本地主机互联,容器还可以通过docker自定义的网络来实现容器间互联。
2.1 自定义docker网络的构建
构建自定义docker网络的指令如下所示:
代码语言:javascript复制docker network create -d bridge My_Net
其中,-d
指定了docker的网络类型为bridge
类型,并自定义docker网络的名称为My_Net
。如下图所示,可以使用docker network ls
查看系统的docker网络:
2.2 Docker容器的网络连接
这里演示两个容器通过上面创建的docker网络My_Net
,进行互联的过程:
1、创建连接docker网络的容器
首先,启动或创建一个busybox_1
容器并连接到上面创建的My_Net
docker网络,指令如下所示:
docker run -it --rm
--name busybox_1
--network My_Net busybox sh
如下如所示,由于本地没有busybox:latest
镜像,所以首先从远程镜像仓库拉取镜像,再创建连接的docker网络My_Net
的容器busybox_2
:
然后,再打开一个终端,使用同样的方法创建一个busybox_2
容器并连接到My_Net
docker网络:
docker run -it --rm
--name busybox_2
--network My_Net busybox sh
再打开一个终端,如下图所示,使用docker container ls
查看容器信息:
2、测试通过docker网络互联的容器
通过ping
来测试busybox_1
容器和busybox_2
容器的互联:
如下图所示,在busybox_2
容器内输入ping busybox_1
,即用ping
指令来测试busybox_2
容器连接busybox_1
的情况,到如下图的结果则表示两个容器互联成功: