docker-compose教程

1. docker-compose是什么?

1. 1 简介

compose、machine 和 swarm 是docker 原生提供的三大编排工具。

简称docker三剑客。Compose 项目是 Docker 官方的开源项目,定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:

【官方解释】:

  • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

【个人理解】:

  • 服务是一个应用程序的逻辑单元,它可以由一个或多个容器组成。每个服务都拥有自己的配置,包括镜像、端口映射、环境变量、卷和网络等。

  • 项目是一个包含多个服务的集合。它定义了应用程序的整体架构,并提供了管理所有服务的工具。

【服务和项目的例子】

  • 一个 Web 应用程序可以包含以下服务:

  • web:运行应用程序代码的服务。

  • db:运行数据库的服务。

  • cache:运行缓存服务的服务。

  • 一个 Docker Compose 项目可以包含以下文件:

  • docker-compose.yml:定义所有服务的配置文件。

  • Dockerfile:构建服务镜像的配置文件。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

1.2 Docker Compose, Docker Swarm 和 Kubernetes 对比

Docker Compose

  • 单机部署 :Docker Compose 通常用于单机部署,因为它没有集群管理功能。
  • 简单易用:Docker Compose 使用 YAML 文件定义应用,语法简单易懂,易于上手。
  • 开发和测试:Docker Compose 非常适合在开发和测试环境中使用,因为它可以快速启动和停止应用,并方便地进行配置更改。

Docker Swarm

  • 集群管理 :Docker Swarm 是一个集群管理工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。
  • 服务发现和负载均衡 :Docker Swarm 提供服务发现负载均衡功能,可以自动发现集群中的服务并进行负载均衡。
  • 高可用性 :Docker Swarm 可以自动重启失败的容器,并确保应用的高可用性
  • 生产环境部署:Docker Swarm 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。

Kubernetes

  • 集群管理 :k8s 是一个集群管理工具,可以管理多个 Docker 主机,并把它们作为一个集群来使用。
  • 功能强大 :Kubernetes 是一个功能强大的容器编排工具,它提供了丰富的功能,例如服务发现负载均衡自动扩展滚动更新健康检查等。
  • 高可用性 :Docker Swarm 可以自动重启失败的容器,并确保应用的高可用性
  • 复杂性高:Kubernetes 的学习曲线比较陡峭,需要掌握大量的概念和配置选项。
  • 生产环境部署:Kubernetes 非常适合在生产环境中使用,因为它可以提供高可用性、可扩展性和容错性。

总结

特征 Docker Compose Docker Swarm Kubernetes
功能 简单 中等 强大
复杂性 中等
部署方式 单机 集群 集群
服务发现
负载均衡
高可用性
滚动更新、健康检查、高级调度等
适用场景 开发和测试 生产环境 生产环境

2. docker compose安装

2.1 二进制包

shell 复制代码
# 1. 安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

   # 国内用户可以使用以下方式加快下载
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

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

# 2. 卸载
$ sudo rm /usr/local/bin/docker-compose

2.2 pip安装

shell 复制代码
# 1. 安装
$ sudo pip install -U docker-compose

# 2. 卸载
$ sudo pip uninstall docker-compose

# 3. 查看版本
docker-compose --versiom

3. compose模版文件

Docker Compose YAML 文件解释

yaml 复制代码
version: '3'

services:
  mysql:
    build:
      context: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin
    restart: always
    container_name: mysql
    volumes:
      - /data/edu-bom/mysql/test:/var/lib/mysql
    image: mysql/mysql:5.7
    ports:
      - 3306:3306
    networks:
      net:

  eureka:
    build:
      context: ./edu-eureka-boot
    restart: always
    ports:
      - 8761:8761
    container_name: edu-eureka-boot
    hostname: edu-eureka-boot
    image: edu/edu-eureka-boot:1.0
    depends_on:
      - mysql
    networks:
      net:

networks:
  net:

