环境:
- window10
- centos8.2最小化安装
- Microsoft Visual Studio Enterprise 2019 版本 16.8.3
- docker-ce.x86_64 engine: 20.10.6
- asp.net core 3.1
背景:
在上一篇《.net core入门36:使用docker部署asp.net core应用程序》中,介绍了如何部署部署asp.net core应用到docker中。但是,我们发现每次程序的更新都需要手动停止、删除、构建镜像、启动容器实例等一系列的操作,并且当系统采用微服务模式开发时,更新多个应用的过程就更繁琐了。
docker提供了docker-compose方便这一操作。
一、安装docker-compose
我们可以查看github上的版本,然后下载。
这里我下载的是1.29.1,执行命令如下:
[root@bogon /]# curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 633 100 633 0 0 850 0 --:--:-- --:--:-- --:--:-- 849
100 12.1M 100 12.1M 0 0 82923 0 0:02:33 0:02:33 --:--:-- 101k
[root@bogon /]# ll /usr/local/bin
总用量 12432
-rw-r--r--. 1 root root 12728384 5月 13 11:06 docker-compose
[root@bogon /]#
如果速度较慢,可换地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
下载完成后,需要赋予docker-compose
文件可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
验证安装:
[root@bogon /]# docker-compose --version
docker-compose version 1.29.1, build c34c88b2
[root@bogon /]#
二、使用docker-compose部署多应用
现在,我们计划使用docker-compose部署三个应用,一个是redis的官方镜像,另外两个是.net core 3.1的web程序。
2.1 准备一个.net core3.1的空web项目
首先,准备一个空的.net core 3.1程序:WebApplication1
,发布后如下:
在这个目录内新建docker-file文件:Dockerfile-demo
,内如如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic
EXPOSE 80
WORKDIR /app
COPY . /app
ENTRYPOINT ["dotnet", "WebApplication1.dll"]
2.2 准备linux上的目录
在linux上新建目录:/test
,并将上面发布的文件夹拷贝到/test/WebApplication1
内。
2.3 准备docker-compose文件
在linux的/test
目录下新建文件:docker-compose.yml
文件,如下:
version: "3.3"
services:
webapplicationa:
image: webapplicationa
build:
context: ./WebApplication1
dockerfile: Dockerfile-demo
container_name: webapplicationa
ports:
- 5000:5000
environment:
- ASPNETCORE_ENVIRONMENT=Development
volumes:
- /etc/localtime:/etc/localtime
webapplicationb:
image: webapplicationb
build:
context: ./WebApplication1
dockerfile: Dockerfile-demo
container_name: webapplicationb
ports:
- 6000:5000
environment:
- ASPNETCORE_ENVIRONMENT=Development
volumes:
- /etc/localtime:/etc/localtime
redis:
image: redis:6.0
container_name: redis
ports:
- 6379:6379
2.4 构建并运行应用
将目录切换到:/test
下,然后执行:docker-compose build
进行镜像构建:
[root@bogon test]# docker-compose build
redis uses an image, skipping
Building webapplicationa
Sending build context to Docker daemon 318kB
Step 1/6 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
3.1: Pulling from dotnet/core/aspnet
69692152171a: Pull complete
6142a500eec7: Pull complete
98e06df84f9c: Pull complete
ebbd8772c8dd: Pull complete
9c620bc3b6b2: Pull complete
Digest: sha256:1083a55ced614a1627ace0c2e9dec9c458b2b06968cf81b3e33888e373e8d103
Status: Downloaded newer image for mcr.microsoft.com/dotnet/core/aspnet:3.1
---> 03f4ba024b69
Step 2/6 : FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic
3.1-bionic: Pulling from dotnet/core/sdk
01bf7da0a88c: Pull complete
f3b4a5f15c7a: Pull complete
57ffbe87baa1: Pull complete
05dbc3319a7f: Pull complete
df9876b4a6be: Pull complete
1824876b979d: Pull complete
7fc0ca49032c: Pull complete
47d259c596cf: Pull complete
5b12036e6c81: Pull complete
Digest: sha256:1c614d98594d6e4cef2aed3c5c92a33b10daf413397b642b74f05041551c010e
Status: Downloaded newer image for mcr.microsoft.com/dotnet/core/sdk:3.1-bionic
---> 668993052570
Step 3/6 : EXPOSE 80
---> Running in e454a1b87d64
Removing intermediate container e454a1b87d64
---> bbe82b4e8b7a
Step 4/6 : WORKDIR /app
---> Running in 4902e8aebbb3
Removing intermediate container 4902e8aebbb3
---> d7d3cbb6ac29
Step 5/6 : COPY . /app
---> 8b454f016f5e
Step 6/6 : ENTRYPOINT ["dotnet", "WebApplication1.dll"]
---> Running in b4f1734f6e9f
Removing intermediate container b4f1734f6e9f
---> 54b8a42116fc
Successfully built 54b8a42116fc
Successfully tagged webapplicationa:latest
Building webapplicationb
Sending build context to Docker daemon 318kB
Step 1/6 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
---> 03f4ba024b69
Step 2/6 : FROM mcr.microsoft.com/dotnet/core/sdk:3.1-bionic
---> 668993052570
Step 3/6 : EXPOSE 80
---> Using cache
---> bbe82b4e8b7a
Step 4/6 : WORKDIR /app
---> Using cache
---> d7d3cbb6ac29
Step 5/6 : COPY . /app
---> Using cache
---> 8b454f016f5e
Step 6/6 : ENTRYPOINT ["dotnet", "WebApplication1.dll"]
---> Using cache
---> 54b8a42116fc
Successfully built 54b8a42116fc
Successfully tagged webapplicationb:latest
[root@bogon test]#
构建完成后,启动容器:docker-compose up -d
[root@bogon test]# docker-compose up -d
Pulling redis (redis:6.0)...
6.0: Pulling from library/redis
69692152171a: Already exists
a4a46f2fd7e0: Pull complete
bcdf6fddc3bd: Pull complete
2deb8958a858: Pull complete
10d2f5c26490: Pull complete
d040d72a588c: Pull complete
Digest: sha256:71909943bb7ca4b34b6b151e7b29c608ddae654cdc9a1d2d15f30df666b3a805
Status: Downloaded newer image for redis:6.0
Creating webapplicationa ... done
Creating webapplicationb ... done
Creating redis ... done
[root@bogon test]#
以后,我们需要更新时,就在这个目录里重复执行以下命令:
docker-compose build
docker-compose up -d
注意: redis服务用的是外部镜像,只有docker-compose up的时候才会初始化,而且如果不改配置文件,redis应用不会被更新(为了数据的安全性,你可能需要将redis的部署配置和自身应用的配置分割开,以避免redis被覆盖了,导致数据丢失)。