Docker-Compose 详解

docker-compose官网下载

下载后使用 mv < NAME > /usr/local/bin/docker-compose更改名称传入命令目录,然后chown +x /usr/local/bin/docker-compose加上执行权限

一.docker-compose 基本概念

  1. 服务(Service):在Docker Compose中,一个服务定义了容器在生产环境中的行为。一个服务可以是一个单独的容器,也可以是多个容器的集群。服务是独立运行的容器实例,可以包含具体的应用程序代码及其依赖。

  2. 项目(Project):一个项目是由一组服务(容器)组成的完整应用程序。在Docker Compose中,一个项目通常对应一个docker-compose.yml文件。

  3. 配置文件(docker-compose.yml):这是Docker Compose的核心文件,包含了应用程序中所有服务的配置信息。通过YAML文件配置应用所需的所有服务,可以一键启动和停止所有服务,并管理服务依赖。

二.基础命令

  1. 启动服务
  • docker-compose up:构建镜像并启动容器。默认情况下,该命令会在前台运行容器,并打印所有容器的输出信息。
  • docker-compose up -d:以守护进程模式启动容器。这通常用于生产环境,以确保容器在后台运行。
  • docker-compose up --build:强制重新构建服务的镜像后再启动容器。
  • docker-compose up --no-deps -d <SERVICE_NAME>:重新创建并启动指定的服务,但不影响其依赖的服务。
  1. 停止服务
  • docker-compose stop:停止所有服务的容器。
  • docker-compose stop <SERVICE_NAME>:停止指定服务的容器。
  1. 启动已停止的服务
  • docker-compose start:启动所有已停止的服务的容器。
  • docker-compose start <SERVICE_NAME>:启动指定已停止的服务的容器。
  1. 重启服务
  • docker-compose restart:重启所有服务的容器。
  • docker-compose restart <SERVICE_NAME>:重启指定服务的容器。

二、查看和管理容器

  1. 列出容器
  • docker-compose ps:列出当前正在运行的容器及其状态、端口映射和名称。
  1. 查看日志
  • docker-compose logs:显示所有服务的日志输出。
  • docker-compose logs <SERVICE_NAME>:显示指定服务的日志输出。
  • docker-compose logs -f <SERVICE_NAME>:实时跟踪指定服务的日志输出。
  1. 在容器中执行命令
  • docker-compose exec <SERVICE_NAME> <COMMAND>:在运行的容器中执行命令。例如,docker-compose exec web /bin/bash会打开一个Bash shell,允许你在web服务的容器内执行命令。

三、构建和镜像管理

  1. 构建镜像
  • docker-compose build:构建项目中的所有服务镜像。
  • docker-compose build <SERVICE_NAME>:仅构建指定的服务镜像。
  • docker-compose build --no-cache:不使用缓存来构建所有服务的镜像。
  • docker-compose build --no-cache <SERVICE_NAME>:不使用缓存来构建指定的服务镜像。
  1. 列出镜像
  • docker-compose images:列出项目中所包含的镜像。

四、网络和卷管理

  1. 列出网络
  • docker-compose network ls:列出Docker Compose网络。
  1. 创建网络
  • docker-compose network create:创建一个新的Docker Compose网络。
  1. 删除网络
  • docker-compose network rm:删除一个Docker Compose网络。

