zoukankan      html  css  js  c++  java
  • 我的Docker之路(五):使用Docker-Compose管理多容器应用

    前一篇实现了容器间的通信,像这样由两个乃至多容器构成的应用需要我们一步一步用docker命令搭建起来。由于Docker的迁移性,换一个有Docker的环境执行按相同的顺序执行相同的docker命令便可搭建其一个相同的应用。但是在执行docker命令时某个指令执行错误,某个变量设置错误,某个命令执行的顺序出错等等情况都会导致应用搭建失败。更或是如果应用需要启动很多个容器,每个容器都有相应的网络,卷等配置,容器间还存在依赖,这样的应用搭建起来就会十分的繁琐。而且在不同的环境上去搭建都是重复性的工作,那只要搭建一次岂不就是重复性的受罪嘛。

    Docker-Compose简介

    遇到上面说的情况,docker-compose便可以解救我们进行大量重复性的手工作业。docker-compose是一个用于定义与启动多容器应用的工具,通过docker-compose,我们可以通过一个yaml文件来配置要用到的所有的服务(容器),并且容器是如何构建、用到哪些卷、用什么网络、映射哪个端口或依赖什么都可以定义。在定义之后,通过一句命令便可以运行起所有的服务。有了docker-compose之后就不用再担心重复的搭建多容器应用了。

    首先需要区分两个概念,docker-compose中服务(service)可以理解成我们要运行的容器,而项目(project)是由一个docker-compose.yml文件定义的整个要运行的容器集合。

    简单总结下docker-compose的作用

    1. 帮我们按照制定好的规则构建与启动服务
    2. 管理整个应用的生命周期
    3. 查看每个容器运行的日志
    4. 单独控制yaml文件中定义的某个容器,包括停止、重启、扩容等
    5. 可以使用项目名称进行项目隔离,可以使用docker-compose在同一台主机上重复搭建多个应用项目,并且应用之间相互隔离单独管理

    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

    docker-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文件中一般分为四个部分

    1.  version :指明compose文件格式的版本,当前使用的是3.x的版本
    2.  services :中定义要用到的容器集合,定义容器所有相关的配置
    3.  volumes :应用要用到的所有数据卷
    4.  networks :应用要使用连接的网络及其配置

    下面对docker-compose.yml中其中常用的定义做一些简单的记录。

      build :指定构建镜像用的dockerfile路径

    • build: . 就表示当前路径下的文件名为“Dockerfile”的文件
    • 或者我们可以指定具体路径和具体dockerfile文件名,context中指定工作目录,dockerfile指定具体的dockerfile文件名,args后跟构建镜像时的参数
    build:
          context: ./dir
          dockerfile: Dockerfile-alternate
          args:
            buildno: 1

     image:指定创建容器的镜像

    image :"mcr.microsoft.com/mssql/server"

    container_name:给创建的容器取名

    contain_name :my-web01

    restart:指定重启的策略

    restart: "no"    # 默认,不自动重启
    restart: always    # 容器每次部署都会重新重启
    restart: on-failure  # 到容器异常退出会自动重启
    restart: unless-stopped

    ports:映射主机的端口

     ports:
       - "8000:80"    #容器的80端口映射到8000端口

    environment:设置环境变量

    使用键值对的方式赋值

    environment:
      RACK_ENV: development
      SHOW: 'true'
      SESSION_SECRET:

    使用数组的方式赋值,yaml文件约定是使用“ - ”表示集合

    environment:
      - RACK_ENV=development
      - SHOW=true
      - SESSION_SECRET

    volumes :指定容器使用的卷或者bind mount

    设置的语法格式为 [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:

    networks:指定容器使用的网络

    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

    depend_on:指定当前容器的依赖容器

    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-compose的常用的基本操作命令,和docker命令风格基本一致

    • docker-compose build 启动构建,构建在yml文件中定义的所有镜像
    • docker-compose up ,构建镜像成功之后,执行该命令便可根据镜像启动容器
    • docker-compose down ,停止由up命令启动的所有容器
    • docker-compose ps ,列出由up命令启动的所有容器
    • docker-compose images ,由build命令构建的所有镜像
    • docker-compose logs ,查询日志
    • docker-compose start <service> ,启动yml中定义的单个服务,使用服务名,不是容器名
    • docker-compose stop <service> ,停止yml中定义的单个服务
    • docker-compose rm <service> ,停止已停止的某个服务
    • docker-compose scale <service1>=3 <service2>=3 ,设置某个服务要启动的容器的个数
    • docker-compose config 验证yml文件有效性

    更多的命令我们可以输入 docker-compose --help 查看。

    实验:使用Docker-Compose管理多容器应用

    为了简单起见,我们继续使用上一篇文章中使用的例子,这里我们使用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:workspaceGitHub_localASP.NET-Core3.x-Demo> docker-compose config
    
    networks:
      demo-net:
        driver: bridge
    services:
      api_demo:
        build:
          context: D:workspaceGitHub_localASP.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:workspaceGitHub_localASP.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:workspaceGitHub_localASP.NET-Core3.x-Demo> docker-compose build --force-rm 

    构建成功之后便可以使用 up 启动所有容器。

    PS D:workspaceGitHub_localASP.NET-Core3.x-Demo> docker-compose up

    不出意外,启动成功,并且控制台中会输出容器的Console日志(如果不希望这样可以在使用上面的 up 命令时加上 -d 的参数)

    使用命令查看下镜像和容器的运行状况。

    PS D:workspaceGitHub_localASP.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:workspaceGitHub_localASP.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/,可以成功看到和上篇文章中实验结果一样页面和数据,说明容器启动并运行成功。

    参考文献:

    [1] https://docs.microsoft.com/zh-cn/dotnet/architecture/microservices/docker-application-development-process/docker-app-development-workflow

    [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

  • 相关阅读:
    XCode5中新建工程后强制使用了ARC,如何去掉?
    面向对象程序的设计原则--Head First 设计模式笔记
    ios控件自定义指引
    iOS UITableViewDelegate && UITableViewDataSource 执行顺序
    awakeFromNib方法和viewDidLoad方法区别
    ios 视图的旋转及应用
    线段树模板 (刘汝佳)
    poj 3468
    hdu 2829(四边形优化 && 枚举最后一个放炸弹的地方)
    poj 3517(约瑟夫环问题)
  • 原文地址:https://www.cnblogs.com/xhy0826/p/Docker-Compose-ASPNETCORE.html
Copyright © 2011-2022 走看看