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 定义的文件可以在开发、测试和生产环境中共享,保证应用在不同环境下的一致性。
基本语法
docker-compose 文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于 service 就是在定义某个应用的运行时参数,因此与 docker run 参数非常相似。
用
docker run部署 MySQLbashdocker 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部署 MySQLyamlversion: "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 指令 |
|---|---|
--name | container_name |
-p | ports |
-e | environment |
-v | volumes |
--network | networks |
编写 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-nethmall 服务
yaml
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysqlnginx 服务
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基础命令
基本语法: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命令演示
停止和删除
mysqlhmallnginx容器。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删除构建的
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清空
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编写
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查看文件夹详情。
bash❯ tree -L 2 . . ├── docker-compose.yml ├── Dockerfile ├── hm-service.jar ├── mysql │ ├── conf │ └── init └── nginx ├── html └── nginx.conf 5 directories, 4 files使用 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查看镜像。
bash❯ dkci CONTAINER REPOSITORY TAG IMAGE ID SIZE hmall hmall-hmall latest 262997886004 365MB mysql mysql latest a3b6608898d6 596MB nginx nginx latest a6bd71f48f68 187MB查看容器。
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查看黑马商城首页,发现可以访问,部署成功!
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"/>