一篇文章带你入门docker-compose

6,514 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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是向下兼容的,高版本可向下兼容:

图片.png

因为这一步很重要,我们详细讲一下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

图片.png

结语

简单学习了一下docker-compose的应用,本文就个人学习过程简单记录了一下,并没有太过深入的讲解,总结一下来说docker-compose还是挺好用的,有兴趣的小伙伴可以自己去尝试一下。