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,网站仍然可以正常访问:

    今天先到这。。。

  • 相关阅读:
    CSS中position小解
    position
    mac默认安装postgresql, 如何让postgresql可以远程访问
    The data directory was initialized by PostgreSQL version 9.6, which is not compatible with this version 10.0.
    active admin gem error
    psql 无法添加超级用户
    ubuntu 15.04 安装Balsamiq Mockups 3
    Rails html 写public里图片的路径
    rails c 历史命令
    undefined local variable or method `per' for []:ActiveRecord::Relation
  • 原文地址:https://www.cnblogs.com/cgzl/p/10022797.html
Copyright © 2011-2022 走看看