docker-compose教程(安装,使用, 快速入门)

发布时间:2024年01月05日

DockerCompose容器编排

一 入门

(一) 场景

  1. 一个应用系统,的启动往往依赖了多个容器(Nginx tomcat redis mysq…),每个容器的启动都有先后顺序,一个一个手动管理很麻烦。
  2. 往往我们会管理多个服务器,每个服务器上有几十个容器,每个容器由分属于不同的web系统,无法记忆,管理繁琐。(项目环境迁移也麻烦)

(二) 简介

DockerCompose提供的,站在一个项目角度,管理和编排一定数量的容器。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来定义应用程序的服务、网络和卷。使用 Docker Compose,您可以通过在单个文件中定义应用程序的期望状态,然后使用 docker-compose up 命令来启动和停止容器,轻松管理和扩展应用程序。

Docker Compose 的一些关键特性包括:

  • 服务定义:您可以在 Docker Compose 文件中定义多个服务,每个服务都有自己的配置,例如镜像、端口、卷、环境变量等。

  • 网络连接:Docker Compose 自动为应用程序创建一个网络,允许容器使用它们的服务名称相互通信。

  • 卷管理:您可以在 Docker Compose 文件中定义卷,以在容器重新启动之间持久保存数据或在容器之间共享数据。

  • 环境变量:Docker Compose 允许您为容器定义环境变量,以便轻松配置和定制应用程序。

  • 扩展:使用 Docker Compose,您可以通过更改特定服务的副本数量轻松扩展应用程序。

总体而言,Docker Compose 简化了管理和运行多容器 Docker 应用程序的过程,对开发人员和系统管理员非常有价值。

  • 总结

    • ① 站在项目角度关联多个docker容器
    • ② 按照一定的顺序,编排docker容器。

在这里插入图片描述

(三) 要素

  • docker-compose.yml文件

    • 定义描述一个项目中所有容器/Service服务的信息:名字、端口、环境变量、启动顺序、数据卷映射、docker build
  • Project 项目:一个web项目,其中包含多个容器。

  • Service 服务:一个容器。

二 使用

1. yum安装
1. 安装扩展yum源
yum install -y epel-release

2. 安装docker-compose
yum install -y docker-compose

3. 验证docker-compose
[root@localhost ~]# docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
2. 入门案例

准备一个项目cms相关容器:nginx、redis

(1) 创建目录,作为项目名

注意:空目录,不要放无关紧要其他文件。

(2) 在项目名目录中,创建docker-compose.yml

注意:文件名,固定,不要改。

(3) 编写资源(容器)清单:docker-compose.yml

# 第一步:先写版本
version: '3'

# 第二步:编写所有服务(容器)
services:
  # nginx容器
  nginx-1: # 容器名字: 项目名_容器名_x,例如:cms_nginx-1_?
    image: nginx:1.21 # 使用的镜像:tag
    ports: # 映射容器启动端口,相当于docker run -p
      - 88:80
  # redis容器
  redis-1:
    image: redis:5
    ports:
      - 6379:6379

(4) dockercompose管理服务(容器)

注意:必须在docker-compose.yml所在目录执行。

1. 启动
docker-compose up [-d]

2. 关闭
docker-compose down [-v]

3. 重启
docker-compose restart

4. 查看项目下的服务(容器)
docker-compose ps
说明:查看当前这个项目下的所有服务(容器)

(5) 版本参考

在这里插入图片描述

三 模板指令

1. 指令详解

(1) image

? 指定该服务(容器),用到的镜像名:tag

? 类似:docker run 后面的 镜像名:tag

(2) ports:

? 指定服务(容器),映射的端口

? 类似:docker run -p

(3) environment:

? 指定该服务(容器)的环境变量

? 类似:docker run -e MYSQL_ROOT_PASSWORD=xxxx

# 第一步:先写版本
version: '3'

# 第二步:编写所有服务(容器)
services:
  mysql-1:
    image: mysql:5.7
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=admins

(4) env_file:

? 可以将环境变量的值全部存放在ENV文件中,通过env_file引用这个文件即可。

? 注意:通常放在当前docker-compose.yml 同级或者子目录中,例如:commons/mysql/ENV

# 第一步:先写版本
version: '3'

# 第二步:编写所有服务(容器)
services:
  mysql-1:
    image: mysql:5.7
    ports:
      - 3306:3306
    # environment:
      # - MYSQL_ROOT_PASSWORD=admins
    env_file:
      - ./ENV # 将环境变量写在一个文件中,这里引用即可。通常放在当前docker-compose.yml 同级或者子目录中。

(5) command:

? 可以在启动容器内部启动主进程,替换内部CMD启动命令。

? 类似:docker run … redis:5 redis-server --appendonly yes

# 第一步:先写版本
version: '3'

