Docker Compose集成式应用组合及service编排

Stella981
• 阅读 1127

Compose简介

Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。其代码目前在 https://github.com/docker/compose 开源。 Compose定位是定义和运行多个Docker容器的应用,其前身是开源项目Fig。

使用一个Dockerfile模板文件,可以很方便的定义一个单独的应用容器,然而在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务。例如要实现一个Web项目,除了Web服务器本身,通常还需要后端的数据库服务容器,甚至负载均衡容器等。

Compose恰好满足了这样的需求。它可以通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器项目(project)。

Compose中有两个重要的概念:

  • 服务(service):一个应用的容器,实际上可以包含若干个运行相同镜像的容器实例
  • 项目(project):由一组关联的应用容器组成一个完整的业务单元

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理。 Compose项目由Python编写,实际上调用了Docker服务提供的API来对容器进行管理

Compose的安装与卸载

Compose可以通过Python的包管理工具pip进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在Docker容器中运行。 Docker for Mac,Docker for Windows自带docker-compose二进制文件,安装Docker之后可以直接使用,Linux系统需要单独的二进制文件或pip进行安装。

查看compose的安装版本:

docker-compose --versino

Linux下的二进制安装:

curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

pip安装:

sudo pip install -U docker-compose

Compose使用示例

应用场景:一般Web网站都会依赖第三方的提供的服务,如DB,cache,以compose编排运行dubbo-admin为例

  1. 获取源码 从github上获取dubbo-admin的master分支源码

    git clone -b master https://github.com/apache/incubator-dubbo-ops.git

修改admin中的application配置,把zookeeper地址改为zookeeper://zookeeper:2181 在项目根目录下使用maven进行打包

mvn clean package -Dmaven.test.skip=true
  1. 构建镜像 在dubbo-admin目录下编写Dockerfile文件,写入以下内容:

    FROM openjdk:8-jdk-alpine VOLUME /tmp ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]

使用以下命令构建镜像

docker build -t dubbo-admin:1.0 .

Docker Compose集成式应用组合及service编排

  1. 编写docker-compose.yml文件 在项目根目录下编写docker-compose.yml文件写入以下内容

    version: '3.4' services: zk_server: image: zookeeper:3.4 ports: - 2181:2181 dubbo-admin: image: dubbo-admin:1.0 links: - zk_server:zookeeper depends_on: - zk_server ports: - 7001:7001

  2. 运行compose项目 在docker-compose.yml文件所在目录执行:

    docker-compose up

在浏览器中访问http://ip:7001 登录验证,默认用户名密码:root/root,guest/guest

Docker Compose集成式应用组合及service编排

Compose命令说明

执行docker-compose [COMMAND] --help 或者docker-compose help [COMMAND]可以产看命令的使用帮助。 docker-compose命令的基本使用格式是:

docker-compose [-f=<arg>...][options][COMMAND][ARG...]

选项说明: -f, --file 指定模板文件,默认为docker-compose.yml,可以多次指定 -p, --project-name 指定项目命称,默认使用所在目录名称作为项目名 --x-networking 使用Docker的可插拔网络后端特性 --x-networking-driver 指定网络后端的驱动,默认为bridge --verbose 输出更多调试信息 -v, --version 打印版本并退出

命令

说明

build

格式为docker-compose build [option] [SERVIVE]
构建项目中的服务容器
可随时在项目目录下运行docker-compose build来重新构建服务
选项包括:
--force-rm 删除构建过程中的临时容器
--no-cache 构建镜像过程中不使用cache
--pull 始终尝试通过pull来获取更新版本的镜像

version

打印版本信息,格式位:docker-compose version

config

验证compose yml文件的格式是否正确,若正确则显示配置,若格式错误显示错误原因

exec

进入指定的容器

images

累出compose yml文件中包含的镜像

logs

查看服务容器的输出,默认情况下,会将不同服务的输出使用不同的颜色来区分,可以通过--no-color来关闭颜色

down

停止up命令所启动的容器,并移除网络

help

获得一个命令的帮助

kill

通过发送SIGKILL信号来强制停止服务器容器

pause

暂停一个服务容器

port

打印某个容器端口所映射的公共端口

ps

列出项目中目前所有的容器

push

推送服务依赖的镜像到Docker仓库

pull

拉取服务依赖的镜像

restart

