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

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

今天先到这。。。

Docker & ASP.NET Core (4):容器间的连接的更多相关文章

  1. Docker & ASP.NET Core (1):把代码连接到容器

    和这种蛋糕一样,Docker的容器和镜像也是使用类似的分层文件系统构建而成的. 这样做的好处就是可以节省硬盘空间,也利于复用等等.因为Docker基于镜像创建容器的时候,其镜像是共享的:而且镜像里面的 ...

  2. Docker & ASP.NET Core (5):Docker Compose

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 Docker Compose简介 Compose是一个用来定义和运行多容器Docker应用的工具.使用C ...

  3. Docker & ASP.NET Core 教程

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 第五篇: Docker & ASP.NET Core (5):Docker Compose AS ...

  4. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)

    上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...

  5. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...

  6. ASP.NET Core默认容器实现Controller的属性注入

    仅针对Controller的属性注入: 使用默认容器,不依赖第三方库: 故事背景   闲来无事给项目做优化,发现大多数Controller里面都会用到Logger和AutoMapper,每个Contr ...

  7. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1)

    相关博文: Ubuntu 简单安装和配置 GitLab Ubuntu 简单安装 Docker Ubuntu Docker 简单安装 GitLab Ubuntu Docker 安装和配置 GitLab ...

  8. Docker & ASP.NET Core (3):发布镜像

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 上一篇文章最后有个问题,定制的镜像无法正常运行: 这可能是由于无法找到要运行的dll引起的问题. 之前的Dockerfile的文档我是按照微软的 ...

  9. Docker & ASP.NET Core (2):定制Docker镜像

    上一篇文章:把代码连接到容器 Dockerfile 在Docker的世界里,我们可以通过一个叫Dockerfile的文件来创建Docker镜像,随后可以运行容器. Dockerfile就是一个文本文件 ...

随机推荐

  1. Android 超高仿微信图片选择器 图片该这么加载

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39943731,本文出自:[张鸿洋的博客] 1.概述 关于手机图片加载器,在当今像 ...

  2. Python3 模拟登录知乎(requests)

    # -*- coding: utf-8 -*- """ 知乎登录分为两种登录 一是手机登录 API : https://www.zhihu.com/login/phone ...

  3. django(权限、认证)系统——第三方组件实现Object级别权限控制

    在我的系列blog<Django中内置的权限控制>中明确提及到,Django默认并没有提供对Object级别的权限控制,而只是在架构上留了口子.在这篇blog中,我们探讨一个简单流行的Dj ...

  4. 电脑不识别U盘

    最近遇到这样一个问题,现把具体问题和解决方案给大家分享一下: 系统:win10 症状:插入U盘,系统提示插入U盘的声音提示,磁盘不显示,360 无图标 原因:USB驱动出现问题 对症下药: 插入U盘右 ...

  5. Loadrunner下载脚本

    由于最近又在SGM做性能测试,扒拉出一篇去年5.6月份的一个脚本. 最近写的翻来看看其实也蛮简单的,还是就不放博客了. Action(){ //定义文件大小 int flen; //定义响应数据内容大 ...

  6. Linux的文件类型

    在Linux中,文件的颜色都是有含义的.其中, Linux中文件名颜色不同,代表文件类型不一样. 浅蓝色:表示链接文件: 灰色:表示其他文件: 绿色:表示可执行文件: 红色:表示压缩文件: 蓝色:表示 ...

  7. Docker 服务

    1.  Docker服务 作为一名后端攻城狮,对“服务”这个概念一定不陌生.比如,我们做一个会员系统,它可能会需要数据库.缓存.消息队列,这些都是中间件服务,除此以外可能还需要依赖其它的Dubbo服务 ...

  8. 为什么面试你要25K,HR只给你20K?

    周末了,我们来聊个轻松的话题,关于涨薪,哈哈~ 前阵子,栈长给大家分享了<为什么公司宁愿 25K 重新招人,也不给你加到 20K?>,今天我们来聊一个差不多的话题: 为什么面试你要25K, ...

  9. 关于MQ,你必须知道的

    我走过最长的路是你的套路 女:二号男嘉宾,假如我们牵手成功后,你会买名牌包包给我吗? 男:那你会听话吗? 女:会 听话. 男:听话 咱不买! OK那么消息队列MQ有什么套路呢?(这个话题转换生硬度连我 ...

  10. 服务部署到Swarm Cluster中

    对于已存在的镜像,将其部署到服务器中并开始对外服务,便是它的职责,而我们要做的便是帮助它完成职责,前两个应用环节都已产生了相应的镜像,在这一环节,将完成服务部署到容器集群的工作,对于这一过程,实际执行 ...