docker学习(二十二、终篇,docker-compose)

文章目录

  • 一、介绍docker-compose
    • 简介
    • 举个栗子
      • 以往部署
      • docker-compose部署
  • 二、安装docker-compose
    • 1.从github上下载docker-compose文件安装
    • 2.pip安装
  • 三、应用docker-compose
  • 四、docker-compose.yml关键字
  • 五、docker-compose linux操作命令
  • Docker篇结束

一、介绍docker-compose

简介

当涉及到多个容器的部署和管理时,Docker Compose 是一个非常有用的工具。它能够简化和自动化多容器应用程序的配置、启动和停止过程

通过一个单一的 YAML 文件,您可以定义多个容器、它们之间的连接以及其他配置选项。然后,使用一个简单的命令就能够启动、停止和管理整个应用程序。

Docker Compose 的主要好处包括:

  • 简化应用程序部署:通过 Docker Compose,您可以将所有容器的配置信息集中在一个文件中,这样可以大大简化应用程序的部署过程。只需一条命令,即可轻松地启动整个应用程序。

  • 容器编排和连接:Docker Compose 允许您定义容器之间的连接和依赖关系。您可以指定容器之间的网络连接、共享卷、环境变量等。这样,您可以轻松地搭建复杂的多容器应用程序,并确保它们之间的正确交互。

  • 可移植性和一致性:使用 Docker Compose,您可以轻松地在不同的环境中运行应用程序,例如开发、测试和生产环境。由于所有的配置都在一个文件中,您可以确保应用程序在不同环境中的一致性,减少了由于环境差异导致的问题。

  • 扩展性和弹性:Docker Compose 允许您根据需要扩展容器的数量,以满足应用程序的负载需求。通过简单地增加副本数,您可以快速地扩展整个应用程序,并确保高可用性和负载均衡。

总之,Docker Compose 是一种简化多容器应用程序部署和管理的工具,它提供了易用性、可移植性和弹性等多个好处。通过定义和管理应用程序的配置文件,您可以轻松地构建、部署和管理复杂的容器化应用程序。

举个栗子

以往部署

假设要部署一整个项目,前端、后端、数据库、nginx。那我们至少要构建三个镜像,分别启动,调试等。

  • 数据库:
    1. docker pull mysql/redis/……
    2. docker run
  • 后端(单体服务还好,微服务的,那就循环吧~):
    1. docker build -t xxx .
    2. docker run
      ……

这一波操作下来,人都麻了。
服务器没问题还好,一旦出问题了,天台见~

docker-compose部署

只需创建一个docker-compose.yml文件,在yml中将上面操作,配置一遍即可统一管理了。

version: '3.8'

services:
  # 前端应用
  frontend:
    image: nginx:latest
    ports:
      - "80:80"  # 将宿主机的80端口映射到容器的80端口
    networks:
      - manage-network

  # 后端应用
  backend:
    image: your-java-backend-image:latest
    networks:
      - manage-network

  # MySQL数据库
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example  # 设置数据库的root用户密码
      MYSQL_DATABASE: your_database  # 设置数据库名称
      MYSQL_USER: your_username  # 设置数据库用户名
      MYSQL_PASSWORD: your_password  # 设置数据库用户密码
    networks:
      - manage-network

  # Redis缓存服务器
  redis:
    image: redis:latest
    ports:
      - "6379:6379"  # 将宿主机的6379端口映射到容器的6379端口
    networks:
      - manage-network

networks:
  manage-network:
    driver: bridge  # 使用bridge驱动创建自定义网络

配置好后,只需一个命令即可启动全部。

docker-compose up
# 或者,这个是版本不通,写法不同
docker compose up

配置文件要备份好~

二、安装docker-compose

1.从github上下载docker-compose文件安装

sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

添加可执行权限

sudo chmod +x /usr/local/bin/docker-compose

测试安装结果

docker-compose --version

出现版本号即为成功

2.pip安装

sudo pip install docker-compose

三、应用docker-compose

  • 创建一个前端vue、后端python、数据库mysql+redis、使用nginx代理的项目;
  • 将日志及数据、配置文件等挂载到宿主机;
  • 数据库的环境变量也有直接配置到文件中。

详细docker-compose.yml配置如下:

version: '3.8'

