继续创造,加速生长!这是我参与「日新方案 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构建映像。
将容器上的露出端口8000映射到主机上的端口5000。 我们运用Flask Web服务器的默许端口5000。
redis容器:
redis服务运用从Docker Hub提取公共镜像。
接下来我们创建工作docker-compose
docker compose up
成功后我们便可以查看镜像:
docker images
结语
简略学习了一下docker-compose的运用,本文就个人学习进程简略记录了一下,并没有过分深化的解说,总结一下来说docker-compose仍是挺好用的,有爱好的小伙伴可以自己去测验一下。