Docker 系列五(Docker Compose 项目).
一、概念
Docker Compose 是官方编排项目之一,负责快速的部署分布式应用。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML格式)来定义一种相关联的应用容器为一个项目。
Docker Compose 中有两个重要的概念:
服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Docker Compose 的安装可以参考上一篇文章的内容。
二、Compose 命令说明
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
以下常用命令在 docker-compose.yml 同级目录下执行,否则需要 docker-compose -f [docker-compose.yml 路径] [命令]:
docker-compose [命令] -help:查看某个命令的帮助(神器,授人以鱼不如授人以渔)。
docker-compose config:验证 Compose 文件(docker-compose.yml)格式是否正确,若正确则显示配置。若格式错误则显示原因。
docker-compose up:尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
-d 在后台运行服务容器。
--no-color 不使用颜色来区分不同的服务的控制台输出。
--no-deps 不启动服务所链接的容器。
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
--no-build 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
docker-compose down:此命令会停止 up 命令所启动的容器,并移除网络。
docker-compose images :列出 Compose 文件中包含的镜像。
docker-compose ps:列出项目中目前的所有容器。
docker-compose ps --service:列出项目中目前的所有服务(重要,很多命令都是基于服务来操作的)。
docker-compose logs [options] [SERVICE...]:查看服务容器的日志输出。
docker-compose exec [SERVICE] bash : 进入指定的容器。
docker-compose stop [options] [SERVICE...] :停止已经处于运行中的容器,但不删除它。
docker-compose kill -s SIGINT [SERVICE...] :通过发送 SIGINT 信号来强制停止服务容器(类似于stop)
docker-compose start [SERVICE...] :启动已经存在的服务容器。
docker-compose restart [options] [SERVICE...]:重启项目中的服务
docker-compose rm [options] [SERVICE...]:删除所有(停止状态的)服务容器,-f 强制删除,包括非停止状态 -v 删除容器所挂载的数据卷。
docker-compose pause [SERVICE...]:暂停一个服务容器。
docker-compose unpause [SERVICE...]:恢复处于暂停状态中的服务。
docker-compose scale [options] [SERVICE=NUM...]:设置指定服务运行的容器个数。(神器,照这样岂不是很简单就实现了分布式?)
docker-compose top:查看各个容器内运行的进程
三、Compose 模板文件
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。下面笔主筛选出一些常见的命令,不推荐使用和不常用的就不介绍了~~
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式:
version: ''
#服务列表
services:
#服务1,服务名叫web
web:
build: .
ports:
- "5000:5000"
command: echo "hello world"
depends_on:
- redis
ulimits:
#最大进程数
nproc: 64435
nofile:
#文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)
soft: 20000
#文件句柄数为 40000(系统硬限制,只能 root 用户提高)
hard: 40000
#服务2,服务名叫redis
redis:
image: "redis:alpine"
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
1、build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。
version: ''
services: webapp:
build: ./dir
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径;使用 dockerfile 指令指定 Dockerfile 文件名;使用 arg 指令指定构建镜像时的变量。
version: ''
services: webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
2、image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
version: ''
services: redis:
image: "redis:alpine"
3、cap_add, cap_drop
指定容器的内核能力(capacity)分配。
#让容器拥有所有能力可以指定为:
cap_add:
- ALL
#去掉 NET_ADMIN 能力可以指定为:
cap_drop:
- NET_ADMIN
4、command
覆盖容器启动后默认执行的命令。
command: echo "hello world"
5、depends_on
解决容器的依赖、启动先后的问题。
version: ''
services: web:
build: .
depends_on:
- redis redis:
image: "redis:alpine"
6、expose
暴露端口,但不映射到宿主机,只被连接的服务访问,仅可以指定内部端口为参数。
expose:
- "3000"
- "8000"
7、ports
暴露端口信息;使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以;建议数字串都采用引号包括起来的字符串格式。
ports:
- ""
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
8、ulimits
指定容器的 ulimits 限制值。
ulimits:
#最大进程数
nproc: 64435
nofile:
#文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)
soft: 20000
#文件句柄数为 40000(系统硬限制,只能 root 用户提高)
hard: 40000
9、env_file
从文件中获取环境变量,可以为单独的文件路径或列表;则 env_file 中变量的路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file: .env env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
环境变量文件中每一行必须符合格式,支持 # 开头的注释行
# common.env: Set development environment
PROG_ENV=development
10、environment
设置环境变量。可以使用数组或字典两种格式;只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
environment:
RACK_ENV: development
SESSION_SECRET: environment:
- RACK_ENV=development
- SESSION_SECRET
11、extra_hosts
指定额外的 host 名称映射信息。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
12、labels
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
13、sysctls
配置容器内核参数。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0 sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
14、volumes
数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro);该指令中路径支持相对路径。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
15、network_mode
配置网络模式。Docker 的默认网络配置是 "bridge",当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。
network_mode: "bridge"
network_mode: "host" --备注:没有自己的网络模式,跟宿主机共用一套ip地址,相当于在宿主机上安装了应用一样
network_mode: "none" --备注:没有网络,将网络创建的任务完全交给用户,可以通过 links 实现两个容器的单机互连
network_mode: "service:[service name]" --备注:跟某个服务复用网络
network_mode: "container:[container name/id]" --备注:跟某个容器复用网络
#自定义IP地址
networks:
cluster_net:
ipv4_address: 172.16.238.101
16、restart
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
四、寄语
学习 Docker Compose 过程中,突然想起以前老师的教导:学习一样技能,心一定要放宽,没必要钻牛角尖,毕竟学习不是冲着要成为百科全书而去的,要不然要百科全书干嘛呢?学习应该是一件很开心快乐的事情,没必要吹毛求疵,比如说:一个用法有一堆命令可以达到目的,那我都要记下那一堆命令吗?比如说,一些罕见的用法,我也要过于追究吗?
参考资料:https://yeasy.gitbooks.io/docker_practice/content/compose/
Docker 系列五(Docker Compose 项目).的更多相关文章
- Docker系列03—Docker 基础入门
本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...
- Docker系列05—Docker 存储卷详解
本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...
- Docker系列之Docker镜像(读书笔记)
一.基本概念 Docker包括三个基本概念镜像.容器.仓库. Docker镜像:就是一个只读的模板.例如:一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或其他应用程序.用 ...
- Docker系列01—Docker 基础入门
一.初识Docker和容器 1.1 什么是docker 容纳其他物品的工具,可以部分或完全封闭,被用于容纳.存储.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. 容器? 容器就是在隔离的环 ...
- docker 系列之 docker安装
Docker支持以下的CentOS版本 CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. ...
- Docker系列二: docker常用命令总结
https://docs.docker.com/reference/ 官方命令总结地址 容器生命周期管理 1.docker run 创建一个新的容器并运行一个命令 docker run [optio ...
- Docker系列一: docker简介及基本环境安装
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
- Docker系列03—Docker 存储卷
一.存储卷介绍 1.1 背景 Docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层: 如果运行的容器修改了 ...
- Docker系列五: docker-compose部署Docker容器
Docker使用Dockerfile来实现对现有镜像的修改来创建新的镜像, 那docker-compose则完成镜像的自动部署, 可以实现多个容器同时部署 Dockerfile可以让用户管理一个单独的 ...
随机推荐
- RabbitMQ in Action(5): Clustering and dealing with failure
Batteries included: RabbitMQ clustering The clustering built in to RabbitMQ was designed with two go ...
- 【渗透攻防】深入了解Windows
前言 本篇是基础教程,带大家了解Windows常用用户及用户组,本地提取用户密码,远程利用Hash登录到本地破解Hash.初步掌握Windows基础安全知识. 目录 第一节 初识Windows 第二节 ...
- 细说SpringDI Setter注入
依赖注入(DI)是一个过程,通过这个过程,对象可以通过构造函数参数,工厂方法的参数或者在构造或返回对象实例后设置的属性来定义它们的依赖关系从工厂方法.然后容器在创建bean时注入这些依赖关系.这个过程 ...
- Eclipse常用20个快捷键
Eclipse常用20个快捷键 1. Ctrl+F : 本文查找Find与替换Replace 2. Ctrl+H : 全局搜索,可按照文件类型搜索 3. Ctrl+1 : 快速修复,能快速的显示光标所 ...
- Android JNI 学习(九):Static Fields Api & Static Methods Api
一.Accessing Static Fields(访问静态域) 1. GetStaticFieldID jfieldIDGetStaticFieldID(JNIEnv *env, jclass cl ...
- genymotion常见问题解答
[转]常见问题解答 很多人喜欢使用Genymotion这款安卓模拟器,但是虽然Genymotion很好用,可是却有各种问题存在哦,下面潇潇就一些常见的Genymotion问题来说下解决方法吧. 为什么 ...
- VIM -小技巧汇总
一 代码自动对齐: 1 命令行模式下先输入gg 然后按=后输入大写的G,这样整个文件的代码就对齐了. 二 选中多行缩进 1.按v进入visual状态,选择多行,用>或<缩进或缩出 2. 通 ...
- VMware Workstation Pro网络配置(WiFi配置等)
常用技巧 连续按两下ctrl+alt,实现鼠标脱离 VMware Workstation Pro网络配置有几种模式: 桥接模式: 网络上的独立主机 占用路由器新IP资源 通过VMware Networ ...
- Kubernetes集群搭建之系统初始化配置篇
Kubernetes的几种部署方式 1. minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境 ...
- Spring框架(1)---Spring入门
Spring入门 为了能更好的理解先讲一些有的没的的东西: 什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构 ...