# 第二步:编写所有服务(容器)
services:
  # nginx容器
  nginx-1: # 容器名字: 项目名_容器名_x,例如:cms_nginx-1_?
    image: nginx:1.21 # 使用的镜像:tag
    ports: # 映射容器启动端口,相当于docker run -p
      - 88:80
  # redis容器
  redis-1:
    image: redis:5
    ports:
      - 6379:6379
    command: redis-server --appendonly yes

(6) depends_on

? 表示服务启动,依赖了哪个服务,用来指定启动的先后顺序的。

? 注意:以后实际项目中,有数据的服务(mysql redis)先启动,没有数据例如(nginx tomcat)后启动。

(7) restart

? 指定重启策略,restart:always,默认容器随着docker引擎的启动而启动。

(8) volumes

? 指定服务的数据卷映射。

? 类似:docker run -v -v -v

? 注意:docker-compose指定的数据卷名字,不会自动创建。

# 第一步:先写版本
version: '3'

# 第二步:编写所有服务(容器)
services:
# redis容器
  redis-1:
    image: redis:5
    ports:
      - 6379:6379
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
# 数据卷
volumes:
  redis_data: # 作用:创建数据卷,相当于docker volume create 作用。

(9) build

? 作用指定该服务(容器)对应的镜像,通过dockerfile来创建。自动执行创建过程。

? 类似:构建镜像时候使用docker build -t 镜像名:tag -f docker-file文件名 . 命令。

? 注意:docker-compose使用外部dockerfile,要放在当前目录下,或者子目录下。

# 第一步:先写版本
version: '3'

# 第二步:编写所有服务(容器)
services:
  app-server:
    build:    # build替代image.
      context: . #指定build的上下文,相当于docker build结尾的.
      dockerfile: dockerfile-app #指定dockerfile文件名,相当docker build -f
    ports:
      - 8080:8080

2. 模板示例

# 第一步:先写版本
version: '3'

# 第二步:编写所有服务(容器)
services:
  # nginx容器
  nginx-1: # 容器名字: 项目名_容器名_x,例如:cms_nginx-1_?
    image: nginx:1.21 # 使用的镜像:tag
    ports: # 映射容器启动端口,相当于docker run -p
      - 88:80
    depends_on:
      - redis-1
    restart: always
  # redis容器
  redis-1:
    image: redis:5
    ports:
      - 6379:6379
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
  mysql-1:
    image: mysql:5.7
    ports:
      - 3306:3306
    # environment:
      # - MYSQL_ROOT_PASSWORD=admins
    env_file:
      - ./ENV # 将环境变量写在一个文件中,这里引用即可。通常放在当前docker-compose.yml 同级或者子目录中。
  app-server:
    build:    # build替代image.
      context: . #指定build的上下文,相当于docker build结尾的.
      dockerfile: dockerfile-app #指定dockerfile文件名,相当docker build -f
    ports:
      - 8080:8080
# 数据卷
volumes:
  redis_data: # 作用:创建数据卷,相当于docker volume create 作用。

四 DockerCompose命令

1. 基本语法
  • 命令格式
    • docker-compose [选项] [命令] --help
  • 帮助命令
    • docker-compose [命令] --help
2. 选项
  • 选项
 -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
 --verbose 输出更多调试信息。
  • 案例
1. 指定docker-compose.yml文件名
docker-compose -f docker-compose.yml文件名 up
# 说明:不执行-f,则默认使用docker-compose.yml这个名字

2. 指定项目名
docker-compose -p 自定义项目名 up
# 说明:如果不指定,则使用当前所在目录名作为项目名

3. 启动输出调试信息
docker-compose --verbose up
3. up命令
  • 作用
    • 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
  • 注意:该命令严格叫做上线部署
  • 命令选项
1. 启动指定服务
docker-compose up [服务名]

2. 在后台运行服务容器,生产环境下使用。
docker-compose up -d 

4. down命令
  • 作用
    • 对整个项目的容器进行停止, 并删除网络
  • 注意:严格叫做下线
    • ① 关闭容器
    • ② 删除容器
    • ③ 删除网络
    • ④ 删除数据卷 (注意:重要数据要提前备份)
  • 命令
1. 全局停止
docker-compose down -v
5. exec命令
  • 作用

    • 进入某个服务容器内部
  • 命令

docker-compose exec mysql-1 bash
6. ps命令
  • 作用

    • 查看项目所有的容器
  • 命令

    • docker-compose ps
  • 案例

1. 查看所有服务
[root@localhost his]# docker-compose ps
    Name                   Command               State                          Ports
------------------------------------------------------------------------------------------------------------
his_mysql-1_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3307->3306/tcp,:::3307->3306/tcp, 33060/tcp
his_nginx-1_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:81->80/tcp,:::81->80/tcp
his_redis-1_1   docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp,:::6379->6379/tcp


2. 查看所有服务id

