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 ComposeDocker SwarmKubernetes
功能简单中等强大
复杂性中等
部署方式单机集群集群
服务发现
负载均衡
高可用性
滚动更新、健康检查、高级调度等
适用场景开发和测试生产环境生产环境

2. docker compose安装

2.1 二进制包

# 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安装

# 1. 安装
$ sudo pip install -U docker-compose

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

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

3. compose模版文件

Docker Compose 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

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

docker-compose start [SERVICE...]

启动已经存在的服务容器

down

docker-compose down

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

stop

docker-compose stop [options] [SERVICE...]

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

选项:

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

ps

docker-compose ps [options] [SERVICE...]

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

选项:

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

logs

docker-compose logs [options] [SERVICE...]

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

build

docker-compose build [options] [SERVICE...]

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

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

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

选项:

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

restart

docker-compose restart [options] [SERVICE...]

重启项目中的服务

选项:

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

rm

docker-compose rm [options] [SERVICE...]

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

选项:

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

top

docker-compose top

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

images

docker-compose images

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

run

docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

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

使用举例:

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

docker-compose run web python my_script.py

2. 在 Web 服务容器中运行 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 命令,使用环境变量,连接网络:

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 脚本,使用卷,连接网络:

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

docker-compose port [options] SERVICE PRIVATE_PORT

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

选项:

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

5. 简单示例

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

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值