五、其他命令

  1. 停止并删除容器、网络、卷和镜像
  • docker-compose down:停止并删除容器、网络、默认卷和默认镜像(除非使用--rmi--volumes选项)。
  • docker-compose down --volumes:停止并删除容器、网络和所有卷。
  • docker-compose down --rmi all:停止并删除容器、网络、卷和所有镜像。
  1. 扩展服务的副本数量
  • docker-compose scale <SERVICE_NAME>=<NUMBER>:设置指定服务运行的容器个数。
  1. 运行一次性命令
  • docker-compose run <SERVICE_NAME> <COMMAND>:在指定服务上运行一个命令。例如,docker-compose run --rm web python manage.py migrate会在web服务中运行python manage.py migrate命令,执行完成后删除容器。
  1. 删除停止的容器
  • docker-compose rm:删除所有停止状态的服务容器。
  1. 强制停止容器
  • docker-compose kill:发送SIGKILL信号来强制停止服务容器。
  1. 暂停和恢复容器
  • docker-compose pause:暂停所有服务的执行。
  • docker-compose pause <SERVICE_NAME>:暂停指定服务的执行。
  • docker-compose unpause:恢复所有服务的执行。
  • docker-compose unpause <SERVICE_NAME>:恢复指定服务的执行。
  1. 查看端口映射
  • docker-compose port <SERVICE_NAME> <PORT>:查看某个容器端口所映射的公共端口。
  1. 查看容器中运行的进程
  • docker-compose top:显示所有服务容器内运行的进程。
  • docker-compose top <SERVICE_NAME>:显示指定服务容器内运行的进程。
  1. 实时显示容器相关的事件
  • docker-compose events:实时显示容器相关的事件。
  1. 验证和查看Compose文件的配置

    • docker-compose config:验证Compose文件格式是否正确,若正确则显示配置,若格式错误则显示错误原因。
    • docker-compose config -q:当配置正确时,不输出任何内容;当文件配置错误时,输出错误信息。
  2. 查看Docker Compose版本信息

    • docker-compose version:显示Docker Compose版本信息。
  3. 获取Docker Compose帮助信息

    • docker-compose help:获取Docker Compose帮助信息。
    • docker-compose help <COMMAND>:获取指定命令的详细帮助信息。

这些命令涵盖了Docker Compose的大部分常用功能。

三.docker-compose 编排文件详解

Docker Compose编排文件(通常命名为docker-compose.yml)是用于定义和运行多容器Docker应用程序的工具。以下是对Docker Compose编排文件的详细解析:

一、文件结构

Docker Compose编排文件采用YAML格式,通常包含以下主要部分:

  1. version:指定Compose文件格式的版本。这是必须的,因为不同版本的Compose文件格式可能有所不同。
  2. services:定义一组相关联的应用容器,每个容器称为一个服务。这是文件的核心部分。
  3. networks:定义容器之间的网络连接。
  4. volumes:定义数据卷,用于持久化数据或共享数据。

二、services部分详解

services部分是Docker Compose编排文件的核心,用于定义每个服务的配置。以下是一些常见的配置项:

  1. image:指定服务使用的镜像。可以是Docker Hub上的镜像,也可以是本地构建的镜像。
  2. build:指定构建镜像的上下文和Dockerfile。如果服务需要自定义镜像,则可以使用此选项。
  3. container_name:为容器指定一个名称。如果不指定,则Compose会自动生成一个名称。
  4. command:覆盖容器启动时的默认命令。
  5. depends_on:定义服务之间的依赖关系。当启动一个服务时,Compose会先启动它所依赖的服务。
  6. ports:映射容器端口到主机端口。
  7. volumes:挂载数据卷到容器。
  8. environment:设置环境变量。
  9. networks:将服务连接到指定的网络。
  10. deploy:仅在Swarm模式下使用,用于定义服务的部署配置。

三、networks部分详解

networks部分用于定义容器之间的网络连接。以下是一些常见的配置项:

  1. driver:指定网络驱动。默认是bridge驱动,但也可以使用其他驱动,如overlay(用于Swarm模式)。
  2. ipam:自定义IP地址管理。可以指定子网、网关等。
  3. networks:定义一个或多个网络,并为每个网络指定名称和其他配置。

四、volumes部分详解

volumes部分用于定义数据卷,用于持久化数据或共享数据。以下是一些常见的配置项:

  1. driver:指定数据卷驱动。默认是local驱动,但也可以使用其他驱动,如NFS、Ceph等。
  2. driver_opts:指定数据卷驱动的选项。
  3. external:如果设置为true,则表示该数据卷是在Compose文件外部定义的。
  4. name:为数据卷指定一个名称。如果不指定,则Compose会自动生成一个名称。

五、示例

以下是一个简单的Docker Compose nginx服务器负载均衡编排文件示例:

# 实现nginx负载均衡实验所需要的目录和文件
[root@docker01 ]# tree
.
├── haproxy
│   ├── docker-compose.yaml
│   ├── haproxy
│   │   └── haproxy.cfg
│   ├── web1
│   │   └── index.html
│   └── web2
|       └── index.html
    
# 编辑 docker-copose.yaml
[root@docker01 haproxy]# cat docker-compose.yaml 
version: "3.9"    # 所使用的compose文件版本
services:		 # 定义一组应用容器
  web1:           # 容器名称
    image: nginx  # 所需要使用的镜像名称,后面可以跟上版本号,不跟默认使用latest
    networks:	  # 指定网络名称
      - mynet
    volumes:       # :前为本地目录  :后为镜像容器内的目录
      - ./web1/index.html:/usr/share/nginx/html/index.html

  web2:
    image: nginx
    networks:
      - mynet
    volumes:
      - ./web2/index.html:/usr/share/nginx/html/index.html

  haproxy:
    image: haproxy:2.2-alpine
    networks:
      - mynet
    ports:	# 映射端口
      - "8000:80"
    volumes:
      - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg

networks:
  mynet:
  
# 编辑本地映射文件
[root@docker01 haproxy]# cat web1/index.html
web1
[root@docker01 haproxy]# cat web2/index.html
web2
[root@docker01 haproxy]# cat haproxy/haproxy.cfg 
global
        maxconn         65535   
        # stats socket    /var/run/haproxy.stat mode 600 level admin
        log             127.0.0.1 local0
        uid             200
        gid             200
        #chroot          /var/empty
        daemon

defaults
        mode            http
        log             global
        option          httplog
        option          dontlognull
        monitor-uri     /monitoruri
        maxconn         8000
        timeout client  30s
        retries         2
        option redispatch
        timeout connect 5s
        timeout server  5s
        stats uri       /status
# The public 'www' address in the DMZ
frontend public
        bind            *:80
        #bind            192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem

        #use_backend     static if { hdr_beg(host) -i img }
        #use_backend     static if { path_beg /img /css   }
        default_backend dynamic

# The static backend backend for 'Host: img', /img and /css.
backend dynamic
        balance         roundrobin
        server          app1 web1:80 check inter 1000
        server          app2 web2:80 check inter 1000
        
# 检验测试
[root@docker01 haproxy]# docker-compose up -d  
[+] Running 3/4
 ⠦ Network haproxy_mynet        Crea...                         0.6s 
 ✔ Container haproxy-web1-1     S...                            0.5s 
 ✔ Container haproxy-web2-1     S...                            0.6s 
 ✔ Container haproxy-haproxy-1  Started                         0.6s 

[root@docker01 haproxy]# docker-compose ps
NAME                IMAGE                COMMAND                   SERVICE   CREATED         STATUS         PORTS
haproxy-haproxy-1   haproxy:2.2-alpine   "docker-entrypoint.s…"   haproxy   7 seconds ago   Up 6 seconds   0.0.0.0:8000->80/tcp, :::8000->80/tcp
haproxy-web1-1      nginx                "/docker-entrypoint.…"   web1      7 seconds ago   Up 6 seconds   80/tcp
haproxy-web2-1      nginx                "/docker-entrypoint.…"   web2      7 seconds ago   Up 6 seconds   80/tcp

[root@docker01 haproxy]# curl 192.168.73.128:8000
web1
[root@docker01 haproxy]# curl 192.168.73.128:8000
web2
[root@docker01 haproxy]# curl 192.168.73.128:8000
web1
[root@docker01 haproxy]# curl 192.168.73.128:8000
web2

四、注意事项

  1. YAML文件对缩进非常敏感,因此请确保使用空格进行缩进,而不是制表符(Tab)。
  2. 在定义服务时,请确保镜像名称、端口映射、数据卷挂载等配置正确无误。
  3. 如果需要自定义网络或数据卷,请在networks和volumes部分进行定义。
  4. 在使用Compose文件之前,请确保Docker和Docker Compose已经正确安装并配置。

猜你喜欢

转载自blog.csdn.net/qq1271566323/article/details/142927412