[root@localhost his]# docker-compose ps -q
ab57c820a6f62925e6204a25827402670a729df6a56669e43b7582ec7a330176
a978eab0a906f9a36ed5890fff0c880bf3c70e7e432b5d7c57dfe238b754f270
07d671c6292f48d8a6af1d187477dbe9bd0274b81bd961409aa20d04148cfbcd
7. restart命令
  • 作用

    • 重启项目中的服务
  • 命令

    • docker-compose restart
8. start|stop命令
  • 作用

    • stop 停止容器
    • start 启动容器
    • 停止某个服务
  • 命令

    • docker-compose start 服务id
    • docker-compose stop 服务id
9. rm命令
  • 作用

    • 删除某个已经停止的服务
  • 命令

    • docker-compose rm 服务id
10. top命令
  • 作用

    • 查看某个服务容器内部进程
  • 命令

    • docker-compose top [服务id]
  • 案例

1. 查看当前项目下所有容器的进程
[root@localhost his]# docker-compose top
his_mysql-1_1
  UID      PID    PPID    C   STIME   TTY     TIME      CMD
-------------------------------------------------------------
polkitd   91820   91781   0   08:45   ?     00:00:00   mysqld

his_nginx-1_1
UID     PID    PPID    C   STIME   TTY     TIME                        CMD
----------------------------------------------------------------------------------------------
root   91734   91687   0   08:45   ?     00:00:00   nginx: master process nginx -g daemon off;
101    91889   91734   0   08:45   ?     00:00:00   nginx: worker process
101    91890   91734   0   08:45   ?     00:00:00   nginx: worker process

his_redis-1_1
  UID      PID    PPID    C   STIME   TTY     TIME             CMD
--------------------------------------------------------------------------
polkitd   91741   91706   0   08:45   ?     00:00:00   redis-server *:6379

2. 查看某个服务容器下的进程
root@localhost his]# docker-compose top mysql-1
his_mysql-1_1
  UID      PID    PPID    C   STIME   TTY     TIME      CMD
-------------------------------------------------------------
polkitd   91820   91781   4   08:45   ?     00:00:00   mysqld
11. logs命令
  • 作用

    • 查看服务的日志
  • 命令

    • docker-compose logs [服务ID]
  • 案例

    1. 查看全局日志 
    	docker-compose logs
    
    2. 查看指定服务日志 
    	docker-compose logs mysql-1
    
12. pause|unpause暂停和恢复
  • 作用

    • 暂停服务和回复
  • 命令

    • dockerc-compose pause [服务id]
    • docker-compose unpause [服务id]
  • 案例

    1. 全局暂停恢复
    [root@localhost his]# docker-compose pause
    Pausing his_nginx-1_1 ... done
    Pausing his_redis-1_1 ... done
    Pausing his_mysql-1_1 ... done
    [root@localhost his]# docker-compose ps
        Name                   Command               State                           Ports
    -------------------------------------------------------------------------------------------------------------
    his_mysql-1_1   docker-entrypoint.sh mysqld      Paused   0.0.0.0:3307->3306/tcp,:::3307->3306/tcp, 33060/tcp
    his_nginx-1_1   /docker-entrypoint.sh ngin ...   Paused   0.0.0.0:81->80/tcp,:::81->80/tcp
    his_redis-1_1   docker-entrypoint.sh redis ...   Paused   0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
    [root@localhost his]# docker-compose unpause
    Unpausing his_mysql-1_1 ... done
    Unpausing his_redis-1_1 ... done
    Unpausing his_nginx-1_1 ... done
    [root@localhost his]# docker-compose ps
        Name                   Command               State                          Ports
    ------------------------------------------------------------------------------------------------------------
    his_mysql-1_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3307->3306/tcp,:::3307->3306/tcp, 33060/tcp
    his_nginx-1_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:81->80/tcp,:::81->80/tcp
    his_redis-1_1   docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp,:::6379->6379/tcp
    
    2. 指定服务暂停和恢复
    [root@localhost his]# docker-compose pause mysql-1
    Pausing his_mysql-1_1 ... done
    [root@localhost his]# docker-compose unpause mysql-1
    Unpausing his_mysql-1_1 ... done
    

(八) compose资源库

FIT2CLOUD 飞致云 - 应用商店

四 案例

部署一个web项目:包含nginx、springboot的jar、mysql、redis等。

资源清单

version: '3'
services:
  nginx-1:
    image: nginx:1.21
    ports:
      - 80:80
    depends_on:
      - app-server
  app-server:
    build: 
      context: .
      dockerfile: dockerfile-app
    ports:
      - 8989:8080
    depends_on:
      - mysql-1
  mysql-1:
    image: mysql:5.7
    ports:
      - 3307:3306
    environment:
      - MYSQL_ROOT_PASSWORD=admins
      - MYSQL_DATABASE=cms
    volumes:
      - mysql_data:/var/lib/mysql
      - mysql_conf:/etc/mysql/conf.d
    command: 
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
volumes:
  mysql_conf:
  mysql_data:

文章来源:https://blog.csdn.net/weixin_52198548/article/details/135394324
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。