docker容器实战十四:dockercompose介绍

author author     2022-12-06     401

关键词:

在前面的介绍中我们都是以单个容器为例来进行演示。但在实际的生产环境中,一个应用往往会有多个组件,并分别运行在不同的容器。在这种多容器的场景下,使用Docker客户端进行管理会存在较大的不便利性。

基于这类场景,Docker官方提供了一个多容器的管理工具 Docker Compose。它是一个Python开发的工具,可对具有多个容器的应用进行操作,从而实现快速高效的管理。

本文将对Docker Compose相关的使用方法进行讲解介绍。

一. 部署安装

Compose作为一个独立的工具,本身并没有与Docker客户端进行集成 ,需要单独安装。(注:在安装之前,主机上必须先安装好Docker引擎

Compose的部署安装有RPM包、二进制、脚本安装等几种方式,本文将演示RPM包与二进制的安装操作。

1. RPM包安装

  • 安装
$ yum install -y docker-compose-plugin
  •  验证程序是否正常
$ docker compose version
Docker Compose version v2.6.0

2. 二进制文件安装

  • 下载二进制文件 
$ mkdir -p /usr/local/lib/docker/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
  • 添加执行权限
$ sudo chomd +x /usr/local/lib/docker/cli-plugins/docker-compose
  • 验证程序是否正常
$ docker compose version
Docker Compose version v2.6.0


二. 模板文件 

Docker Compose使用基于yml格式的模板文件来定义应用,默认的模板文件名称为docker-compose.yml。

我们先来了解一下模板的格式 ,如下是一个模板示例,它定义了两个应用服务。

version: "3.9"
services:
myapp:
build: ./myapp
ports:
- "80:80"
container_name: myapp
depends_on:
- database
networks:
- mynet
database:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
container_name: db
volumes:
- "mydata:/var/lib/mysql"
networks:
- mynet
networks:
mynet:
driver: bridge


volumes:
mydata:


下面我们根据模板的各个功能参数来进行拆分讲解:

version 

定义了Compose文件使用的API版本(并非Compose产品自身版本),一般建议使用最新的版本,此处使用3.9。

services

用于定义不同的应用服务,此处定义了两个服务:web和database。Docker Compose会将每个服务部署在各自的容器中。

build

指定Dockerfile所在文件夹的路径(可支持绝对路径或相对路径),Compose 会使用它来构建镜像,该镜像会被用于启动该服务的容器。

ports

指定Docker容器的端口映射到主机,该功能与docker run  启动容器的 -p 选项一样,格式为“主机端口:容器端口”。如果只指定了容器端口,那么主机端口将使用随机端口。

container_name

用于指定容器名称,如果不指定的话,则默认会使用“目录名+服务名+序号”这样的格式来表示。

depends_on

指定服务间的依赖关系。如本例所示,由于myapp依赖于database服务,所以Docker Compose会先启动database服务对应的容器,然后再进行myapp的启动。

networks

一级的networks参数用于指定创建服务所使用的网络,此处指定名称为mynet,Compose会在该名称前面再加上目录名称作为创建的网络名称,格式为“目录名_mynet”。网络驱动使用bridge,表明这是一个bridge网络。

services 项中的服务使用networks用于指定加入的网络,此处都使用mynet网络。

image

指定服务使用的镜像。本示例中的database服务使用mysql:5.7的镜像,Compose会自动下载该镜像用于启动容器。

environment

设置环境变量,该变量会在容器启动时自动加载。如果只指定了变量名称,则会自动获取Compose主机上对应变量的值,这种方式可用来防止重要数据的泄漏。

示例:

environment:
api_key:

volumes

指定容器挂载的数据卷,可以使用目录挂载或volumes挂载。

示例:目录挂载

volumes:
- "/data/mysql:/var/lib/mysql"

示例:volumes挂载

volumes:
- mydata:/var/lib/mysql

volumes:
mydata:

除了以上这些常用的参数外,Docker Compose还有不少其他的参数可以使用,限于篇幅原因在此不做过多介绍,有兴趣的读者可自己查看相关资料。


三. 管理应用

Docker Compose在新的版本中,使用的命令格式与其他docker 命令类似,为“ docker compose + 选项 + [参数]”。原有的“docker-compose 命令不再使用。

1. 查看帮助

执行"docker compose --help" 可查看命令的详细介绍

$ docker compose --help
......
Commands:
build Build or rebuild services
convert Converts the compose file to platforms canonical format
cp Copy files/folders between a service container and the local filesystem
create Creates containers for a service.
down Stop and remove containers, networks
events Receive real time events from containers.
exec Execute a command in a running container.
images List images used by the created containers
kill Force stop service containers.
logs View output from containers
......


2. 构建镜像

使用docker compose build 命令可用于构建项目中镜像,我们可以使用此命令先提前准备好相关的镜像。否则 ,相关镜像将在启动服务时进行构建。

$ docker compose build
[+] Building 3.3s (2/3)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 92B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.7-alpine
......

构建完成后,我们可以看到镜像已经生成,镜像名称格式为“目录名+服务名”。​

$ docker compose images
Container Repository Tag Image Id Size
myapp test_myapp latest fda100c4b2ae 51.6MB


3. 服务创建并启动

使用docker compose up 命令可启动docker-compose.yml 模板文件中定义的服务,通常会在命令后面加上 -d ,用于后台启动。该命令会构建所需的镜像、创建网络和存储卷、然后进行容器的启动等操作。

由于前面已提前构建好myapp的镜像,故这里只需要拉取database的镜像,并创建相关的容器资源即可。

$ docker compose up -d
[+] Running 12/12
⠿ database Pulled 98.0s
⠿ 72a69066d2fe Pull complete 35.4s
⠿ 93619dbc5b36 Pull complete 35.5s
⠿ 99da31dd6142 Pull complete 35.7s
⠿ 626033c43d70 Pull complete 35.9s
⠿ 37d5d7efb64e Pull complete 35.9s
⠿ ac563158d721 Pull complete 36.8s
⠿ d2ba16033dad Pull complete 36.9s
⠿ 0ceb82207cd7 Pull complete 36.9s
⠿ 37f2405cae96 Pull complete 80.7s
⠿ e2482e017e53 Pull complete 80.7s
⠿ 70deed891d42 Pull complete 80.8s
[+] Running 4/4
⠿ Network test_mynet Created 0.2s
⠿ Volume "test_mydata" Created 0.0s
⠿ Container db Started 0.5s
⠿ Container myapp Started

查看容器状态,可看到服务容器已正常启动。

docker compose ps
NAME COMMAND SERVICE STATUS PORTS
db "docker-entrypoint.s…" database running 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
myapp "python /opt/myapp/m…" myapp running 0.0.0.0:80->80/tcp, :::80->80/tcp


4.  停止/启动服务

使用docker compose stop/start 命令可对服务相关的容器进行停止/启动。

停止服务

$ docker compose stop 
[+] Running 2/2
⠿ Container myapp Stopped 10.2s
⠿ Container db Stopped

启动服务

$ docker compose start
[+] Running 2/2
⠿ Container db Started 0.4s
⠿ Container myapp Started


5. 服务下线

使用docker compose down 会将服务相关的容器与网络进行停止并清理删除,只保留镜像、存储卷等资源。

$ docker compose down
[+] Running 3/3
⠿ Container myapp Removed 10.2s
⠿ Container db Removed 1.9s
⠿ Network test_mynet Removed



 专注于Devops、SRE、运维开发等技术分享,扫码关注公众号,获取更多精彩内容! Docker容器实战十四:Docker

16.docker技术入门与实战---容器实战思考

第16章 容器实战思考16.1 Docker为什么会成功16.2 研发人员该如何看待容器16.3 容器化开发模式16.4 容器与生产环境         查看详情

16.docker技术入门与实战---容器实战思考

第16章 容器实战思考16.1 Docker为什么会成功16.2 研发人员该如何看待容器16.3 容器化开发模式16.4 容器与生产环境         查看详情

docker(二十四)-docker使用portainer搭建可视化界面

Portainer介绍Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操... 查看详情

docker(十四)-docker四种网络模式(代码片段)

Docker安装时会自动在host上创建三个网络,我们可用 dockernetworkls 命令查看:none模式,使用--net=none指定,该模式关闭了容器的网络功能。host模式,使用--net=host指定,容器将不会虚拟出自己的网卡,配置自己的IP等,而是... 查看详情

docker容器实战十:容器网络

...络的技术原理。一. 容器网络模型在最初的版本中,Docker的网络功能集成在​DockerDaemon的代码中,这使得整体架构变得臃肿且缺乏灵活性,无法适应复杂的网络需求。为此,Docker公司在后面提出了CNM(ContainerNetworkModel,可译... 查看详情

尝试从 Spring Boot Docker 容器连接到 mongo Docker 容器时验证 MongoCredential 时出错?

...er?【发布时间】:2020-07-2109:31:54【问题描述】:我有以下dockercompos 查看详情

docker容器从入门到实战0826

##docker容器安装和配置####docker的git-hub网站(账号rshare,密rshare520):https://github.com/login#docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com#docker官网文档和镜像:https://docs.docker.com/samples/centos/#doc 查看详情

容器化-docker实战

一、前言  本文将系统性的介绍Docker相关的知识;包含Docker命令,Dockerfile语法,如何用Docker进行构建运行。二、Docker安装  本文以centos7及以上版本为例来说明Docker安装;Docker底层对应的是镜像,不可写的文件系统,它的存... 查看详情

云原生之docker实战容器的资源限制使用方法

【云原生之Docker实战】容器的资源限制使用方法一、容器资源限制介绍二、检查本地Docker状态三、查看本地容器系统相关文件1.查看容器配置目录2.查看内存相关文件3.查看cpu相关文件四、容器内存资源的限制1.查看内存限制的选... 查看详情

docker实战系列之快速删除docker中的容器(代码片段)

1、停用全部运行中的容器dockerstop$(dockerps-q)2、删除全部容器dockerrm$(dockerps-aq)3.停用并删除容器dockerstop$(dockerps-q)&dockerrm$(dockerps-aq)  查看详情

容器与容器编排实战系列1--docker安装(代码片段)

CentOS7.4下安装Docker详细步骤 第一步:安装Dockeryuminstall-yyum-utilsdevice-mapper-persistent-datalvm2yum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repoyuminstall-ydocker-cesy 查看详情

docker容器从入门到实战0826(笔记整理)

##docker容器安装和配置####docker的git-hub网站(账号rshare,密rshare520):https://github.com/login#docker官网hub仓库(账号flyer520,密码rhsare520):https://hub.docker.com#docker官网文档和镜像:https://docs.docker.com/samples/centos/#doc 查看详情

实战docker入门实战一

Docker是什么Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完... 查看详情

虚拟化容器docker基础-应用-实战全套课程

视频课程包含:10G01.第一阶段:Docker基础篇、02.第二阶段:Docker应用篇、03.第三阶段:Docker实战篇;目录01.第一阶段:Docker基础篇02.第二阶段:Docker应用篇03.第三阶段:Docker实战篇获取方式:关注公众微信号:博涵大数据或者扫... 查看详情

hellodocker——dockercompose(代码片段)

HelloDocker(九)——DockerCompose一、DockerCompose简介1、DockerCompose简介DockerCompose项目是Docker官方的开源项目,用于在单台服务器或主机上对多个Docker容器快速编排。DockerCompose将所管理的容器分为三层,分别是工程(project),服务(... 查看详情

docker容器实战十一:数据存储

存储对于业务的重要性不言而喻,而Docker作为最受欢迎的容器产品,本身也提供了非常优秀的数据存储机制。Docker的存储可分为容器存储 、持久化存储和临时存储三种方式,它们之间各有特点并分别适用于不同的场景,本文... 查看详情

docker容器实战十三:容器安全的最佳实践

...,从而给系统带来较大的安全隐患,所以应该被禁止。$dockerrun-d--privilegednginx2. 限制容器的资源使用默认情况下,主机上的容器对于资源的访问并没有受到限制。此时,当 查看详情

虚拟化容器docker核心技术实战视频课程

===============课程目录===============├─(1)01Docker_前提知识要求和课程简介.avi├─(2)02__Docker_为什么会出现.avi├─(3)03Docker_理念.avi├─(4)04Docker_是什么.avi├─(5)05__Docker_能干什么.avi├─(6)06Docker_三要素.avi├─(7)07Docker_CentOS6安装Do 查看详情