持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
引文
之前写了一篇DOCKER的基础知识文章,今天来补习一下DOCKER的进阶知识—COMPOSE,Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。本文就个人在学习该知识时的经验来给大家简单讲一讲。
基本知识
基本流程
Compose 使用的三个步骤:
使用 Dockerfile 定义应用程序的环境。
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
最后,执行 docker-compose up 命令来启动并运行整个应用程序。
安装
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加可执行命令的权限:
sudo chmod +x /usr/local/bin/docker-compose
我们可以查看一下安装有没有成功:
$ docker-compose --version
yml文件
compose中比较重要的一部分就是yml文件的编写,首先我们看一下什么是yml文件:yml文件是一种键值对格式的文件,是compose的模板文件,包含 version、services、networks 三大部分。基本格式如下:
version:
services:
服务1:
#服务配置
服务2:
#服务配置
# 其他配置 网络、券、全局规则
volumes:
network:
configs:
这里需要注意的是version是向下兼容的,高版本可向下兼容:
因为这一步很重要,我们详细讲一下services 的书写规则:
image
services:
web:
image: xino
其中web为我们自定义的服务名称,而image则是对应的镜像文件名或者id,如果我们定义了一个没有的镜像,会自动帮我们拉取下载。
build
指定 Dockerfile 所在文件夹的路径。利用它自动构建镜像,然后使用这个镜像启动服务容器。
可以定义成绝对路径或者相对路径:
build: /path/
build: ./dir
command
设置容器启动后默认执行的命令:
command: bundle exec thin -p 3000
container_name
自定义容器名字:
container_name: xino
depends_on
因为我们启动容器时,有些服务可能会需要前置服务,我们可以通过depends_on来决定服务启动的先后顺序。
services:
web:
build: .
depends_on:
- redis
redis:
image: redis
db:
image: postgres
env_file
定义使用的环境变量:
env_file:
- ./common.env
假设我们编写一个关于nigix的yml文件:
version: '3' #版本号
services: #docker容器
nginx: #容器名称
container_name: nginx-1 #自定义启动后容器名
restart: always #设置为always,表明此容器应该在停止的情况下总是重启
image: nginx:latest #镜像名:版本号
ports: #启动端口号
- 4433:80
volumes: #数据卷,将容器中的文件与服务器映射
- ./conf.d:/etc/nginx/conf.d
environment: #环境配置
TZ: Asia/shandong
常用命令
简介介绍一些docker-compose里常用的一些命令:
# 1. 基于docker-compose.yml启动管理的容器
docker-compose up -d
# 2. 关闭并删除容器
docker-compose down
# 3. 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart
# 4. 查看由docker-compose管理的容器
docker-compose ps
# 5. 查看日志
docker-compose logs -f
使用示例
创建工程文件夹
mkdir composetest
cd composetest
创建创建python flask应用app.py文件:
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
因为app.py中import了flask和redis于是我们建立requestments.txt文件来方便后续导入:
flask
redis
接下来创建dockerfile文件,
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"]
简单分析一下命令:Python 3.7的镜像开始构建一个容器镜像。
将当前工作目录设置为 /code
安装Python依赖关系(requestments.txt)。
将容器的默认命令设置为python app.py
下一步就是编写docker-compose.yml文件
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
简单分析一下含义,定义了WEB和REDIS服务,使用我们指定的目录中的Dockerfile构建映像。
将容器上的暴露端口5000映射到主机上的端口8000。 我们使用Flask服务器的默认端口5000。
redis容器:
redis服务使用从Docker Hub提取公共镜像。
接下来我们创建运行docker-compose
docker compose up
成功后我们便可以查看镜像:
docker images
结语
简单学习了一下docker-compose的应用,本文就个人学习过程简单记录了一下,并没有太过深入的讲解,总结一下来说docker-compose还是挺好用的,有兴趣的小伙伴可以自己去尝试一下。