Docker Compose


文章目录

  • [Docker Compose](https://docs.docker.com/compose/)
  • 一. 简介
  • 1. 作用
  • 2. [官方文档](https://docs.docker.com/compose/)
  • 3. 任务编排解决了什么
  • 二. 初体验
  • 1. docker核心概念
  • 2. 三个步骤
  • 3. Compose常用命令
  • 4. 使用Compose
  • ①.编写docker-compose.yml文件
  • ②.编写完docker-compose.yml后需要对于springboot.yml或者bootstrap.yml文件进行改写


一. 简介

  • Docker Compose是Docker公司推出的工具软件, 可以管理多个Docker容器组成一个应用. 你需要定义一个YAML格式的配置文件docker-compose.yml, 写多个容器之间的调用关系. 然后 只要一个命令, 就能同时启动/关闭这些容器

1. 作用

  • docker建议我们每一个容器中只运行一个服务, 因为dockers容器本身占用资源极少, 所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?
  • 如果我需要同时部署好多个服务, 难道要每个服务单独写Dockerfile然后再构建镜像, 构建容器, 这样很累, 所以docker官方给我们提供了docker-compose多服务部署的工具
  • eg: 要实现一个Web微服务项目, 除了Web服务容器本身, 往往还需要再加上后端的数据库mysql服务容器, redis服务器, 注册中心eureka/nacos甚至还包括负载均衡容器等等…
  • Compose允许用户通过单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为 一个项目(project)
  • 可以很容易的用一个配置文件定义一个多容器的应用, 然后使用一个命令安装这个应用的所有以来, 完成构建. Docker-Compose解决了容器于容器之间如何管理编排的问题

2. 官方文档

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.
  • Dockerfile保证我们的项目在任何地方可以运行
  1. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  • services什么是服务
  • dockers-compose.yml这个文件怎么写
  1. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using Compose standalone(docker-compose binary).
  • 启动项目
  • Compose.yml(官方例子)
version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    depends_on:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
  • 安装如果使用的是dockerDesktop那么是自带的, 其他需要根据官网操作自行安装

3. 任务编排解决了什么

  • 首先需要决定容器启动的启动顺序
  • 多个run命令
  • 容器间的启停或当即, 有可能导致IP地址对应的容器实例变化, 映射出错, 要么生产IP写死(可以但是不推荐), 要么通过服务调用

二. 初体验

官网地址

1. docker核心概念

  • 文件
    docker-compose.yml
  • 两个要素
    服务: 一个一个应用容器实力
    工程: 由一组关联的应用容器组成的一个完整业务单元, 再dockers-compose.yml文件中定义

2. 三个步骤

  • 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  • 使用docker-compose.yml定义一个完整业务单元, 安排好整体应用中的各个容器服务
  • 最后, 执行docker-compose up命令来启动并运行整个应用程序, 完成一键部署上线

3. Compose常用命令

Compose常用命令

docker-compose -h

查看帮助命令

docker-compose up

启动所有dockers-compose服务

docker-compose up -d

启动所有dockers-compose服务并后台运行

docker-compose down

停止并删除容器, 网络, 卷, 镜像

docker-compose exec [yml里面的服务id]

进入容器实力内部docker-compose exec docker-compose.yml文件中写的服务id /bin/bash

docker-compose ps

展示当前docker-compose编排过的运行的所有容器

docker-compose top

展示当前docker-compose编排过的容器进程

docker-compose logs [yml里面的服务id]

查看容器输出日志

docker-compose config

检查配置

docker-compose config -q

检查配置, 有问题才有输出

docker-compose restart

重启服务

docker-compose start

启动服务

docker-compose stop

停止服务

4. 使用Compose

①.编写docker-compose.yml文件

举例解释

#  docker-compose版本
version: "3.9"  # optional since v1.27.0

# 表示多个服务
services:
  # 自定义服务名只要不冲突就行	
  web:
	# 这里注意build和image只能选择一个使用
	# build: 可以在后面直接填写绝对路径和相对路径, 呀可以使用context
    build: 
	   # 这里注意如果这里写了的话就不要再build后面写东西了
	   context: ./dir
	   # 如果不是默认名字的Dockerfile需要指定文件名
	   dockerfile: Dockerfile-alternate
	   
	# 镜像名:tag 确保你docker images中有对应的镜像
    image: azang:1.0
	# 容器名->如果不指定容器名字的话docker会在前面拼上当前路径后面会按照镜像拼接顺序01,02,03.....
	container_name: azang-server
	# 映射端口号
    ports:
      - "8000:5000"
	# 挂载卷
    volumes:
      - .:/code
      - logvolume01:/var/log
    # docker网络名->如果没有的话会创建一个Docker网络
    networks:
      - azang_net
	# 此容器依赖于redis启动
    depends_on:
      - redis
      - mysql

  # 另外的服务(redis)
  redis:
    image: redis:6.0.8
    ports:
      - 6379:6379
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    network:
      - azang_net
	# 启动命令
    command: redis-server/etc/redis/redis.conf

  # 另外的服务(mysql)
  mysql:
    image: mysql:8.0
    ports:
      - 3306:3306
    volumes:
      - /app/mysql/db:/var/lib/mysql
      - /app/mysql/conf/my.conf:/etc/my.cnf
      - /app/mysql.init:/docker-entrypoint-initdb.d
    network:
      - azang_net
	# 启动命令
    command: --default-authentication-plugin=mysql_native_password # 解决低版本外部无法访问
networks:
	azang_net:

②.编写完docker-compose.yml后需要对于springboot.yml或者bootstrap.yml文件进行改写

可以将之前写死的mysql或者redis以及其他的中间件或者数据库的ip从写死ip换成回应的服务名, 这样项目启动的时候就不会关心具体的ip而关心的是在同docker-net下容器(这里dockers-compose中服务名字和项目yml中的ip对应的应用的名字是需要一一对应的再次强调)

之后就可以根据上面的常用命令进行启动了