在Docker中创建自定义虚拟网路
admin
2021-06-03在Docker中创建自定义虚拟网路
目录导航:
推荐内容:
上节课中,我们直接连接了网络的ip地址。连接到了默认的bridge网络中。
使用默认的桥接网络展示了Docker的基本网络功能,但它有两个主要的功能限制。
- 第一个限制是需要检查网络以获得IP地址的尴尬过程。比如我们的MySQL容器来配置MVC容器。
- 第二个限制是所有的容器都连接到同一个网络上,而在大规模的应用程序通常需要设计成多个网络,将不同的功能区域分开,并且它们可以被独立监控和管理。
幸运的是,这两个限制都可以得到解决。通过创建自定义SDN(软件定义的网络),而不是使用默认的桥接网络。
同样的为了便于我们后面章节的学习删除当前所有的容器:
docker rm -f $(docker ps -aq)
要创建自定义网络也很简单,我们通过创建两个网络来练习分别为frontend(前端)和backend(后端).
docker network create frontend
docker network create backend
frontend
网络用于接收来自MVC容器的Http请求。而backend
网络将被用于在MVC容器和MySQL容器之间进行数据查询。我们可以通过docker network ls
查询创建的自定义网络。
将容器连接到自定义网络
一旦你创建了自定义网络,你可以使用 --network
参数,它可以与docker create
和docker run
命令一起使用。
现在我们创建一个新的数据库容器,然后将它链接到后端网络中。命令如下:
docker run -d --name mysql -v productdata:/var/lib/mysql --network backend -e MYSQL_ROOT_PASSWORD=bb123456 -e bind-address=0.0.0.0 mysql:8.0.0
在这里我们看到了一个新参数--network
这个参数用于将容器分配给一个网络。在这,容器被分配给称为backend
的网络。
注意,这个命令没有进行端口的映射,所以无法通过主机的操作系统连接到数据库。它只能通过同在
backend
虚拟网络下的容器进行连接。
了解Docker DNS服务
DNS是什么? DNS(Domain Name System,域名系统)。域名系统(DNS)是建立在分布式数据库上的分层命名系统。该系统将域名转换为IP地址,并可以将域名分配给Internet组资源和用户,无论实体的物理位置如何。
Docker配置了容器,所以它们的域名系统(DNS)请求会解析分配给它们的名称。 容器到它们在它们所在的虚拟网络中会被赋予的IP地址。(此功能是在默认的Bridge网络中是不可用的)。
这样意味着我们可以使用容器名作为主机的名称,而不需要去获取容器的ip地址,这样更加便于我们管理容器。
输入以下命令测试DNS:
docker run -it --rm --network backend alpine:3.9 ping -c 3 mysql
该命令使用Alpine Linux发行版创建并运行一个镜像,并向一个名为mysql的主机执行ping命令,Docker会自动解析到backend
网络上分配给mysql容器的IP地址。该命令将产生以下结果。
PS C:\Users\Administrator> docker run -it --rm --network backend alpine:3.9 ping -c 3 mysql
PING mysql (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.158 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.142 ms
64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.123 ms
--- mysql ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.123/0.141/0.158 ms
ping命令完成后,容器将退出并自动删除。
创建MVC容器
我们现在利用DNS提供的解析名称功能,所以不需要进行端口的映射,现在创建多个MVC应用程序,只需要保证容器名称是唯一的即可。输入以下命令创建三个不同的容器。
docker create --name productapp1 -e DBHOST=mysql -e MESSAGE="第1台服务器" --network backend yoyomooc/exampleapp
docker create --name productapp2 -e DBHOST=mysql -e MESSAGE="第2台服务器" --network backend yoyomooc/exampleapp
docker create --name productapp3 -e DBHOST=mysql -e MESSAGE="第3台服务器" --network backend yoyomooc/exampleapp
docker run
和docker create
命令只能将容器连接到一个网络。当前的命令中我们制定链接了backend
网络,它是必须需要连接的,因为我们的MySQL数据库在这里。同时我们也需要将mvc容器连接到前端网络-frontend中。
命令如下:
docker network connect frontend productapp1
docker network connect frontend productapp2
docker network connect frontend productapp3
docker network connect
命令是将现有容器连接到我们定义的虚拟网络中,以上命令是三个MVC容器都连接到frontend
网络中。
现在所有容器已经连接完毕了,现在我们需要启动这些容器,命令如下:
docker start productapp1 productapp2 productapp3
当前我们的MVC 容器被创建了,但是都没有映射端口,这意味着它们只能通过Docker的虚拟网络进行访问,我们无法通过主机的操作系统访问。
这在下一章中解决它。