1、Docker Compose简介
关于Docker Compose,官方文档(https://docs.docker.com/compose/)里有介绍:
百度翻译:
Compose是定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,从配置创建并启动所有服务。要了解有关Compose的所有功能的更多信息,请参阅功能列表。
Compose适用于所有环境:生产、登台、开发、测试以及CI工作流。您可以在常见用例中了解更多关于每个用例的信息。
简单来说Compose是一个将多个docker容器组合部署的技术,能通过编写yaml配置文件来一键启动、暂停所有的容器,而不再需要用一条条的docker run命令来启动多个容器
2、Docker Compose的使用概述
关于Docker Compose的使用概述,官方也有给出:
百度翻译:
1、使用Dockerfile定义应用程序的环境,以便可以在任何地方运行。
2、在docker-compose.yml文件中定义构成应用程序的服务,因此它们可以在隔离环境中一起运行。
3、运行docker compose up这一条命令,这条命令将启动并运行您的整个应用程序。您也可以运行docker-compose up这条命令来让Compose运行起来(docker-compose二进制文件)。
官方给出的docker-compose.yml示例如下:
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
depends_on:
- redis
redis:
image: redis
volumes:
logvolume01: {}
3、安装Docker Compose
最新版的Docker Compose只要用yum下载就行,一般来说只要是按照官方文档的步骤来安装最新版的Docker,在执行下载Docker的那条命令里就已经包含了下载Docker Compose的语句了(如下图所示),所以按照官方文档下载的也不需要重新下载Docker Compose,可以略过步骤3(1),若下载时没按官方文档的来或下载Docker时略过了对docker-compose-plugin的下载,可以使用步骤3(1)的命令来下载Docker Compose
(1)下载Docker Compose
yum install docker-compose-plugin
(2)使用以下命令检验Docker Compose是否安装成功
docker compose version
效果图:
4、使用Docker Compose
(1)创建文件夹
进入工作目录,输入官方文档里的命令来新建一个文件夹
mkdir composetest
cd composetest
效果图:
(2)创建一个名为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)
(3)创建一个名为requirements.txt的文件,并在该文件里面写入官方给出的内容
vim requirements.txt
新建完后写入以下内容,然后保存并退出
flask
redis
(4)创建一个名为Dockerfile的文件,并在该文件里面写入官方给出的内容
vim 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
#安装gcc编译器
RUN apk add --no-cache gcc musl-dev linux-headers
#把刚刚我们创建的requirements.txt文件拷贝到镜像里
COPY requirements.txt requirements.txt
#下载requirements.txt里写好的flask和redis
RUN pip install -r requirements.txt
#指定5000为对外暴露的端口
EXPOSE 5000
#把当前目录拷贝进镜像里
COPY . .
#指定这个容器启动的时候要运行的命令,执行的命令为:flask run
CMD ["flask", "run"]
(5)创建一个名为docker-compose.yml的文件,并在该文件里面写入官方给出的内容
vim docker-compose.yml
新建完后写入以下内容,然后保存并退出
version: "3.9"
#build后可以跟自己写的Dockerfile文件,写在build后面的Dockerfile文件用于生成镜像
services:
web:
build: .
ports:
- "8000:5000"
#如果build后没值,则镜像用从DockerHub上拉下来的redis镜像
redis:
image: "redis:alpine"
(6)使用以下命令查看该文件夹下的文件,看是否齐全
app.py:程序
docker-compose.yml:用于部署应用
Dockerfile:用于创建docker镜像
requirements.txt:里面写着需要依赖的包
ls
效果图:
(7)在当前文件夹下运行docker compose up命令
docker compose up
效果图:
(PS:1、一开始加载都会比较久,因为需要到国外去下载东西,所以需要耐心等待;2、可以不用去管那个WARNING,一开始我看它颜色是红色以为是报错了,然后一直上网找解决方案,但好像都解决不了,后来继续时发现这个WARNING并不影响实际使用)
另起一个窗口访问服务器,使用docker ps命令能看到运行中的docker容器
(8)另起一个窗口访问服务器,访问服务器的8000端口(在步骤4(5)进行了8000:5000的端口映射),发现输出Hello World!的语句
5、使用compose构建的docker容器的名称是自动生成的,生成规则为文件名-服务名-num(num是副本的数量,用集群跑compose时,到时候就会自动生成docker容器,num就会自动往上加)
6、查看compose的网络规则
(1)使用以下命令查看所有的docker网络
docker network ls
效果图:
(2)找到compose自动生成的网络,即composetest_default,然后使用以下命令查看该网络的详情,发现composetest_redis_1和composetest_web_1在同一个网络下,所以这两个docker容器之间能通过容器名或容器id互相访问
docker network inspect composetest_default
效果图:
其他:
1、第一步是确认应使用的Compose版本
(1)去看官方文档,根据给出的文档选择对应的Compose版本
https://docs.docker.com/compose/compose-file/compose-file-v3/
Compose和Docker Engine版本对比截图:
(2)使用以下命令查看自己的docker engine版本
docker version
效果图:
(3)由图可知我的Docker Engine版本为20.10.17,根据官方文档的版本对比表,没有对应Docker Engine 20版本的Compose版本,所以只能使用最新的Compose 3.8版本
#通过对比Compose和Docker Engine的版本,得出Compose使用3.8版本
version:'3.8'
2、第二步配置services
官方文档:https://docs.docker.com/compose/compose-file/compose-file-v3/#service-configuration-reference
#配置我们自己的服务
services:
#服务名称
web
#跟docker build命令一样
build:
#表示在指定目录下找Dockerfile
context: .
#Dockerfile的名称
dockerfile:
#当前服务跑在哪个地址上
network:host
#容器启动时执行的命令
command:bundle exec thin -p 3000
#Entrypoint指令用于设定容器启动时第一个运行的命令及其参数
entrypoint: /code/entrypoint.sh
#指定docker容器的名称
container_name: my-web-container
#依赖关系:有些项目需要redis先启动,项目后启动,所以这时候需要配置依赖关系,如下配置就是让db服务先启动,然后redis服务启动,最后web服务才启动
depends_on:
- db
- redis
#配置环境变量
environment:
#当前服务对外暴露的端口
expose:
- "8080"
#服务的镜像名称
image:web:0.1
#服务名称
redis:
#服务的镜像名称
image: redis
#服务名称
db:
#服务的镜像名称
image: mysql
3、第三步配置其他参数(不做硬性要求)
#容器数据卷挂载目录
volumes:
- type: volume
#主机目录
source: mydata
#容器目录
target: /data
volume:
nocopy: true
#配置docker自定义网络
networks:
- my-network
configs:
创作不易,如果这篇文章对你有帮助,希望能点个赞帮助文章的推广,如果文章有错漏,希望各位能批评指正,谢谢大家。