Docker Compose - 安装和基本使用

Que_art 2024-07-13 12:37:15 阅读 87

一、概述

Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。Compose 用 YAML 文件配置应用程序的服务。使用单一命令,可以从 YAML 文件配置中创建并启动所有服务。适用于所有环境生产、开发、测试以及 CI/CD 工作流程。

Compose的使用三步:

使用 Dockerfile 自定义应用程序的环境,便于在任何地方复制它;使用 docker-compose.yml 定义构成的应用程序的服务,便于隔离环境中一起运行;运行 docker-compose up 命令启动并运行整个应用程序。

二、Docker Compose与Docker关系

2.1 Docker Compose(容器编排工具)

定义:Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。

功能:

多容器管理:允许用户在一个YAML文件中定义和管理多个容器服务编排:配置容器间的网络和依赖关系一键部署:使用docker-compose up命令启动、停止和重建服务

用途:简化多容器应用的配置和管理,适用于开发、测试和生产环境中的复杂应用。

2.2 Docker(容器平台)

定义:一个开放源代码的容器化平台,允许开发者将应用及其依赖打包进轻量级、可移植的容器中。

功能:

容器化:将应用和其运行环境封装在一个容器中镜像管理:创建、存储和分发容器镜像容器运行:可以运行在任何支持Docker的环境中

用途:提供一个标准化的方式打包和运行应用,确保应用在不同环境中的一致性和可移植性。

2.3 两者关系

Docker 是 Docker Compose 的前提,Docker Compose 是为了简化使用 Docker 时多容器应用的管理和部署而设计的。两者之间相辅相成,Docker 提供容器化的核心功能,Docker Compose 则管理这些容器的组合和交互。两者面向不同用户,Docker 面向任何需要容器化应用的用户,Docker Compose 则面向需要同时管理多个容器的开发者和运维团队。

2.4 两者版本兼容

Compose版本 Docker版本
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+

3.4

17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+

三、Compose 安装

1.查看docker版本:

<code>[root@localhost ~]# docker --version

Docker version 24.0.7, build afdd53b

2.下载docker-compose软件:

[root@localhost ~]# wget https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64

3.移动下载软件到/usr/local/bin/docker-compose覆盖旧版本:

[root@localhost ~]# mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

mv: overwrite ‘/usr/local/bin/docker-compose’? y

4.赋予执行权限:

[root@localhost ~]# chmod +x /usr/local/bin/docker-compose

5.测试安装是否成功:

[root@localhost ~]# docker-compose --version

Docker Compose version v2.16.0

6.卸载docker compose:

[root@localhost ~]# rm -f /usr/local/bin/docker-compose

四、Docker Compose--文件基本结构

        Docker Compose 文件是 Docker Compose 工具的核心,用于定义和配置多容器 Docker 应用。采用 YAML格式编写。

docker-compose.yml配置案例

version: "3.9"

services:

web:

build: .

ports:

- "8000:5000"

volumes:

- .:/code

- logvolume01:/var/log

links:

- redis

redis:

image: redis

volumes:

logvolume01: {}

文件配置解释说明:

version:指定 Compose 文件格式yaml的规则版本,版本决定可用的配置选项service:定义了应用中的服务,每个服务可以使用不同的镜像、环境设置和依赖关系

web:自己构建的镜像

build:用于构建镜像,指定构建镜像的 dockerfile 的上下文路径ports:映射容器和宿主机的端口volumes:挂载本地目录到指定容器目录,用于数据持久化或在容器之间共享数据links:与redis服务连接redis:构建指定镜像redis

image:从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 IDvolumes:用于数据持久化和共享的数据卷定义,常用于数据库存储、配置文件、日志等数据的持久化

五、基本使用--案例

目录结构:

[root@localhost ~]# tree counter-app-master

├── app.py    #应用程序代码(Python Flask应用)

├── docker-compose.yml    #compose文件,定义Docker部署应用

├── Dockerfile    #定义构建web-fe服务所使用的镜像

└── requirements.txt    #应用所依赖的Python包

1.定义应用程序依赖项:

[root@localhost ~]# mkdir counter-app-master #创建测试目录

[root@localhost ~]# cd counter-app-master

[root@localhost counter-app-master]# vim app.py #创建名为app.py的文件

import time

import redis

from flask import Flask

app = Flask(__name__)

cache = redis.Redis(host='redis', port=6379)code>

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 "What's up Docker Deep Divers! You've visited me {} times.\n".format(count)

if __name__ == "__main__":

app.run(host="0.0.0.0", debug=True)code>

        上述此示例中,redis 是应用程序网络上的 redis 容器的主机名,所以使用默认端口6379。

