当前位置:   article > 正文

【Docker】学习笔记(三)三剑客之 docker-compose文件书写项目多服务容器运行_docker compose 文件

docker compose 文件

简介

引言(需求)

  • 为了完成一个完整项目势必用到N多个容器配合完成项目中的业务开发,一旦引入N多个容器,N个容器之间就会形成某种依赖,也就意味着某个容器的运行需要其他容器优先启动之后才能正常运行;

容器的编排(先后运行顺序)至关重要

  • 无法从项目的角度将一组容器划分到一起,日后难点在于项目多服务器部署

项目角度:管理一组项目容器

功能

  • 实现对docker容器集群的快速编排(站在项目角度将一组容器集合在一起,对这组容器按照一定顺序进行启动)
  • 通过定义一个单独的 docker-compose.yml 配置文件来定义一组相关联的应用容器为一个项目

重要概念

  • 项目(project): 由一组关联的应用容器(服务)组成的一个完整业务单元,在docker-compose.yml文件中定义
  • 服务(services): 一个应用的多个容器,实际上可以包括若干个运行相同镜像的容器实例

docker-compose安装

安装

apt安装

sudo apt install -y docker-compose
  • 1

pip安装

sudo pip3 install docker-compose
  • 1
验证是否安装成功及其版查询版本
docker-compose -v
# 输出信息如下:
docker-compose version 1.25.0, build unknown
  • 1
  • 2
  • 3

docker-compose 与docker-engine 版本兼容关系

# 查看本地版本
docker -v
# Docker version 24.0.7
# docker-compose 指定vision版本3.2,意味着部署服务器docker engin引擎版本至少高于17.04.0
# 具体对应关系官网查看
# https://docs.docker.com/compose/compose-file/compose-file-v3/

# 版本不支持会报如下错误
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

案例一(文件基本结构)

  • 创建一个工程项目目录
mkdir -p ems/docker
cd ems/docker
  • 1
  • 2
  • 在项目根目录下创建配置文件 docker-compose.yml
# docker-compose 版本号
version: "3.3"

# 一个应用服务
services:
  tomcat01:
    # 利用本地仓库已经构建好的镜像,如果没找到会自动尝试hub上pull
    image: tomcat:8.0
    # 容器名称 --name
    container_name: tomcat01
    # 做端口映射 -p
    ports:
      - "8080:8080"
      # - "8081:8081" # 可以映射多个端口
  tomcat02:
    image: tomcat:8.0
    container_name: tomcat02
    ports: 
      - "8081:8080"
  
  redis01:
    image: redis:5.0.12
    container_name: redis01
    ports:
      - "6379:6379"

  mysql01:
    image: mysql:5.6
    container_name: mysql01
    # 给当前容器指定环境参数 类似于 docker run -e MYPASSWORD=root redis:5.0.12 -d
    ports:
      - "3306:3306"
    environment: 
      - "MYSQL_ROOT_PASSWORD=ROOT"  # 推荐写法
      - MYSQL_ROOT_PASSWORD:root
    # 指定同步数据卷 -v ./data路径一定要先存在
    volumes:
      # 相对或绝对路径
      # - ./data:/var/lib/mysql
      
      # 别名挂载数据卷一定要先申明
      # ERROR: Named volume "data:/var/lib/mysql:rw" is used in service "mysql01" but no declaration was found in the volumes section
      - data:/var/lib/mysql

# 申明数据卷别名
volumes:
  data:
  • 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
  • 43
  • 44
  • 45
  • 46
  • 47
  • 启动 docker-compose 一组服务
# -d 表示后台启动容器
docker-compose up -d
# 直接bash面板启动
docker-compose up
  • 1
  • 2
  • 3
  • 4
  • 访问一下tomcat

http://192.168.18.224:8080/

docker-compose down 清除上一次的缓存配置(连同创建的容器一起清除)

docker-compose 常用服务配置命令详解

官方参考文档

https://docs.docker.com/compose/compose-file/build/

官方中文文档

  • Dockerfile 文件
# 指定基础镜像
FROM openjdk:8-jre
# ARG特殊,他不是有效指令,可以在FROM之前
ARG buildno
ARG password

# 暴露端口(可以在容器服务中暴露)
EXPOSE 8081
# 设置环境变量
ENV APP_PATH=/apps
# 指定工作目录
WORKDIR ${APP_PATH}
# 拷贝文件到镜像中
COPY apps.jar ${APP_PATH}
# 使用数据卷
VOLUME ${APP_PATH}

# 运行jar包 java -jar apps.jar
ENTRYPOINT [ "java", "jar" ]
CMD [ "apps.jar" ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

默认情况下,Dockerfile中指定的选项(例如,CMD,EXPOSE,VOLUME,ENV)都被遵守,不需要在docker-compose.yml中再次指定它们

  • docker-compose.yml 文件
version: "3.3"
services:
  tomcat01:
    image: tomcat:8.0
    container_name: tomcat01
    ports:
      - "8080:8080"
    networks:
      - sensiz
    restart: always
  apps:
    # 通过Docjerfile文件指定镜像
    # build: ./   # 可以直接指定,其他参数默认
    build:
      # 指定dockerfile上下文目录,也可以是git仓库的URL
      context: ./
      # 指定Dockerfile的文件名,如果为默认值Dockerfile可以不写
      dockerfile: Dockerfile
      # # 给docker中传入环境变量参数
      # args:
      #   buildno: 1
    ports:
      - 8081:8080
    cap_add:
      - ALL
    command: ["test.jar"]
    # 先启动顺序tomcat01 mysql resdi,再启动apps
    depends_on:
      - tomcat01
      - mysql01
      # - redis
    networks:
      - sensiz
  mysql01:
    image: mysql:5.6
    # 数据卷别名要首先申明
    volumes:
      - data:/var/lib/mysql
    ports:
      - "3303:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
    # env_file: 
    #   - ./ENV_FILE.env
    expose:
      - 8888

# 声明数据卷别名
volumes:
  data:
# 申明使用的网桥
networks:
  sensiz:
  • 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
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
image

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/74088
推荐阅读
相关标签