赞
踩
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:
创作不易,如果这篇文章对你有帮助,希望能点个赞帮助文章的推广,如果文章有错漏,希望各位能批评指正,谢谢大家。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。