Docker Compose
https://docs.docker.com/compose/
简介
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.
Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.
Using Compose is basically a three-step process:
- Define your app’s environment with a
Dockerfile
so it can be reproduced anywhere.- Define the services that make up your app in
docker-compose.yml
so they can be run together in an isolated environment.- Run
docker compose up
and the Docker compose command starts and runs your entire app. You can alternatively rundocker-compose up
using the docker-compose binary.
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。借助 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用单个命令,从配置中创建并启动所有服务。
Compose 适用于所有环境:生产、登台、开发、测试以及 CI 工作流。
使用 Compose 基本上是一个三步过程:
- 使用 定义您的应用程序的环境,
Dockerfile
以便它可以在任何地方复制。 - 定义组成您的应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行。 - 运行
docker compose up
和docker compose command
启动并运行你的整个应用程序。您也可以docker-compose up
使用 docker-compose 二进制文件运行。
作用:批量容器编排
Compose 是Docker官方的开源项目。需要安装!
Dockerfile
让程序在任何地方运行。
一个docker-compose.yml
看起来像这样:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
安装
1、下载
sudo curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 这个可能快点
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、授权
sudo chmod +x /usr/local/bin/docker-compose
体验
地址:https://docs.docker.com/compose/gettingstarted/
1、应用 app.py
-
为项目创建一个目录:
$ mkdir composetest && cd composetest
-
创建一个 app.py 文件 并写入:
vim app.py
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count)
-
创建 requirements.txt 文件并写入
flask redis
2、Dockerfile 应用打包为镜像
-
创建 Dockerfile
# syntax=docker/dockerfile:1 FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run"]
这告诉 Docker:
- 从 Python 3.7 映像开始构建映像。
- 将工作目录设置为
/code
. - 设置
flask
命令使用的环境变量。 - 安装 gcc 和其他依赖项
- 复制
requirements.txt
并安装 Python 依赖项。 - 将元数据添加到图像以描述容器正在侦听端口 5000
- 将
.
项目中的当前目录复制到.
镜像中的workdir 。 - 将容器的默认命令设置为
flask run
.
3、创建 docker-compose.yml
文件 (定义整个服务,需要的环境。web、redis)
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
这个 Compose 文件定义了两个服务:web
和redis
.
4、启动compose 项目(docker-compose up)
$ docker-compose up
自动默认规则
docker images
默认的服务名 文件名_ 服务名_ num
多个服务器。集群。
redis服务=>4个副本
集群状态。服务都不可能只有一个运行实例。弹性。
网络规则
10个服务 => 项目( 项目中的内容都在通过网络下。域名访问)
如果在同一个网络下,我们可以直接通过域名访问。
停止 Ctrl + C
需要在项目目录下输入这个命令
docker-compose
以前都是单个docker run启动容器
现在通过docker-compose 编写yaml配置文件、可以通过compose一键启动所有服务、!
小结:
1、Docker镜像。 run => 容器
2、DockerFile 构建镜像(服务打包)
3、docker-compose 启动项目(编排、多个微服务/环境)
4、Docker 网络!
compose配置编写规则
docker-compose.yaml 核心!
https://docs.docker.com/compose/compose-file/
# 3层!
version: '' # 版本
services: # 服务
服务1: web
# 配置
images
build
network
......
服务2: redis
......
服务3: mysql
......
# 其他配置 网络/卷/全局规则
volumes:
networkds:
configs:
使用compose 一键部署 WP 博客
https://docs.docker.com/samples/wordpress/
1、创建一个空的项目目录。
$ mkdir my_wordpress && cd my_wordpress
2、创建一个docker-compose.yml
文件来启动您的 WordPress
博客和一个单独的MySQL
实例,该实例具有用于数据持久性的卷挂载:
services:
db:
image: mysql:5.7
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
volumes:
- wp_data:/var/www/html
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:
wp_data:
3、docker-compose up -d
启动项目
然后一步步进行就OK了!
非常简单!
实战
1、创建一个springboot新项目
导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
写一个计数器
@RestController
public class HelloController {
@Autowired
RedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello() {
Long views = redisTemplate.opsForValue().increment("views");
return "hello, docker-compose,views" + views;
}
}
编写application.yml
server:
port: 8080
spring:
redis:
host: redis
2、dockerfile构建镜像
FROM java:8
COPY *.jar /app.jar
CMD ["--server.prot=8080"]
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
3、docker-compose.yaml 编排项目
version: '3.8'
services:
kuangapp:
build: .
image: kuangapp
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
4、丢到服务器 docker-compose up
测试
假设项目要重新部署打包
docker-compose up --build # 重新构建
总结:
工程、服务、容器
项目compose:三层
- 工程 Project
- 服务 服务
- 容器 运行实例!