volumes:
  vol:

详细解释:

  1. version: 指定 Docker Compose 文件的版本。此处为 3。

  2. services: 定义服务部分,包含应用程序的不同组件。

  3. mysql: 定义名为 "mysql" 的服务,用于构建和运行 MySQL 数据库。

  4. build: 指示 Docker Compose 从 ./mysql 目录构建 Docker 镜像。

  5. environment: 设置环境变量,包括 MySQL 数据库的 root 用户密码。

  6. restart: 指定容器在意外停止后自动重启。

  7. container_name: 指定容器的名称为 "mysql"。

  8. volumes: 将主机上的 /data/edu-bom/mysql/test 目录挂载到容器的 /var/lib/mysql 目录,用于存储数据库数据。

  9. image: 指定使用官方的 MySQL 5.7 镜像。

  10. ports: 将容器的 3306 端口映射到主机的 3306 端口,以便访问 MySQL 数据库。

  11. networks: 将 "mysql" 服务连接到名为 "net" 的网络。

  12. eureka: 定义名为 "eureka" 的服务,用于构建和运行 Eureka 服务发现服务器。

  13. build: 指示 Docker Compose 从 ./edu-eureka-boot 目录构建 Docker 镜像。

  14. restart: 指定容器在意外停止后自动重启。

  15. ports: 将容器的 8761 端口映射到主机的 8761 端口,以便访问 Eureka 服务发现服务器。

  16. container_name: 指定容器的名称为 "edu-eureka-boot"。

  17. hostname: 指定容器的主机名为 "edu-eureka-boot"。

  18. image: 指定使用 edu/edu-eureka-boot:1.0 镜像。

  19. depends_on: 指定 "eureka" 服务依赖于 "mysql" 服务,确保数据库启动后再启动 Eureka 服务。

  20. networks: 将 "eureka" 服务连接到名为 "net" 的网络。

  21. networks: 定义名为 "net" 的网络。

  22. volumes: 定义名为 "vol" 的卷,但未被任何服务使用。

4. docker-compose命令

up

shell 复制代码
docker-compose up [options] [SERVICE...]

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务启动服务,并关联服务相关容器的一系列操作。

可以说,大部分时候都可以直接通过该命令来启动一个项目。

如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。

默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容。如果用户不希望容器被停止并重新创建,可以使用 docker-compose up --no-recreate这样将只会启动处于停止状态的容器,而忽略已经运行的服务 。如果用户只想重新部署某个服务,可以使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不会影响到其所依赖的服务。

选项:

  • -d 在后台运行服务容器。
    - --no-color 不使用颜色来区分不同的服务的控制台输出。
  • --no-deps 不启动服务所链接的容器。
  • --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
  • --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
  • --no-build 不自动构建缺失的服务镜像。
  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

start

shell 复制代码
docker-compose start [SERVICE...]

启动已经存在的服务容器

down

shell 复制代码
docker-compose down

此命令将会停止 up 命令所启动的容器,并移除网络

stop

shell 复制代码
docker-compose stop [options] [SERVICE...]

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

选项:

  • -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。

ps

shell 复制代码
docker-compose ps [options] [SERVICE...]

列出项目中目前的所有容器。

选项:

  • -q 只打印容器的 ID 信息。

logs

shell 复制代码
docker-compose logs [options] [SERVICE...]

查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。

build

shell 复制代码
docker-compose build [options] [SERVICE...]

构建(重新构建)项目中的服务容器。

服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db

可以随时在项目目录下运行 docker-compose build 来重新构建服务。

选项:

  • --force-rm 删除构建过程中的临时容器。
  • --no-cache 构建镜像过程中不使用 cache(这将加长构建过程)。
  • --pull 始终尝试通过 pull 来获取更新版本的镜像。

restart

shell 复制代码
docker-compose restart [options] [SERVICE...]

重启项目中的服务

选项:

  • -t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。

rm

