标签:通过 作用 source 印象 dem 80端口映射 一个 style 策略
前一篇实现了容器间的通信,像这样由两个乃至多容器构成的应用需要我们一步一步用docker命令搭建起来。由于Docker的迁移性,换一个有Docker的环境执行按相同的顺序执行相同的docker命令便可搭建其一个相同的应用。但是在执行docker命令时某个指令执行错误,某个变量设置错误,某个命令执行的顺序出错等等情况都会导致应用搭建失败。更或是如果应用需要启动很多个容器,每个容器都有相应的网络,卷等配置,容器间还存在依赖,这样的应用搭建起来就会十分的繁琐。而且在不同的环境上去搭建都是重复性的工作,那只要搭建一次岂不就是重复性的受罪嘛。
遇到上面说的情况,docker-compose便可以解救我们进行大量重复性的手工作业。docker-compose是一个用于定义与启动多容器应用的工具,通过docker-compose,我们可以通过一个yaml文件来配置要用到的所有的服务(容器),并且容器是如何构建、用到哪些卷、用什么网络、映射哪个端口或依赖什么都可以定义。在定义之后,通过一句命令便可以运行起所有的服务。有了docker-compose之后就不用再担心重复的搭建多容器应用了。
首先需要区分两个概念,docker-compose中服务(service)可以理解成我们要运行的容器,而项目(project)是由一个docker-compose.yml文件定义的整个要运行的容器集合。
简单总结下docker-compose的作用
在Linux系统中执行下面的命令下载当前稳定版本Docker-Compose,大约17M大小。
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
随后执行命令增加权限
sudo chmod +x /usr/local/bin/docker-compose
验证安装是否成功
~$ docker-compose --version docker-compose version 1.25.5, build 8a1c60f6
而在Windows系统下,当我们最开始安装Docker DeskTop时已经一并安装了,不需要其他操作,可使用同样的命令验证。
> docker-compose --version docker-compose version 1.25.5, build 8a1c60f6
Compose yaml文件简介
之前说了docker-compose通过执行在yaml文件中定义的服务及其配置来搭建我们的应用,我们需要在执行docker-compose命令的工作目录下创建一个“docker-compose.yml”文件。
可以先看一个docker-compose.yml文件的例子来对其有个整体印象
version: "3" services: web: container_name : myweb restart: always build: . ports: - "8000:80" volumes: - .:/code - logvolume01:/var/log networks: my-net depends_on: - db db: image: "mcr.microsoft.com/mssql/server" environment: SA_PASSWORD: "Your_password123" ACCEPT_EULA: "Y" networks: my-net volumes: logvolume01:{} networks: my-net: driver: bridge
通过上面的文件可以看出yml文件中一般分为四个部分
下面对docker-compose.yml中其中常用的定义做一些简单的记录。
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
image :"mcr.microsoft.com/mssql/server"
contain_name :my-web01
restart: "no" # 默认,不自动重启 restart: always # 容器每次部署都会重新重启 restart: on-failure # 到容器异常退出会自动重启 restart: unless-stopped
ports: - "8000:80" #容器的80端口映射到8000端口
使用键值对的方式赋值
environment: RACK_ENV: development SHOW: ‘true‘ SESSION_SECRET:
使用数组的方式赋值,yaml文件约定是使用“ - ”表示集合
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
设置的语法格式为 [SOURCE:]TARGET[:MODE] ,与使用docker命令启动容器时使用 -v 标识写法类似。
volumes:
# 只设定路径,Docker创建匿名卷挂载到指定路径
- /var/lib/mysql
# 指定绝对路径使用bind mount到容器的路径
- /opt/data:/var/lib/mysql
# 可使用相对路径,相对于compose文件路径
- ./cache:/tmp/cache:ro
# 使用命名的卷(datavolume)挂载到容器路径
- datavolume:/var/lib/mysql
在compose的3.2版本后可以使用以下语法更详细的设置,与使用docker命令启动容器时使用 --mount 标识写法类似
... ...
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
... ...
volumes:
mydata:
services ... ... networks: my-net: ipv4_address: 168.18.0.4 # [可选]为其分配静态IP ... ...
networks: my-net: driver: bridge # 网络模式为bridge模式 ipam: config: - subnet: 168.18.0.0/24 # [可选]为其分配静态IP
services:
web:
build: .
#容器web的启动要依赖容器redis和容器db,即在创建容器是会依照顺序,先创建好redis和db容器在创建web容器
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
关于docker-compose.yml中详细的用法可以参考https://docs.docker.com/compose/compose-file/
docker-compose的常用的基本操作命令,和docker命令风格基本一致
更多的命令我们可以输入 docker-compose --help 查看。
为了简单起见,我们继续使用上一篇文章中使用的例子,这里我们使用docker-compose启动这两个容器(一个是aps.net core mvc应用,另一个是asp.net webapi应用)。
我们可以手动从0开始创建自己的docker-compose.yml文件,也可以使用ide帮我们自动生成。如果你使用的是vs2019,便可以通过以下的方式自动创建yml文件
之后“解决方案资源管理器”中会多出一个docker-compose的项目。
为了熟悉docker-compose,我们自己创建yml文件。用到的两个asp.net core项目不用修改任何代码和上篇文章一样,来到项目根目录创建“docker-compose.yml”文件。内容如下。
version: ‘3.4‘ services: mvc_demo: build: context: . dockerfile : ./ASP.NET Core3.x MVC Demo/Dockerfile container_name : mvcdemo environment: - ASPNETCORE_ENVIRONMENT=Development ports: - "8081:80" networks: - demo-net restart: always depends_on: - api_demo api_demo: build: context: . dockerfile : ./ASP.NET Core3.x WebApi Demo/Dockerfile container_name : webapidemo environment: - ASPNETCORE_ENVIRONMENT=Development networks: - demo-net restart: always networks: demo-net: driver : bridge
在定义好yml文件之后打开powershell,cd到项目根目录下。使用 config 命令检查下yml文件的合法性。
PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose config networks: demo-net: driver: bridge services: api_demo: build: context: D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo dockerfile: ./ASP.NET Core3.x WebApi Demo/Dockerfile container_name: webapidemo environment: ASPNETCORE_ENVIRONMENT: Development networks: demo-net: null restart: always mvc_demo: build: context: D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo dockerfile: ./ASP.NET Core3.x MVC Demo/Dockerfile container_name: mvcdemo depends_on: - api_demo environment: ASPNETCORE_ENVIRONMENT: Development networks: demo-net: null ports: - published: 8081 target: 80 restart: always version: ‘3.4‘
随后执行 build 命令构建镜像。
PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose build --force-rm
构建成功之后便可以使用 up 启动所有容器。
PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose up
不出意外,启动成功,并且控制台中会输出容器的Console日志(如果不希望这样可以在使用上面的 up 命令时加上 -d 的参数)
使用命令查看下镜像和容器的运行状况。
PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose images
Container Repository Tag Image Id Size --------------------------------------------------------------------------- mvcdemo aspnet-core3x-demo_mvc_demo latest 3f015f6687d5 214.1 MB webapidemo aspnet-core3x-demo_api_demo latest c3f6ad95d424 229.5 MB
PS D:\workspace\GitHub_local\ASP.NET-Core3.x-Demo> docker-compose ps
Name Command State Ports -------------------------------------------------------------------------- mvcdemo dotnet ASP.NET Core3.x MVC ... Up 0.0.0.0:8081->80/tcp webapidemo dotnet ASP.NET Core3.x Web ... Up 80/tcp
接着访问我们访问http://localhost:8081/,可以成功看到和上篇文章中实验结果一样页面和数据,说明容器启动并运行成功。
[2] Linux安装Docker-Compose:https://docs.docker.com/compose/install/
[3] Compose file:https://docs.docker.com/compose/compose-file/
[4] https://www.cnblogs.com/cgzl/p/10040590.html
我的Docker之路(五):使用Docker-Compose管理多容器应用
标签:通过 作用 source 印象 dem 80端口映射 一个 style 策略
原文地址:https://www.cnblogs.com/xhy0826/p/Docker-Compose-ASPNETCORE.html