Skip to content

14 项目部署 - Docker Compose

  • Docker Compose 可以帮助我们实现多个相互关联的 Docker 容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
  • Docker Compose 是一个用于定义和运行多个 Docker 容器应用的工具。它允许用户通过一个单一的文件来定义多个容器,然后使用一个命令来一次性启动它们。
  • Docker Compose 的工作原理是通过一个 YAML 格式的文件来定义应用的服务、网络和卷,然后通过 docker-compose up 命令来启动应用。这个文件定义了应用的各个组件,包括它们的镜像、容器名称、端口映射、环境变量等。用户可以通过修改这个文件来定制应用的各个组件,而无需修改 Dockerfile。
  • Docker Compose 的优点:
    • 简化应用的部署和管理:通过一个文件来定义多个容器,使得应用的部署和管理变得简单快捷。
    • 方便的开发环境:在开发阶段,可以使用 Docker Compose 来快速启动应用的各个组件,而无需手工安装和配置。
    • 可移植性:Docker Compose 定义的文件可以在开发、测试和生产环境中共享,保证应用在不同环境下的一致性。

基本语法

Compose file version 3 reference | Docker Docs

docker-compose 文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于 service 就是在定义某个应用的运行时参数,因此与 docker run 参数非常相似。

  • docker run 部署 MySQL

    bash
    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -e TZ=Asia/Shanghai \
      -e MYSQL_ROOT_PASSWORD=123 \
      -v ./mysql/data:/var/lib/mysql \
      -v ./mysql/conf:/etc/mysql/conf.d \
      -v ./mysql/init:/docker-entrypoint-initdb.d \
      --network hmall
      mysql
  • docker-compose 部署 MySQL

    yaml
    version: "3.8"
    
    services:
      mysql:
        image: mysql
        container_name: mysql
        ports:
          - "3306:3306"
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "./mysql/conf:/etc/mysql/conf.d"
          - "./mysql/data:/var/lib/mysql"
        networks:
          - new
    networks:
      new:
        name: hmall

对比如下:

docker run 参数docker compose 指令
--namecontainer_name
-pports
-eenvironment
-vvolumes
--networknetworks

编写 docker-compose 文件

mysql 服务

yaml
services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net

hmall 服务

yaml
hmall:
  build:
    context: .
    dockerfile: Dockerfile
  container_name: hmall
  ports:
    - "8080:8080"
  networks:
    - hm-net
  depends_on:
    - mysql

nginx 服务

yaml
nginx:
  image: nginx
  container_name: nginx
  ports:
    - "18080:18080"
    - "18081:18081"
  volumes:
    - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
    - "./nginx/html:/usr/share/nginx/html"
  depends_on:
    - hmall
  networks:
    - hm-net

黑马商城 docker-compose 文件

yaml
version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net

  hmall:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net

networks:
  hm-net:
    name: hmall

基础命令

Overview of docker compose CLI | Docker Docs

基本语法:docker compose [OPTIONS] [COMMAND]

Options 参数

参数说明
-f指定 compose 文件的路径和名称
-p指定 project 名称。project 就是当前 compose 文件中设置的多个 service 的集合,是逻辑概念

Commands 命令

命令说明
up创建并启动所有 service 容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令

docker-compose help

bash
 docker-compose --help

Usage:  docker compose [OPTIONS] COMMAND

Define and run multi-container applications with Docker.

Options:
      --ansi string                Control when to print ANSI control characters ("never"|"always"|"auto") (default "auto")
      --compatibility              Run compose in backward compatibility mode
      --dry-run                    Execute command in dry run mode
      --env-file stringArray       Specify an alternate environment file.
  -f, --file stringArray           Compose configuration files
      --parallel int               Control max parallelism, -1 for unlimited (default -1)
      --profile stringArray        Specify a profile to enable
      --progress string            Set type of progress output (auto, tty, plain, quiet) (default "auto")
      --project-directory string   Specify an alternate working directory
                                   (default: the path of the, first specified, Compose file)
  -p, --project-name string        Project name

Commands:
  build       Build or rebuild services
  config      Parse, resolve and render compose file in canonical format
  cp          Copy files/folders between a service container and the local filesystem
  create      Creates containers for a service.
  down        Stop and remove containers, networks
  events      Receive real time events from containers.
  exec        Execute a command in a running container.
  images      List images used by the created containers
  kill        Force stop service containers.
  logs        View output from containers
  ls          List running compose projects
  pause       Pause services
  port        Print the public port for a port binding.
  ps          List containers
  pull        Pull service images
  push        Push service images
  restart     Restart service containers
  rm          Removes stopped service containers
  run         Run a one-off command on a service.
  scale       Scale services
  start       Start services
  stop        Stop services
  top         Display the running processes
  unpause     Unpause services
  up          Create and start containers
  version     Show the Docker Compose version information
  wait        Block until the first service container stops
  watch       Watch build context for service and rebuild/refresh containers when files are updated

Run 'docker compose COMMAND --help' for more information on a command.

tldr docker-compose

bash
 tldr docker-compose

  Run and manage multi container docker applications.
  More information: <https://docs.docker.com/compose/reference/>.

  List all running containers:

      docker compose ps

  Create and start all containers in the background using a `docker-compose.yml` file from the current directory:

      docker compose up --detach

  Start all containers, rebuild if necessary:

      docker compose up --build

  Start all containers by specifying a project name and using an alternate compose file:

      docker compose -p project_name --file path/to/file up

  Stop all running containers:

      docker compose stop

  Stop and remove all containers, networks, images, and volumes:

      docker compose down --rmi all --volumes

  Follow logs for all containers:

      docker compose logs --follow

  Follow logs for a specific container:

      docker compose logs --follow container_name

