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

原文:Docker & ASP.NET Core (5):Docker Compose

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

第二篇:定制Docker镜像

第三篇:发布镜像

第四篇:容器间的连接

Docker Compose简介

Compose是一个用来定义和运行多容器Docker应用的工具。使用Compose的时候,你可以使用一个YAML文件来配置你应用的服务。然后根据配置,使用一个命令即可创建并运行所有的服务。

使用Compose的时候通常分三步:

  1. 使用Dockerfile定义你的环境
  2. 在docker-compose.yml文件里定义你的服务,这样就可以让他们在隔离的环境中一起运行了。
  3. 运行docker-compose up 命令,来启动和运行整个应用。

Docker Compose的特点

Docker Compose可以做很多事情,但是如果只考虑在开发环境里,它可以做下面这些事情:

  • 管理整个应用的生命周期:启动、停止、重构建服务,而服务呢,其实就是运行的容器而已。
  • 查看在运行的服务的状态,包括输出日志。
  • 可以在单个容器上运行一次性命令。

为什么要使用Docker Compose

通常来说,如果你的应用稍微有点规模,例如你的Web应用需要使用Web服务器,缓存服务器,数据库服务器。。。如果你手动管理这样的docker应用,就很繁琐,也很容易出错。

而如果使用Docker Compose的话,它可以定义一个docker-compose.yml文件,在这个文件里,你可以定义所有的这些服务,以及它们之间的关系。

docker-compose.yml文件

docker-compose.yml文件就是用来配置服务的,这里有一个官网给出的例子:

这个文件写好之后,就可以开始Docker Compose的构建过程了。

这个构建的过程实际上会生成镜像,然后使用这些镜像就可以创建容器了。

然后再使用一个简单的命令,就可以让这些服务启动并运行了。

下面简单讲一下这个docker-compose.yml文件:

第一行是版本。

下面services,就是服务。

在services里,可以定义当构建docker-compose.yml文件时想要运行的服务,然后把这些镜像以容器运行。这里可以定义ASP.NET Core,node,数据库,缓存等等。

看一下服务里的东西:

  • build,里面可以定义构建的上下文,例如在哪个文件见来进行构建;还可以指定使用的dockerfile。
  • 在这里也可以定义环境变量。
  • image,定义镜像。
  • networks,可以把服务和定义好的网络联系起来。
  • ports,定义端口。
  • volumes,定义卷。

也可以在里面定义networks等等。

Docker Compose的命令

  • docker-compose build 把服务构建成镜像。
  • docker-compose up,一旦镜像准备好了,那就就执行该命令,启动那些镜像,使之成为容器运行。
  • docker-compose down,可以使用该命令停止、删除由up命令建立的一切东西。

此外还有这些常用形式的命令:

  • docker-compose logs
  • docker-compose ps
  • docker-compose stop
  • docker-compose start
  • docker-compose rm

docker-compose build

这个命令会构建/重新构建定义在docker-compose.yml文件里的所有的服务,使用这一个命令就会一次性把所有服务需要的镜像都创建好。

此外还可以构建单独的服务,例如: docker-compose build mongo。有时候你不想把所有的东西都重新构建一遍,你只想构建其中的一个服务。

docker-compose up

一切都构建好之后,就可以启动并运行了。这时就会使用docker-compose up这个命令。

它会自动创建容器,并运行这些容器。

该命令还可以加一些参数,例如 docker-compose up --no-deps node,它表示重新构建node镜像,停止、销毁重新创建node,但不重新创建node所依赖的服务。

docker-compose down

该命令会停止所有的容器,然后删除它们。

如果只想停止容器,并不删除,那么应该使用docker-compose stop。

此外如果你还想同时删除所有的镜像和volumes,你可以:

docker-compose down --rmi all --volumes

Docker Compose 实例

前面文章里,我通过手动输入命令实现了一套ASP.NET Core 和 PostgreSQL的docker 应用。尽管该应用很简单,只有两部分组成,但当时还是输入了不少命令,也遇到了几次错误,相对还是繁琐一些。

现在我把这两个容器删掉(包括相应的镜像和网络都删掉吧),然后使用docker-compose来实现。

建立docker-compose.yml文件

注意,我还没写完。

这里我指定了版本为‘3’,当前也就是这个版本。

然后在services里,我定义了coreweb服务(ASP.NET Core Web应用),它的构建的上下文环境 context是.,也就是当前目录;使用的dockerfile是标准的Dockerfile;端口是映射到8080,内部端口是5000;使用的网络是aspcore-network。

最后边定义了网络,名为aspcore-network,类型是bridge桥接网络。

然后继续写:

这里又添加了postgres-server这个服务,它是直接使用的官方镜像postgres,网络还是同一个网络,但是这里设置了一个环境变量,是数据库的密码。

执行docker-compose build

定义好docker-compose.yml之后,就可以进行构建了,执行docker-compose build

很快就完成了。

然后看一下镜像列表:

第一个就是我建立的coreweb,其实我们可以自定义它的名称。

而postgres这个镜像我早就下载下来了,所以它的创建时间比较早。

