• Docker (六)【Docker Compose】


    六、Docker Compose


    简介

    DockerFile build run 手动操作,单个容器

    Docker Compose 能够高效管理容器,运行多个容器

    官方文档https://docs.docker.com/compose/

    • 官方介绍

    Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

    Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

    Using Compose is basically a three-step process:

    1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
    2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
    3. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.
    • 翻译

    Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务。要了解有关 Compose 的所有功能的更多信息,请参阅功能列表

    Compose 适用于所有环境:生产、上线、开发、测试以及 CI 工作流程。您可以在常见用例中了解有关每个案例的更多信息

    使用 Compose 基本上是一个三步过程:

    1. 使用一个Dockerfile定义你的应用程序的环境,以便可以在任何地方复制它
    2. 定义构成你的应用程序的服务,docker-compose.yml 以便它们可以在隔离环境中一起运行
    3. 运行docker compose upDocker compose 命令启动并运行您的整个应用程序。您也可以docker-compose up使用 docker-compose 二进制文件运行
    • 作用:批量容器编排

    Compose 是 Docker 官方的开源项目,需要安装

    简单的Compose实例(docker-compose.yml)

    version: "3.9"  # optional since v1.27.0
    services:
      web:
        build: .
        ports:
          - "8000:5000"
        volumes:
          - .:/code
          - logvolume01:/var/log
        links:
          - redis
      redis:
        image: redis
    volumes:
      logvolume01: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 解析:有两个服务:web、redis,并且这两个服务的网络连接起来了

    6.1 安装 Compose

    下载地址:https://docs.docker.com/compose/install/

    国内地址:https://get.daocloud.io/#install-compose

    # 使用国内镜像下载,可根据自己的情况指定下载后的路径
    # /usr/local/bin/docker-compose
    curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    # 对二进制文件应用可执行权限
    sudo chmod +x /usr/local/bin/docker-compose
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    • 安装成功

    在这里插入图片描述

    6.2 快速开始(按照官方说明)

    官方文档:https://docs.docker.com/compose/gettingstarted/

    创建文件

    1. 为工程建立文件目录
     # 选择在 /home 目录下创建,可自定选择
     mkdir composetest
     cd composetest
    
    • 1
    • 2
    • 3
    1. 在当前文件下创建一个app.py文件,用于测试运行
    import time
    
    import redis
    from flask import Flask
    
    app = Flask(__name__)
    cache = redis.Redis(host='redis', port=6379)
    
    def get_hit_count():
        retries = 5
        while True:
            try:
                return cache.incr('hits')
            except redis.exceptions.ConnectionError as exc:
                if retries == 0:
                    raise exc
                retries -= 1
                time.sleep(0.5)
    
    @app.route('/')
    def hello():
        count = get_hit_count()
        return 'Hello World! I have been seen {} times.\n'.format(count)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    创建Dockerfile文件

    [root@vinjcent composetest]# pwd
    /home/composetest
    [root@vinjcent composetest]# vim Dockerfile
    # =================================文件内容=================================
    # syntax=docker/dockerfile:1
    FROM python:3.7-alpine
    WORKDIR /code
    ENV FLASK_APP=app.py
    ENV FLASK_RUN_HOST=0.0.0.0
    RUN apk add --no-cache gcc musl-dev linux-headers
    COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt
    EXPOSE 5000
    COPY . .
    CMD ["flask", "run"]
    # =================================文件内容=================================
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在Compose文件中定义所需的服务

    1. 在当前目录下创建一个docker-compose.yml文件
    version: "3.9"
    services:
      web:
        build: .
        ports:
          - "8000:5000"
      redis:
        image: "redis:alpine"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    使用Compose构建和运行app

    】需要从当前的工程文件下运行,必须有这四个文件

    # 运行命令,后台运行添加参数 -d 即可
     docker-compose up
    
    • 1
    • 2

    在这里插入图片描述

    • 查看正在运行的docker容器

    在这里插入图片描述

    • 测试访问web
    [root@vinjcent composetest]# curl localhost:8000
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    • 查看下载镜像

    在这里插入图片描述

    # 查看所有docker服务
    [root@vinjcent composetest]# docker service ls
    
    • 1
    • 2

    默认的服务名 文件名-服务名-num

    num 代表副本的数量

    • 项目中的内容都在同一个网络下(手动配置),网络自动生成

    在这里插入图片描述

    • 查看网络信息

    在这里插入图片描述

    在这里插入图片描述

    如果在同一个网络下,可以直接通过域名访问

    有效避免了服务出现故障之后,重新启动服务时,容器分配的域名发生改变(从172.27.0.2 => 172.27.0.3),保证HA(高可用)

    在这里插入图片描述

    停止运行Compose

    # 需要在容器外部的存放yml文件的目录下执行
    docker-compose down
    # 快捷键需要在容器启动的地方使用
    Ctrl + C	
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    6.3 Compose配置编写规则

    yml 规则

    主要有三层

    官方说明文档https://docs.docker.com/compose/compose-file/compose-file-v3/

    ##### 三层
    ### 第一层: 版本
    version: "" 	# 版本
    services:		# 多个服务配置
      redis: 		# 服务1
      	### 第二层: 服务配置(docker容器的配置)
        container_name: my-redis-container	# 容器名称
        images: redis:latest				# 镜像拉取
        build: .
        depends_on:		# 设置启动顺序依赖,先启动db服务,再启动redis
          - db
          - redis
        network			# 网络配置
        ...
      web: 			# 服务2
        ...
      mysql: 		# 服务3
        ...
    
    ### 第三层: 其它配置: 网络、卷、全局规则...
    volumes: 
    networks:
    configs: 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    在这里插入图片描述

    6.4 使用Compose一键部署博客

    用例测试

    # 在 /home 目录下创建一个文件目录 my_wordpress
    mkdir my_wordpress
    cd my_wordpress/
    
    # 创建一个docker-compose.yml文件
    mkdir docker-compose.yml
    # =====================================文件内容=====================================
    version: "3.9"
        
    services:
      db:
        image: mysql:5.7
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: somewordpress
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
        
      wordpress:
        depends_on:
          - db
        image: wordpress:latest
        volumes:
          - wordpress_data:/var/www/html
        ports:
          - "8000:80"
        restart: always
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_DB_NAME: wordpress
    volumes:
      db_data: {}
      wordpress_data: {}
    # =====================================文件内容=====================================
    # 过程有点久,耐心等待
    [root@vinjcent my_wordpress]# docker-compose up
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    测试访问:http://192.168.159.100:8000/

    • 注册自己的账号密码

    在这里插入图片描述

    在这里插入图片描述

    • 登录个人博客

    在这里插入图片描述

    在这里插入图片描述

    6.5 SpringBoot微服务上线

    1. 编写一个springboot项目
    2. dockerfile 构建镜像
    3. docker-compose.yml 编排项目
    4. 打包springboot项目,并将三个文件上传到Linux
    5. 运行命令 docker-compose up

    1)创建一个SpringBoot工程,导入依赖

        <dependencies>
        	
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-data-redisartifactId>
            dependency>
             
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2)编写controller

    package com.vinjcent.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SuppressWarnings("all")
    @RestController
    public class HelloController {
    
        @Autowired
        StringRedisTemplate redisTemplate;
    
        @GetMapping("/hello")
        public String hello() {
            long views = redisTemplate.opsForValue().increment("views");
            return "hello,vinjcnet,views: "+ views;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3)在该工程下创建一个Dockerfile文件

    FROM java:8
    
    COPY *.jar /app.jar
    
    CMD ["--server.port=3035"]
    
    EXPOSE 3035
    
    ENTRYPOINT ["java","-jar","/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4)在该工程下创建一个docker-compose.yml文件

    version: '3.9'
    services:
      vinjcentapp:
        build: .
        image: vinjcentapp:1.0
        depends_on:
          - redis
        ports:
          - "3035:3035"
      redis:
        image: "redis:alpine"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5)将该工程打成一个jar包

    在这里插入图片描述

    6)将三个文件上传到 Linux 上的文件夹中

    在这里插入图片描述

    7)在该目录下运行命令

    docker-compose up
    # 重新构建
    docker-compose up --build
    
    • 1
    • 2
    • 3

    8)测试访问

    curl localhost:3035
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    百趣代谢组学文献分享:茶褐素可促进胆固醇降解
    Leetcode刷题【hot100】盛最多水的容器
    Datax抽取mysql的bit类型数据
    Java保存数据同时支持 泰文,Emoji火星文
    陇剑杯2023线上wp
    git常用的几条命令介绍
    gabse 8a基础语法概念问题
    《深入分布式缓存 从原理到实践》笔记
    【附源码】Python计算机毕业设计蔬果批发网络平台
    使用ComposeDesktop开发一款桌面端多功能APK工具
  • 原文地址:https://blog.csdn.net/Wei_Naijia/article/details/126915964