命令演示

  1. 停止和删除 mysql hmall nginx 容器。

    bash
     dk stop mysql nginx hmall
    mysql
    nginx
    hmall
     dkpsf -a
    CONTAINER ID   IMAGE     PORTS     STATUS                        NAMES
    8da19e0e98a4   nginx               Exited (0) 19 seconds ago     nginx
    0912ee2dd460   mysql               Exited (0) 16 seconds ago     mysql
    916083d7d274   hmall               Exited (143) 19 seconds ago   hmall
     dkrmC
    8da19e0e98a4
    0912ee2dd460
    916083d7d274
     dkpsf -a
    CONTAINER ID   IMAGE     PORTS     STATUS    NAMES
  2. 删除构建的 hmall 镜像。

    bash
     dkrmi hmall
    Untagged: hmall:latest
    Deleted: sha256:af4b5ab8d9fccf5efa559b714e733b43934275ffa2b68b5ace7a9167ac273a63
     dkIls
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    nginx        latest    a6bd71f48f68   3 days ago    187MB
    mysql        latest    a3b6608898d6   4 weeks ago   596MB
  3. 清空 mysql 数据。

    bash
     sudo rm -rf mysql/data
     tree -L 2 .
    .
    ├── Dockerfile
    ├── hm-service.jar
    ├── mysql
    │   ├── conf
    │   └── init
    └── nginx
        ├── html
        └── nginx.conf
    
    5 directories, 3 files
  4. 编写 docker-compose.yml 文件。

    bash
     nvim docker-compose.yml
    
    version: "3.8"
    
    services:
      mysql:
        image: mysql
        container_name: mysql
        ports:
          - "3306:3306"
        environment:
          TZ: Asia/Shanghai
          MYSQL_ROOT_PASSWORD: 123
        volumes:
          - "./mysql/conf:/etc/mysql/conf.d"
          - "./mysql/data:/var/lib/mysql"
          - "./mysql/init:/docker-entrypoint-initdb.d"
        networks:
          - hm-net
    
      hmall:
        build:
          context: .
          dockerfile: Dockerfile
        container_name: hmall
        ports:
          - "8080:8080"
        networks:
          - hm-net
        depends_on:
          - mysql
    
      nginx:
        image: nginx
        container_name: nginx
        ports:
          - "18080:18080"
          - "18081:18081"
        volumes:
          - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
          - "./nginx/html:/usr/share/nginx/html"
        depends_on:
          - hmall
        networks:
          - hm-net
    
    networks:
      hm-net:
        name: hmall
  5. 查看文件夹详情。

    bash
     tree -L 2 .
    .
    ├── docker-compose.yml
    ├── Dockerfile
    ├── hm-service.jar
    ├── mysql
    │   ├── conf
    │   └── init
    └── nginx
        ├── html
        └── nginx.conf
    
    5 directories, 4 files
  6. 使用 docker-compose 启动所有容器并后台运行。

    bash
     docker-compose up -d
    [+] Building 1.0s (8/8) FINISHED                                                                                      docker:default
     => [hmall internal] load build definition from Dockerfile                                                                      0.0s
     => => transferring dockerfile: 298B                                                                                            0.0s
     => [hmall internal] load .dockerignore                                                                                         0.0s
     => => transferring context: 2B                                                                                                 0.0s
     => [hmall internal] load metadata for docker.io/library/openjdk:11.0-jre-buster                                                0.7s
     => [hmall 1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:569ba9252ddd693a29d39e81b3123481f308eb6d529827a40c937104  0.0s
     => [hmall internal] load build context                                                                                         0.0s
     => => transferring context: 38B                                                                                                0.0s
     => CACHED [hmall 2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone       0.0s
     => CACHED [hmall 3/3] COPY hm-service.jar /app.jar                                                                             0.0s
     => [hmall] exporting to image                                                                                                  0.0s
     => => exporting layers                                                                                                         0.0s
     => => writing image sha256:262997886004be820e02e42768fd784715c24cdb37da31c54cc447f686fa607a                                    0.0s
     => => naming to docker.io/library/hmall-hmall                                                                                  0.0s
    [+] Running 4/4
     Network hmall    Created                                                                                                     0.1s
     Container mysql  Started                                                                                                     0.1s
     Container hmall  Started                                                                                                     0.1s
     Container nginx  Started                                                                                                     0.1s
  7. 查看镜像。

    bash
     dkci
    CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
    hmall               hmall-hmall         latest              262997886004        365MB
    mysql               mysql               latest              a3b6608898d6        596MB
    nginx               nginx               latest              a6bd71f48f68        187MB
  8. 查看容器。

    bash
     dkcpsf
    CONTAINER ID   IMAGE         SERVICE   STATUS          NAME
    a6e8f47011f7   hmall-hmall   hmall     Up 1 minutes    hmall
    813046caa36d   mysql         mysql     Up 1 minutes    mysql
    13c900b42102   nginx         nginx     Up 1 minutes    nginx
  9. 查看黑马商城首页,发现可以访问,部署成功!

    bash
     curl --silent localhost:18080 | head -10
    <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="utf-8"/>
      <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
      <title>黑马商城--首页 2</title>
    
      <link rel="stylesheet" type="text/css" href="css/webbase2.css"/>
      <link rel="stylesheet" type="text/css" href="css/pages-index.css"/>