设为首页 收藏本站
查看: 1093|回复: 0

[经验分享] docker_基础_5

[复制链接]

尚未签到

发表于 2019-2-22 06:41:50 | 显示全部楼层 |阅读模式
接上篇
  接上篇 21章

22、docker compose
    Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似,其代码目前在 https://github.com/docker/compose 上开源。
  Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multicontainerDocker applications)」,其前身是开源项目 Fig。
  我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
  Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:


  • 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义。
      Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

22.1、安装

22.1.1. 二进制包安装

curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
下载不下来就 直接下载源包 https://github.com/docker/compose/releases
Host# mv docker-compose-Linux-x86_64 docker-compose
Host# chmod +x !$
Host# mv docker-compose /usr/bin/
Host# docker-compose version
docker-compose version 1.21.0, build 5920eb0
docker-py version: 3.2.1
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.1t  3 May 2016Host# mv docker-compose-Linux-x86_64 docker-compose
Host# chmod +x !$
Host# mv docker-compose /usr/bin/
Host# docker-compose version
docker-compose version 1.21.0, build 5920eb0
docker-py version: 3.2.1
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
22.1.2、pip安装
    x86_64 架构的 Linux 建议按照上边的方法下载二进制包进行安装,如果您计算机的架构是 ARM (例如,树莓派),再使用 pip 安装

pip install -U docker-compose
22.1.3、卸载
    直接删除/usr/bin/docker-compose文件就行

22.2、帮助

[root@dockers ~]# docker-compose -h
Define and run multi-container applications with Docker.
-f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml ,可以
多次指定。
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
--x-networking 使用 Docker 的可拔插网络后端特性
--x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
--verbose 输出更多调试信息。
-v, --version 打印版本并退出

22.3、docker-compose 运行命令

Commands:
build              构建项目中的服务容器
config             Validate and view the Compose file
create             Create services
down               Stop and remove containers, networks, images, and volumes
events             Receive real time events from containers
exec               Execute a command in a running container
help               Get help on a command
images             List images
kill               通过SIGKILL信号来强制停止服务容器
如 docker-compose kill  -s SIGINT
logs               View output from containers
pause              Pause services
port               打印绑定的端口
ps                 List containers
如 docker-compose ps 列出所有    -q 只打印容器ID
pull               拉取服务依赖的镜像
如 docker-compose pull      
--ignore-pull-failures 忽略拉取镜像过程中的错误
push               Push service images
restart            Restart services
rm                 删除所有已经停止的容器
run                在指定服务器上执行一个命令
如 运行一个容器  docker-compose run centos ping 1.1.1.1
scale              设置容器启动的个数
start              Start services
stop               Stop services
top                查看各个服务容器内运行的进程。
unpause            恢复处于暂停状态中的服务
up                 创建并启动容器
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
默认情况, docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
当通过 Ctrl-C 停止命令时,所有容器将会停止。
如果使用 docker-compose up -d ,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项
-d 在后台运行服务容器
--no-color 不使用颜色来区分不同的服务的控制台输出。
--no-deps 不启动服务所链接的容器。
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用。
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --forcerecreate 同时使用。
--no-build 不自动构建缺失的服务镜像。
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)
version            Show the Docker-Compose version information
22.4、compose模板文件
  默认的模板文件名称为 docker-compose.yml ,格式为 YAML 格式。
前面一定用tab键补,子级一定是空格

version: "3"    版本信息
services:        所有的服务应当放在这下面
webapp:      服务的名称
image: examples/web    镜像名称
ports:         端口
- "80:80"
volumes:    容器卷
- "/data"
build   指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径
command     覆盖容器启动后默认执行的命令
command: echo "hello world"
container_name     指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式
container_name:  docker-web-container
    
  查看结果,运行的是在docker-compose中定义的command命令
  
  nginx 测试