执行docker-compose up

docker-compose up:

这里出现了一些问题:这是我第一次运行该项目,运行项目的同时,代码里会做数据库的自动迁移,但是ASP.NET Core Web应用先跑起来了,它开始做迁移,然后发现数据库服务还没跑起来呢,所以ASP.NET Core项目就报错了,它的容器就停掉了。而过了一会postgres的服务才启动完成。。。

这也很好办,现在postgres的服务起来了,那么,我再手动启动一下ASP.NET Core Web的容器就可以了。docker-compose start coreweb:

然后访问http://localhost:8080:

网站就可以正常访问了。

现在这种操作还有一点瑕疵,因为docker-compose up之后,终端里都是log,我们处在log模式下,无法做其它操作。需要再打开一个终端来执行其它命令:

执行docker-compose down

所以我想重新搞一下,先把这套东西拆了:docker-compose down

试验其它命令

为了避免上述问题,这次我们使用daemon mode 守护进程模式,docker-compose up -d

然后我们这次使用这个命令来看进程,docker-compose ps

可以看到这两个容器,然后Web应用又发生前面的问题了,我在单独跑一下它:

这次就OK了。

再次访问网站:

还是可以正常运行的。

下面看一下log,docker-compose logs

最后销毁这套东西,这次我把相应的镜像也删掉 docker-compose down --rmi all

能删的都删除了,但这里postgres这个镜像无法删除是因为我还有其它容器使用该镜像。

原文地址:https://www.cnblogs.com/lonelyxmas/p/10322132.html

时间: 2024-10-11 06:45:04

Docker & ASP.NET Core (5):Docker Compose的相关文章

Docker & ASP.NET Core (4):容器间的连接

原文:Docker & ASP.NET Core (4):容器间的连接 第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用容器名进行连接,实际上它创建了一个桥接的网络,在这个网络里,容器间可以进行通信. 把容器添加到桥接网络:这种方式是创建了一个自定义的桥接网络,它的类型是isolated network(隔离网络),只有在这个网络里的容器才能互相

Windows下构建ASP.NET Core+Code First+Docker

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队关注一切具备生产力的技术和工具,话说有所了解

ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1

原文:ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1  一.前言  最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知识目前也没有任何的进展,嗯,罪过罪过.看了眼时间,11月也快要结束了,准备补上一篇如何将我们的 .NET Core 2.0 版本的程序升级到 .NET Core 2.1 版本,好歹也算多学

ASP.NET Core (二):入门

上一篇:ASP.NET Core(一):简介 下一篇:(待续) 英文原版:Getting Started 1. 安装 .NET Core 2. 创建 .NET Core 项目 在命令提示符窗口输入命令: mkdir aspnetcoreapp cd aspnetcoreapp dotnet new 3. 更新 project.json 文件,将 Kestrel HTTP 服务器程序包作为依赖添加到文件中 { "version": "1.0.0-*", "b

基于VS2017的Docker Support体检ASP.NET Core站点的Docker部署

最近在学习如何用 Docker 部署生产环境中的 ASP.NET Core 站点,作为一个 Docer 新手,从何处下手更容易入门呢?一开始就手写 Docker 配置文件(Docfile, docker-compose.yml)容易让人产生挫败感,想到 Visual Studio 2017 对 Docker 的支持(Docker Support),也许借助它自动生成Docker配置文件.初步体验一下 Docker 部署是一个入门捷径,遂据此想法尝试了一下,感觉不错. 1. 启用 VS2017 的

Asp.Net Core 发布到 Docker(Linux Centos 虚拟机,使用Dockerfile)

实践一下 Asp.Net Core (基于.net core 2.2)部署到Docker 一.准备工作: 1. 使用Virtualbox创建一个Centos系统的虚拟机,并安装docker和vim 2. 配置好端口(如下图,后面需要使用) 3. 准备一个网站发布包(我采用的默认的Asp.Net Core MVC),windows发布时的配置(也可以在linux上进行发布),将发布包放入linux虚拟机(我的路径是:/root/Root/DefaultHttp/publish) 4. 测试一下发布

Centos 7 ASP.NET Core 1.0 Docker部署

先决条件 64位,内核3.10以上,查看当前的内核版本,打开一个终端使用uname -r显示您的内核版本 ? ? ? ? ? ? 安装 sudo yum update ? ? sudo tee /etc/yum.repos.d/docker.repo <<-'EOF' [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1

asp.net core 发布到docker 极简步骤

1.使用dotnet命令发布项目 2.把发布成功的文件通过scp等工具发布到linux服务器上,在当前目录下新建一个dockerfile 3.使用asp.net core镜像为底包构建一个新的镜像 4.运行容器 原文地址:https://www.cnblogs.com/kklldog/p/9452217.html

ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量的数据,通过对这些数据进行集中分析,可以产生极大的价值. 在微服务的系统架构中,由于一个系统会被拆成很多个功能模块,每个模块负责不同的功能,对于日志系统的要求也会更高,比较常见的有 EFLK(ElasticSearch + Filebeat + LogStash + Kibana) 方案,而对于我们这种单体应