容器项目中的服务

rm

删除所有停止状态的服务容器,推荐先执行docker-compose stop命令来停止容器

run

在指定服务上执行一个命令, 如:docker-compose run ubuntu ping docker.com

scale

设置指定服务运行的容器数bi,如:docker-compose scale web=3 db=2将启动3容器运行web服务,2个容器运行db服务

start

启动已存在的服务容器

stop

停止已存在的服务容器

top

查看各个服务容器内运行的进程

unpause

恢复处于暂停中的服务

up

该命令会尝试自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作,链接的未被启动的服务都将被自动启动。
选项说明:
-d 在后台运行服务容器
--no-color 不使用颜色来区分不同的服务的控制台输出
--no-deps 不启动服务所连接的容器
--force-recreate 强制重新创建容器,不能与--no-recrate同时使用
--no-recreate 如果容器已经存在了,则不重新创建,不能与--force-recreate同时使用
--no-build 不自动构建缺失的服务镜像
-t,--timeout 停止容器时的超时时间,默认为10秒

Compose模板文件

模板文件是Compose的核心,其涉及的指令关键字也比较多,大部分指令跟docker run相关的参数含义类似。默认的模板文件名称为docker-compose.yml,格式为YAML格式。 每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)等来自动构建镜像。如果使用build指令,在Dockerfile中设置的选项(如:CMD,ENV 等)将会自动被获取,无需在docker-compose.yml文件中再次设置。

常用指令介绍

build 指定Dockerfile所在文件夹的路径(可以是绝对路径,也可以是相对于docker-compose.yml文件的路径),Compose将会利用它自动构建镜像,然后使用这个镜像。 使用context指令指定Dockerfile文件所在文件夹的路径 使用dockerfile指令指定Dockerfile的文件名 使用args令指定构建镜像时的变量

version: '3'
services:
  webapp:
    build:
      context:./dir
      dockerfile:Dockerfile
      args:
        buildno:1

command 覆盖容器启动后默认执行的命令

command:echo "hello word"

container_name 指定容器名称,默认会使用 项目名称_服务名称_序号 这样的格式

devices 指定设备映射关系

devices:
  - "/dev/ttyUSB1:/dev/ttyUSB0"

depends_on 解决容器的依赖,启动先后的问题

dns 自定义DNS服务器,可以是一个值,也可以是一个列表

environment 设置环境变量,可以使用数组或字典两种格式,指给定名称的变量会自动获取Compose主机上对应变量的值,可以用来防止泄露不必要的数据。

expose 暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口为参数。

extra_hosts 类似Docker中的--add-host参数,指定额外的host名称映射信息

extra_hosts:
  - "googledns:8.8.8.8"

会在启动启动后的服务容器中 /etc/hosts 文件中添加“8.8.8.8 googledns"

healthcheck 通过命令检查容器是否健康运行

image 指定镜像名称或镜像ID,如果镜像在本地不存在会尝试拉取这个镜像。

labels 为容器添加Docker元数据信息,如可以添加辅助说明信息

network_mode 设置网络模式,使用和docker run 的--network参数一样的值

networks 配置容器连接的网络

ports 暴露端口信息,使用 宿主端口:容器端口 的格式,只指定容器端口的时候,宿主端口会随机映射。

volumes 数据卷挂载的路径设置,可以设置宿主机路径,同时支持相对路径

ulimits 指定容器的ulimits限制值,如指定最大进程数为66635,指定文件句柄数位20000(软限制,应用可以随时修改,不能超过硬限制)和40000(系统硬限制,只能root用户提高)

ulimits:
  nproc:65535
  nofile:
    soft:20000
    hard:40000

entrypoint 指定服务容器启动后执行的文件入口

user 指定容器中运行应用的用户名

working_dir 指定容器中的工作目录

读取变量

Compose模板文件支持动态读取主机的系统环境变量和当前目录下的 .env 文件中的变量。 如,Compose文件将从运行它的环境中读取${MONGO_VERSION}的值,并写入执行命令

version:'3'
services:
  db:
    image:"mongo:${MONGO_VERSION}"

如果执行MONGO_VERSION=3.4,docker-compose up则会启动一个mongo:3.4镜像的容器 若当前目录下存在 .env 文件,则优先从该文件中读取变量的值

Docker Compose集成式应用组合及service编排

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这