dockerfile 指定额外的编译镜像Dockerfile文件,该指令不能与image同时使用,否则compose将不知道根据哪个指令来生成最终的服务镜像。
depends_on  解决容器的依赖、启动先后的问题  **( 重要 )**
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
最后不要忘了写一个dockerfile文件: ERROR: Cannot locate specified Dockerfile: Dockerfile
dns  自定义 DNS 服务器。可以是一个值,也可以是一个列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
dns_search 配置 DNS 搜索域。  同DNS的写法
env_file  从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
-
**environment** 设置环境变量。你可以使用数组或字典两种格式。
   只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
$ cat ./Docker/api/api.env
NODE_ENV=test
$ cat docker-compose.yml
version: '3'
services:
api:
image: 'node:6-alpine'
env_file:
- ./Docker/api/api.env
environment:
- NODE_ENV=production
When you run the container, the environment variable defined in the Compose file takes precedence.
$ docker-compose exec api node
> process.env.NODE_ENV
'production'
先设置一个环境变量 node_env=test 然后按照容器优先级 下面的覆盖上面的环境变量,最后environment  NODE_ENV = production

  environment 用法

expose 暴露端口,但不映射到宿主机,只被连接的服务访问。
expose:
\- "3000"
\- "8000"
ports  暴露端口信息。开放端口,映射到宿主机
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
external_links    **注意:不建议使用该指令。**
链接到 docker-compose.yml 外部的容器,甚至并非 Compose 管理的外部容器。
external_links:
\- redis_1
\- project_db_1:mysql
\- project_db_1:postgresql
extra_hosts   类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"
会在启动后的服务容器中 /etc/hosts 文件中添加如下两条条目。
8.8.8.8 googledns
52.1.157.61 dockerhub
healthcheck  通过命令检查容器是否健康运行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
extends 在V3版本中被移除了,如图
  官网详细说明


image 指定为镜像名称或镜像 ID。如果镜像在本地不存在, Compose 将会尝试拉取这个镜像。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
labels 为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
links  注意:不推荐使用该指令
links:
- mysql:db
logging 配置日志选项。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
目前支持三种日志驱动类型。
driver: "json-file"
driver: "syslog"
driver: "none"
options 配置日志驱动的相关参数。
options:
max-size: "200k"
max-file: "10"
  开启日志tcp服务 端口为514
$ModLoad imtcp
$InputTCPServerRun 514
.                                                     /var/log/message.log
  重启服务
systemctl restart rsyslog

  ssh登陆随便乱输密码之类的 日志就会打印出来


network_mode   设置网络模式。使用和 docker run 的 --network 参数一样的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks 配置容器连接的网络。
pid 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作
ports  暴露端口信息。
secrets 存储敏感数据,例如 redis 服务密码,  之后使用telnet 还是可以照样连接,还需要在测试一下
version: "3.1"
services:
redis:
image: redis:latest
secrets:
- my_secret
- my_other_secret
ports:
- "1234:6379"
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
security_opt 指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如配置标签的用户名和角色名。
security_opt:
- label:user:USER
- label:role:ROLE
sysctls 配置容器内核参数。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
ulimits  指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制)和 40000(系统硬限制,只能 root 用户提高)。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes 数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER ) 或加上访问模式( HOST:CONTAINER:ro )
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
working_dir: /code   指定工作路径
user: nginx  指定容器中运行应用的用户名。
指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped 。
restart: always  

  更多的可以直接查看官网需要什么功能,查找使用就行。

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

version: "3"
services:
db:
image: "mysql:${MYSQL_VERSION}"
ports:
- "3306:3306"
运行
MYSQL_VERSION=5.6.32 docker-compose up -d
Creating network "mysqls_default" with the default driver
Creating mysqls_db_1 ... done
它就会创建一个基于5.6.32镜像的容器了
也可以写在.env的文件中比如:
cat .env
# MYSQL version
MYSQL_VERSION=5.6.32
跟直接 MYSQL_VERSION="" 是一样的效果
docker-compose up -d
Starting mysqls_db_1 ... done  



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675436-1-1.html 上篇帖子: docker简洁用法 下篇帖子: docker通过运行容器制作共享tar镜像包
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表