services:
  # 前端Vue应用
  frontend:
  	build:
		context: ./frontend
		dockerfile: Dockerfile
    image: nginx:latest
    ports:
      - "80:80"  # 将宿主机的80端口映射到容器的80端口
    volumes:
      - ./frontend:/usr/share/nginx/html  # 将宿主机的./frontend目录挂载到容器的/usr/share/nginx/html目录
      - ./frontend-logs:/var/log/nginx  # 将nginx日志目录挂载到宿主机的./frontend-logs目录
      - ./nginx.conf:/etc/nginx/nginx.conf  # 将nginx配置文件挂载到宿主机的./nginx.conf文件
    networks:
      - manage-network

  # 后端Python应用
  backend:
	build:
		context: ./backend
		dockerfile: Dockerfile
    image: python:latest
    volumes:
      - ./backend:/app  # 将宿主机的./backend目录挂载到容器的/app目录
      - ./backend-logs:/app/logs  # 将后端应用的日志目录挂载到宿主机的./backend-logs目录
    networks:
      - manage-network

  # MySQL数据库
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example  # 设置数据库的root用户密码
      MYSQL_DATABASE: your_database  # 设置数据库名称
      MYSQL_USER: your_username  # 设置数据库用户名
      MYSQL_PASSWORD: your_password  # 设置数据库用户密码
    volumes:
      - ./mysql-data:/var/lib/mysql  # 将数据库数据目录挂载到宿主机的./mysql-data目录
      - ./mysql-logs:/var/log/mysql  # 将数据库的日志目录挂载到宿主机的./mysql-logs目录
    networks:
      - manage-network

  # Redis缓存服务器
  redis:
    image: redis:latest
    ports:
      - "6379:6379"  # 将宿主机的6379端口映射到容器的6379端口
    volumes:
      - ./redis-data:/data  # 将Redis数据目录挂载到宿主机的./redis-data目录
      - ./redis-logs:/var/log/redis  # 将Redis的日志目录挂载到宿主机的./redis-logs目录
    networks:
      - manage-network

networks:
  manage-network:
    driver: bridge  # 使用bridge驱动创建自定义网络

输入如下命令即可构建并运行上面的全部容器

docker-compose up -d
docker ps

docker-compose.yml文件存放目录

manage-app/
├── docker-compose.yml
├── frontend/
│   ├── index.html
│   ├── main.js
│   ├── Dockerfile
│   └── ...
├── backend/
│   ├── app.py
│   ├── requirements.txt
│   ├── Dockerfile
│   └── ...
├── mysql-data/
│   ├── db_1.frm
│   ├── db_1.MYD
│   ├── db_1.MYI
│   └── ...
└── redis-data/
    ├── dump.rdb
    └── ...

四、docker-compose.yml关键字

  • version: 指定 Docker Compose 文件的版本号,用来指示采用哪个版本的 Compose 文件语法。

  • services: 定义需要运行的各个服务,每个服务可以包括构建配置、端口映射、环境变量等信息。

  • build: 指定构建镜像所需的上下文路径和 Dockerfile 路径,用于构建自定义镜像。

  • image: 指定使用的镜像名称,可以是官方镜像或自定义构建的镜像。

  • ports: 定义服务的端口映射,将容器内部的端口映射到宿主机上的端口。

  • volumes: 挂载卷的配置,将宿主机上的目录或文件挂载到容器内部,用于数据持久化或配置文件共享。

  • environment: 设置容器的环境变量,用来传递配置信息给容器内的应用程序。

  • networks: 定义服务所属的网络,可以是默认网络或自定义网络,用于连接不同的服务。

  • depends_on: 指定服务依赖关系,用来定义服务启动的顺序或依赖关系。

  • command: 定义容器启动时执行的命令,用于覆盖镜像中默认的启动命令。

  • restart: 定义容器的重启策略,可以设置为无、总是、根据失败次数等不同的重启策略。

  • stop_grace_period: 定义容器停止的优雅期限,超过该期限后强制终止容器。

五、docker-compose linux操作命令

  • docker-compose up: 启动 Docker Compose 文件中定义的服务。如果首次运行,会构建镜像并启动容器;如果已经存在镜像和容器,则直接启动。

  • docker-compose up -d: 在后台启动 Docker Compose 文件中定义的服务,不会显示容器的输出日志。

  • docker-compose down: 停止并移除 Docker Compose 文件中定义的服务,同时删除相关的容器、网络和卷等资源。

  • docker-compose ps: 列出当前 Docker Compose 文件中定义的所有服务以及它们的状态。

  • docker-compose logs: 显示 Docker Compose 文件中定义的服务的日志输出。

  • docker-compose restart: 重启 Docker Compose 文件中定义的服务。

  • docker-compose build: 根据 Docker Compose 文件重新构建服务所需的镜像。

  • docker-compose exec : 在指定的服务容器内部执行命令。

  • docker-compose pull: 拉取 Docker Compose 文件中定义的服务所需的镜像。

  • docker-compose config: 验证 Docker Compose 文件的语法是否正确,并显示解析后的 Compose 文件内容。

Docker篇结束

如果能坚持学习到这里,那证明你真的很了不起!持之以恒是成功的关键。

通过不断学习和努力,已经掌握了 Docker 的基本知识,这将成为在软件开发和部署领域中的重要技能。接下来只需要保持这种积极的态度,持续学习和实践,将在这个领域中获得更多的成就和认可。

请记住,成功是一个长期的过程,而不是一蹴而就的事情。任何困难和挑战都应该被看作是成长的机会,不断克服它们终将变得更加强大和自信。

愿每一个人在未来的学习和职业道路上都能取得更大的成就!加油!

你可能感兴趣的:(docker,docker,学习,容器)