在测试目录中创建名为 requirements.txt 的文件:

[root@localhost counter-app-master]# cat requirements.txt

flask

redis

2.编写Dockerfile文件:

redis[root@localhost counter-app-master]# cat Dockerfile

FROM python:3.6-alpine

ADD . /code

WORKDIR /code

RUN pip install -r requirements.txt

CMD ["python", "app.py"]

Dockerfile文档逐行解释说明:

从 Python 3.6 镜像开始构建将当前目录拷贝到容器/code目录下定义容器工作目录为/code安装 Python 依赖项容器默认执行命令

3.编写docker-compose.yml文件定义服务:

[root@localhost counter-app-master]# cat docker-compose.yml

version: "3.5"

services:

web-fe:

build: .

command: python app.py

ports:

- target: 5000

published: 5000

networks:

- counter-net

volumes:

- type: volume

source: counter-vol

target: /code

redis:

image: "redis:alpine"

networks:

counter-net:

networks:

counter-net:

volumes:

一级key解释说明:

version:定义 compose 文件格式的版本services:定义不同的应用服务,上述定义web前端服务以及redis缓存数据库服务。Docker compose会将每个服务部署为一个容器,且会将key作为容器名字的一部分networks:创建新的网络,默认自动创建bridge网络。此网络只能实现与同一主机容器连接volumes:创建新卷

二级key解释说明:

web-fe服务指令解释说明:

build:. 代表基于当前目录,. 下Dockerfile中定义的指令构成一个新镜像,该镜像将被用于启动该服务的容器command:在容器中执行名为app.py的Python脚本作为主程序,所以在Dockerfile中将满足镜像中包含app.py及Pythonports:容器内的5000端口映射到主机5000端口networks:指定服务连接的网络,且指定的网络需要存在,或是在一级key中的networks中定义过volumes:将counter-vol卷挂载到容器/code,且指定卷counter-vol需要存在,或是在一级key中的volumes中定义过

redis服务指定解释说明:

image:基于redis:alpine镜像启动一个独立名为redis的容器networks:配置redis容器连接counter-net网络

4.启动应用程序:

[root@localhost counter-app-master]# docker-compose up #前台启动

[+] Building 143.1s (9/9) FINISHED

=> [internal] load build definition from Dockerfile 0.1s

...

counter-app-master-web-fe-1 | * Restarting with stat

counter-app-master-web-fe-1 | * Debugger is active!

counter-app-master-web-fe-1 | * Debugger PIN: 127-376-714

[root@localhost counter-app-master]# docker-compose up -d #后台启动

[+] Running 2/2

⠿ Container counter-app-master-redis-1 Started 0.9s

⠿ Container counter-app-master-web-fe-1 Started 1.2s

查看镜像、容器、网络及卷:

[root@localhost counter-app-master]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

counter-app-master-web-fe latest da547efce15a 52 minutes ago 55.1MB

redis alpine 3900abf41552 2 years ago 32.4MB

[root@localhost counter-app-master]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

775de272840c counter-app-master-web-fe "python app.py" 52 minutes ago Up 2 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp counter-app-master-web-fe-1

60badb2d9db4 redis:alpine "docker-entrypoint.s…" 52 minutes ago Up 2 minutes 6379/tcp counter-app-master-redis-1

[root@localhost counter-app-master]# docker network ls

NETWORK ID NAME DRIVER SCOPE

2d11a73f849e bridge bridge local

7bc0ef96bf07 counter-app-master_counter-net bridge local

303bac79a650 host host local

f08b7d46c61e none null local

[root@localhost counter-app-master]# docker volume ls

DRIVER VOLUME NAME

local counter-app-master_counter-vol

测试访问结果:每刷新一次页面,计数将叠加

六、常用命令

启动服务:

        docker-compose up    #在前台启动服务

        docker-compose up -d    #启动服务在后台运行

        docker-compose up --build    #重新构建服务

停止并移除服务、网络、卷和默认镜像:

        docker-compose down    #停止并移除服务

        docker-compose down -v    #停止服务并移除卷

暂停服务:

        docker-compose pause

取消暂停服务:

        docker-compose unpause

查看服务日志:

        docker-compose logs    #查看所有服务日志

        docker-compose logs -f    #实时查看日志

启动服务:

        docker-compose start

停止服务:

        docker-compose stop

重启服务:

        docker-compose restart

查看当前服务状态:

        docker-compose ps

进入后台运行的容器:

        docker-compose exec 容器名 /bin/sh

拉取镜像:

        docker-compose pull

构建镜像:

        docker-compose build

删除或停止容器:

        docker-compose rm

本地系统和容器之间复制文件/文件夹:

        docker-compose cp



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。