shell 复制代码
docker-compose rm [options] [SERVICE...]

删除所有停止状态的)服务容器。推荐先执行docker-compose stop 命令来停止容器。

选项:

  • -f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
  • -v 删除容器所挂载的数据卷。

top

shell 复制代码
docker-compose top

查看各个服务容器内运行的进程。

images

shell 复制代码
docker-compose images

列出 Compose 文件中包含的镜像。

run

shell 复制代码
docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

在指定服务上执行一个命令。

使用举例:

1.在web服务器运行python脚本

shell 复制代码
docker-compose run web python my_script.py

2. 在 Web 服务容器中运行 shell 命令,并映射端口,设置环境变量,使用卷,连接网络:

shell 复制代码
docker-compose run -p 8080:80 -e MY_VAR=value -v my_volume:/path/to/file/in/container --network my_network web bash

这将在 "web" 服务的容器中打开一个交互式 shell,并进行以下操作:

  • 将容器的 80 端口映射到主机的 8080 端口。
  • 设置环境变量 MY_VAR 的值为 "value"。
  • 将名为 "my_volume" 的卷挂载到容器中的 /path/to/file/in/container 路径。
  • 连接到名为 "my_network" 的网络。

3. 在数据库容器中运行 SQL 命令,使用环境变量,连接网络:

shell 复制代码
docker-compose run -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=password --network my_network db psql -U postgres mydatabase

这将在 "db" 服务的容器中使用 PostgreSQL 客户端连接到 "mydatabase" 数据库,并进行以下操作:

  • 设置环境变量 POSTGRES_USER 的值为 "postgres"。
  • 设置环境变量 POSTGRES_PASSWORD 的值为 "password"。
  • 连接到名为 "my_network" 的网络。

4. 在 Web 服务容器中运行 Python 脚本,使用卷,连接网络:

shell 复制代码
docker-compose run -v my_volume:/path/to/file/in/container --network my_network web python my_script.py

这将在 "web" 服务的容器中运行名为 "my_script.py" 的 Python 脚本,并进行以下操作:

  • 将名为 "my_volume" 的卷挂载到容器中的 /path/to/file/in/container 路径。
  • 连接到名为 "my_network" 的网络。

port

shell 复制代码
docker-compose port [options] SERVICE PRIVATE_PORT

打印某个容器端口所映射的公共端口。

选项:

  • --protocol=proto 指定端口协议,tcp(默认值)或者 udp。
  • --index=index 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。
shell 复制代码
# 下面结果表示:将web服务的5000端口映射到了宿主机的5001端口
 $ docker-compose port web 5000
   0.0.0.0:5001

5. 简单示例

参考链接:
[Docker] Docker Compose 基础教程(概念/基础操作)
全网最详细的Docker-Compose详细教程
Docker Compose

相关推荐
小安运维日记12 分钟前
Linux云计算 |【第三阶段】PROJECT1-DAY1
linux·运维·云计算·apache
小的~~29 分钟前
k8s使用本地docker私服启动自制的flink集群
docker·flink·kubernetes
pyliumy30 分钟前
rsync 全网备份
linux·运维·服务器
苹果醋31 小时前
SpringCloud系列之一---搭建高可用的Eureka注册中心
运维·nginx
诚诚k1 小时前
docker存储
运维·docker·容器
sorel_ferris1 小时前
Ubuntu-24.04中Docker-Desktop无法启动
linux·ubuntu·docker
ggb19991 小时前
【python的坑】vpn下,python request报错 check_hostname requires server_hostname
linux·运维·服务器
数据智能老司机1 小时前
Kubernetes从入门到精通系列——外部 DNS 和全局负载均衡
云原生·容器·kubernetes
-SGlow-1 小时前
Linux相关概念和重要知识点(4)(自举、vim)
linux·运维·vim
多多*2 小时前
OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发
linux·服务器·前端·ubuntu·docker·前端框架