在Docker中创建自定义虚拟网路

Author Image
admin Tuesday, November 17, 2020 阅读数: 28
Share:

[YoYoMooc]在Docker中创建自定义虚拟网路

  1. 为ASP.NET Core RazorPage 使用EF Core 连接MySQL数据库|Youtube(需科学上网)
  2. Docker中的虚拟网络是如何工作的|Youtube(需科学上网)

18-1

上节课中,我们直接连接了网络的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 createdocker 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:latest

在这里我们看到了一个新参数--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 rundocker 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的虚拟网络进行访问,我们无法通过主机的操作系统访问。

这在下一章中解决它。