zoukankan      html  css  js  c++  java
  • Docker & ASP.NET Core (4):容器间的连接

    第一篇:把代码连接到容器 

    第二篇:定制Docker镜像

    第三篇:发布镜像

    Docker容器间的连接

    Docker提供了两种方式可以用来做容器间的连接/通信:

    • Legacy Linking:这种方式使用容器名进行连接,实际上它创建了一个桥接的网络,在这个网络里,容器间可以进行通信。
    • 把容器添加到桥接网络:这种方式是创建了一个自定义的桥接网络,它的类型是isolated network(隔离网络),只有在这个网络里的容器才能互相通信。

    Legacy Linking

    Legacy Linking,也就是按照容器名进行连接。

    要想使用Legacy Linking,总共分这几步:

    1. 运行一个容器,需要给容器起一个名字
    2. 通过容器名,连接到正在运行的容器
    3. 如果还有其它容器要通信,那么重复上述步骤即可。

    准备数据库项目

    我准备使用ASP.NET Core做一个Web应用,数据库使用PostgreSQL,应用和数据库分别放在两个不同的容器里。

    先弄数据库:

    https://store.docker.com/images/postgres

    docker pull postgres

    然后运行容器,别忘了起名:

    这里设置了POSTGRES_PASSWORD这个环境变量,它在容器里就是数据库的密码。

    准备ASP.NET Core MVC项目

    然后再建立一个ASP.NET Core 项目:

    就选择ASP.NET Core MVC模板,不带身份验证,建立一个项目即可。

    然后需要添加Npgsql.EntityFrameworkCore.PostgreSQL这个库。

    建立DbContext:

    在Startup里配置:

    配置连接字符串:

    设置自动迁移,并添加种子数据:

    去掉HTTPS相关设置,让其监听5000端口:

    然后添加一个Migration:

    创建ASP.NET Core Web应用的容器

    建立Dockerfile:

    创建镜像:

    运行容器:

    在这里, --link my-postgres:postgres-server 就是通过容器名连接到了my-postgres这个容器,连接之后把该my-postgres这个容器名映射为postgres-server这个名称,这个名称和连接字符串里的HOST的名字一致:

    看一下正在运行的容器:

    可以看到数据库和Web应用的容器都在运行。

    连接到正在运行的数据库容器

    我想看一下在数据库容器里是否成功创建了Students表,以及里面是否有种子数据了。可以使用:

    docker exec 容器名/ID 命令,来对容器执行某个命令。

    这里我这样写:

    进入交互模式,并打开bash。

    可以看到种子数据已经添加成功了。

    查看Web应用的Log

    使用docker logs 容器名/ID来查看log:

    应该没问题。

    最后访问http://localhost:5000:

    可以看到,web应用和数据库两个容器之间已经正常的连接并运行了。

    容器网络

    容器的网路,或者叫桥接的网络。

    可以这样想,在一个Docker Host里,有许多容器,他们之间需要相互通信。我们可以使用容器名进行通信,尤其是开发的时候。

    但是当容器比较多的时候,你可能就倾向于对一些容器进行隔离,或者叫做分组。

    而我们通过Docker客户端就可以创建这种隔离的网络。每一个隔离网络里的容器可以相互通信,这时也使用容器名进行通信。

    有了这种隔离的网络,对容器间的通信管理就方便多了。

    创建容器网络的步骤

    • 首先,创建一个自定义的桥接网络
    • 然后,让容器运行于这个自定义的桥接网络。也可以让一个容器运行于多个网络中。

    使用这个命令创建网络:

    docker network create --driver bridge 网络名

    这句话就是使用桥接网络来建立一个自定义网络。

    然后我让容器加入到这个网络里。其命令大致如下:

    docker run -d --network=网路名 --name 网络内的容器名 镜像名

    首先为了演示方便,我把其余的容器都删掉了:

    然后,我把现有的网络列举一下。docker network ls:

    可以看到之前建立的my-net也在里面。

    我们也可以inspect一下这个网络:

    可以看到里面还没有任何的容器。

    然后,我运行postgres的容器,让其加入该网络:

    这时再次inspect该网络,可以看到这个容器已经进入网络了:

     然后再把ASP.NET Core应用的容器添加到该网络:

    注意这里不需要使用--link了。

    再次inspect该网络:

    可以看到里面有两个容器了。

    然后访问http://localhost:5000,网站仍然可以正常访问:

    今天先到这。。。

  • 相关阅读:
    java 9+版本中,接口的内容总结
    发红包的案例
    java中成员变量和局部变量的区别
    分别使用面向对象和面向过程两个不同的思路编写代码,打印输出一个数组,输出数组的格式:“[10,20,30,40,50]”
    题目要求:不能使用新数组,就用原来的唯一的数组进行反转
    request.getRequestDispatcher()和response.sendRedirect()区别
    Maven是什么
    字符串中的各种方法
    数组中的各种方法
    字符串的模式匹配方法-match-search-repalce
  • 原文地址:https://www.cnblogs.com/cgzl/p/10022797.html
Copyright © 2011-2022 走看看