Docker系列10—容器编排工具Docker Compose详解
本文收录在容器技术学习系列文章总目录
1、Docker Compose 概述
Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用Compose文件来配置应用程序的服务。然后,使用单个命令,您可以从配置中创建并启动所有服务。
Compose非常适合开发,测试和登台环境以及CI工作流程。
(1)官方文档
(2)使用Compose基本上是一个三步过程
- 定义您的应用程序环境,Dockerfile以便可以在任何地方进行复制。
- 定义构成应用程序的服务,docker-compose.yml以便它们可以在隔离环境中一起运行。
- 最后,运行docker-compose up和Compose将启动并运行整个应用程序。
(3)一个 docker-compose.yml 文件案例:
version: '2' services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: redis
有关Compose文件的详细信息,请参阅 Compose文件参考。
(4)Compose具有管理应用程序整个生命周期的命令:
- 启动,停止和重建服务
- 查看正在运行的服务的状态
- 流式传输运行服务的日志输出
- 在服务上运行一次性命令
2、Docker Compose 安装
2.1 安装条件
(1)前提
Docker Compose 依靠Docker Engine 进行任何有意义的工作,因此请确保您已在本地或远程安装Docker Engine,具体取决于您的设置。
要以非root用户身份运行Compose,请参阅以非root用户身份管理Docker。
(2)安装系统(主要讲linux、pip安装)
- Linux
- Mac
- Windows
- 备用安装选项(使用pip安装/安装为容器)
2.2 在Linux系统上安装Compose
(1)下载安装
在gitlab https://github.com/docker/compose/releases 上查询适合自己的版本
我这里下载的是1.23.2 版本
$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
(2)添加执行权限
$ chmod +x /usr/local/bin/docker-compose
(3)安装完成,查询版本
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
2.3 备用安装选项(使用pip安装/安装为容器)
2.3.1 使用pip安装
可以使用pypi安装Compose pip。如果你安装使用pip,我们建议你使用 virtualenv,因为许多操作系统都有python系统包与docker-compose依赖项冲突。请参阅virtualenv教程以开始使用。
$ pip install docker-compose
如果你没有使用virtualenv
$ sudo pip install docker-compose
注:需要6.0或更高版本的pip。
2.3.2 安装为容器
Compose也可以在一个容器内运行,来自一个小的bash脚本包装器。要将compose安装为容器,请运行此命令。如果此示例已过期,请务必将版本号替换为所需的版本号:
$ sudo curl -L --fail https://github.com/docker/compose/releases/download/{{site.compose_version}}/run.sh -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
2.4 其他系统安装(略)
2.4.1 在macOS上安装Compose
Docker Desktop for Mac和Docker Toolbox已经包含Compose和其他Docker应用程序,因此Mac用户无需单独安装Compose。Docker安装说明如下:
2.4.2 在Windows系统上安装Compose
Docker Desktop for Windows和Docker Toolbox已经包含Compose和其他Docker应用程序,因此大多数Windows用户不需要单独安装Compose。Docker安装说明如下:
如果您直接在Microsoft Windows Server 2016上运行Docker守护程序和客户端(使用适用于Windows Server 2016的Docker EE,则需要安装Docker Compose。为此,请按照下列步骤操作
2.5 Docker Compose 升级
如果从Compose 1.2或更早版本升级,请在升级Compose后删除或迁移现有容器。这是因为,从版本1.3开始,Compose使用Docker标签来跟踪容器,并且需要重新创建容器以添加标签。
如果Compose检测到没有标签创建的容器,它将拒绝运行,因此您最终不会使用两组。如果要继续使用现有容器(例如,因为它们具有要保留的数据卷),可以使用Compose 1.5.x使用以下命令迁移它们:
docker-compose migrate-to-labels
或者,如果您不担心保留它们,可以将它们删除。撰写只是创建新的。
docker container rm -f -v myapp_web_1 myapp_db_1 ...
2.6 Docker Compose 卸载
正常系统安装卸载:
sudo rm /usr/local/bin/docker-compose
pip安装卸载:
pip uninstall docker-compose
3、一个完整的Docker Compose 运用演示
3.1 compose 准备
(1)创建compose 工作目录
[root@along ~]# mkdir composetest
[root@along ~]# cd composetest/
(2)创建一个app.py文件,后面在项目目录中调用文件
[root@along composetest]# vim app.py
import time import redis
from flask import Flask app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379) 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 'Hello World! I have been seen {} times.\n'.format(count) if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
注:redis是应用程序网络上redis容器的主机名。我们使用Redis的默认端口6379。
(3)创建requirements.txt 项目目录中调用的另一个文件
[root@along composetest]# vim requirements.txt
flask
redis
3.2 创建Dockerfile,用于启动一个简单的容器
创建一个名为的文件Dockerfile
[root@along composetest]# vim Dockerfile
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
注:从Python 3.4映像开始构建映像。详细的dockerfile用法详见:Docker系列07—Dockerfile 详解
- 将当前目录添加.到/code映像中的路径中。
- 将工作目录设置为/code。
- 安装Python依赖项。
- 将容器的默认命令设置为python app.py。
3.3 在Compose文件中定义服务
创建docker-compose.yml项目目录中调用的文件
[root@along composetest]# vim docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
此Compose文件定义了两个服务,web和redis。该web服务:
- 使用从Dockerfile当前目录中构建的图像。
- 将容器上的公开端口5000转发到主机上的端口5000。我们使用Flask Web服务器的默认端口5000。
该redis服务使用从Docker Hub注册表中提取的公共 Redis映像。
3.4 使用Compose构建并运行您的应用程序
(1)在项目目录中,启动应用程序 docker-compose up
[root@along composetest]# docker-compose up
Recreating composetest_web_1 ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 15 Jan 2019 07:03:23.107 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379.
redis_1 | 1:M 15 Jan 2019 07:03:23.108 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 15 Jan 2019 07:03:23.108 # Server initialized
redis_1 | 1:M 15 Jan 2019 07:03:23.108 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 15 Jan 2019 07:03:23.108 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * DB loaded from disk: 0.000 seconds
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Ready to accept connections
(2)浏览器查询http://192.168.130.102:5000/,验证
(3)刷新页面,数字应该增加
(4)另开一个终端,查看镜像验证
[root@along harbor]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest ca6d50ca9694 About a minute ago 77.2MB
redis alpine b42dc832c855 3 weeks ago 40.9MB
python 3.4-alpine bb81744a76cf 3 weeks ago 65.8MB
(5)关闭服务
在新开的终端docker-compose down,或者在启动应用程序的原始终端中按CTRL + C来停止应用程序。
3.5 修改compose 配置,添加存储卷
[root@along composetest]# vim docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
注:新volumes密钥将主机上的项目目录(当前目录)/code安装到容器内,允许您动态修改代码,而无需重建映像。
3.6 测试存储卷
(1)重新启动compose
[root@along composetest]# docker-compose up
Recreating composetest_web_1 ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1 | 1:C 15 Jan 2019 07:03:23.107 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1 | 1:C 15 Jan 2019 07:03:23.107 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 15 Jan 2019 07:03:23.108 * Running mode=standalone, port=6379.
... ...
(2)在宿主机的存储卷上,修改代码
[root@along composetest]# vim app.py
return 'Hello World! I am along! I have been seen {} times.\n'.format(count)
将Hello World! 邮件更改为Hello World! I am along!
(3)再在浏览器刷新,验证成功
3.7 docker-compose 其他命令
(1)在后台运行服务,-d(用于“分离”模式)
[root@along composetest]# docker-compose up -d
Starting composetest_web_1 ... done
Starting composetest_redis_1 ... done
(2)使用docker-compose ps以查看当前正在运行的内容
[root@along composetest]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
composetest_web_1 python app.py Up 0.0.0.0:5000->5000/tcp
(3)docker-compose run命令允许您为服务运行一次性命令。例如,要查看web服务可用的环境变量 :
[root@along composetest]# docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=3848578f8fff
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.4.9
PYTHON_PIP_VERSION=18.1
HOME=/root
(4)停止服务
[root@along composetest]# docker-compose stop
Stopping composetest_web_1 ... done
Stopping composetest_redis_1 ... done
(5)使用该down 命令完全删除容器。加--volumes 参数还可以删除Redis容器使用的数据卷
[root@along composetest]# docker-compose down --volumes
Removing composetest_web_run_18e4bbaa4b33 ... done
Removing composetest_web_1 ... done
Removing composetest_redis_1 ... done
Removing network composetest_default
Docker系列10—容器编排工具Docker Compose详解的更多相关文章
- 使用容器编排工具docker swarm安装clickhouse多机集群
1.首先需要安装docker最新版,docker 目前自带swarm容器编排工具 2.选中一台机器作为master,执行命令sudo docker swarm init [options] 3,再需 ...
- Docker系列01—容器的发展历程---Docker的生态圈
本文收录在容器技术学习系列文章总目录 Docker 和容器技术的发展可谓是日新月异,本文试图以全局的视角来梳理一下 docker 目前的生态圈.既然是概览,所以不会涉及具体的技术细节. Docker ...
- Docker那些事儿之编排工具docker-compose
前面已经讲解过docker的一些基础使用,镜像创建的操作过程,如果大量容器需要同时部署,一个一个容器进行服务器上的部署,估计要疯掉,在使用上我们需要找到更好更便捷的使用方式,今天要讲解的容器编排工具d ...
- Docker系列08—搭建使用私有docker registry
本文收录在容器技术学习系列文章总目录 1.了解Docker Registry 1.1 介绍 registry 用于保存docker 镜像,包括镜像的层次结构和元数据. 启动容器时,docker dae ...
- K8s(一)----容器编排工具基础概念
kubernetes(k8s)容器编排工具基础概念 Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controlle ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- 黑苹果引导工具 Clover 配置详解及Clover Configurator使用
黑苹果引导工具 Clover 配置详解及Clover Configurator使用 2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥 简介: 可 ...
- Protobuf 文件生成工具 Prototool 命令详解
Protobuf 文件生成工具 Prototool 命令详解 简介 Prototool 是 Protobuf 文件的生成工具, 目前支持go, php, java, c#, object c 五种语言 ...
- 日志分析工具ELK配置详解
日志分析工具ELK配置详解 一.ELK介绍 1.1 elasticsearch 1.1.1 elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分 ...
随机推荐
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
- linux系统做raid
raid 常用步骤 1.ctrl+R 进入raid设置界面 2.F2 相当于右键功能 3.箭头 → 是下一个选项功能 4.ctrl+n是下一页,ctrl+p是前一页 5.Esc退出.最后ctrl+al ...
- Linux_常用命令简单介绍(netstat,awk,top,tail,head,less,more,cat,nl)
1.netstat netstat -tnl | grep 443 (查看443端口是否被占用) root用户,用netstat -pnl | grep 443 (还可显示出占用本机443端口的进程P ...
- 源码安装python +NGINX 的坎坷路 +uwsgi安装 部署django 的CRM项目
一.Nginx安装(基于ubuntu17.10 版本) 首先我们是基于源码安装,主要有如下步骤 1.安装依赖包 1.安装gcc g++的依赖库 sudo apt-get install build-e ...
- (BUG记录)记一次与其他系统交互协作时造成的锁表问题
最近两日做公司电信某计费项目时,接收一个银行对账的任务,在完成对账后.电信和银行两方金额一致时需要进行充值.冲正操作保持金额一致.冲正服务是JAVA统一调用Tuxedo服务,这个服务已经是一个稳定可用 ...
- Mybatis Mapper文件中的一小坑
前几天来一需求,实现过程中需要修改一个底层的查询接口,具体修改就是在where中添加一个条件,由于这个底层SQL使用的地方太多,所以就想着是用if加一标识符做个判断,传一个只有我会使用的参数,然后动态 ...
- django(models)视图与html 简单的操作
!数据提前写好 urls映射图 点击a标签之后
- 通用类 对象和XML互转
public class XMLHealper { /// <summary> /// 将自定义对象序列化为XML字符串 /// </summary> /// <para ...
- WebGL绘制有宽度的线
WebGL中有宽度的线一直都是初学者的一道门槛,因为在windows系统中底层的渲染接口都是D3D提供的,所以无论你的lineWidth设置为多少,最终绘制出来的只有一像素.即使在移动端可以设置有宽度 ...
- 深入理解JVM垃圾收集机制,下次面试你准备好了吗
程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收.垃圾回收主要是针对 Java 堆和方法区进行. 判断一个对 ...