二、Docker Compose 项目

compose项目简介

compose项目来源于之前的Fig项目,使用python代码编写。compose项目主要用于编排部署基于docker的应用。本身与dockerswarm配合度很高。

Docker Compose Docker 编排服务的一部分,可以让用户在其它平台快速安装DockerSwarm 可以让 Docker 容器在集群中高效运转,而 Compose 可以让用户在集群中部署分布式应用。简单的说,Docker Compose 属于一个“应用层”的服务,用户可以定义哪个容器组运行哪个应用,它支持动态改变应用,并在需要时扩展。 
相对于kubernetes来说功能比较简单,相当于kubernetes的一个子集。

 

dockerfile可以让用户管理一个单独的应用容器,Compose则允许用户在一个模板(yaml格式)中定义一组相关联的应用容器(被称为一个Project,即项目),例如一个调度器,两个web服务容器再加上后端的数据库服务容器等。

wKiom1mpXD-TpYEmAACkQBf4p9k834.png-wh_50


安装Compose之前,要先安docker,里就不说了,

安装Docker-compose

先安装pip

注:pip类似RedHat里面的yum,安装Python包非常方便

[root@localhost apache]# cat dockerfile 
FROM docker.wang.com/centos:centos7
MAINTAINER from cyh@example.com
RUN yum -y install python-setuptools
RUN yum -y install openssh-server  httpd  sudo
RUN yum  -y  install  sudo  net-tools
RUN   yum -y  install  sudo bind-utils
RUN useradd admin
RUN echo "admin:admin" | chpasswd
RUN echo "admin ALL=(ALL) ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN mkdir -p /var/run/sshd
RUN mkdir -p /home/admin/.ssh
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
RUN sed -ri 's/#ServerName www.example.com:80/ServerName www.benet.com/g' /etc/httpd/conf/httpd.conf
COPY supervisord.conf /etc/supervisor/supervisord.conf
EXPOSE 22 80 
CMD ["/bin/bash","/run.sh"]
[root@localhost apache]# cat supervisord.conf 
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D[program:httpd]
command=/usr/sbin/httpd -DFOREGROUND
[root@localhost apache]# ls
centos7.tar  dockerfile  supervisord.conf

root@localhost apache]# docker build -t centos:supervisord .

wKiom1mpXO_xmWtaAAAYSX2-rZw207.png-wh_50

#wget  https://bootstrap.pypa.io/get-pip.py  开始安装

#python get-pip.py

wKioL1mpXOiwL1TiAAAefzMA9ZQ772.png-wh_50

再安装compose

wKiom1mpXQygfyX7AAAkr09kgAg113.png-wh_50

[root@localhost apache]# ln -s /usr/bin/docker-compose /usr/local/bin/

安装成功后,可以查看  docker-compose 的版本和 命令的用法。

#docker-compose  -v

[root@localhost apache]# docker-compose -v
docker-compose version 1.16.0, build ea60ca1

#docker-compose  -h   查看帮助

首先介绍几个术语。

服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。

项目(project):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。

 

docker-compose 命令说明

大多数Compose命令都是运行于一个或多个服务的,如果服务没有指定,该命令将会应用到所有服务,如果要获得所有可用信息,使用命令:docker-compose [COMMAND] --help,下面是命令(COMMAND)的说明:

build 
创建或者再建服务 
服务被创建后会标记为project_service(比如composetest_db),如果改变了一个服务的Dockerfile或者构建目录的内容,可以使用docker-compose build来重建它

 

help 
显示命令的帮助和使用信息

 

kill 
通过发送SIGKILL的信号强制停止运行的容器,这个信号可以选择性的通过,比如: 
docker-compose kill -s SIGKINT

 

logs 
显示服务的日志输出

 

port 
为端口绑定输出公共信息

 

ps 
显示容器

 

pull 
拉取服务镜像

 

rm 
删除停止的容器

 

run 
在服务上运行一个一次性命令,比如: 
docker-compose run web Python manage.py shell

 

scale 
设置为一个服务启动的容器数量,数量是以这样的参数形式指定的:service=num,比如: 
docker-compose scale web=2 worker=3

 

start 
启动已经存在的容器作为一个服务

 

stop 
停止运行的容器而不删除它们,它们可以使用命令docker-compose start重新启动起来

 

up 
为一个服务构建、创建、启动、附加到容器 
连接的服务会被启动,除非它们已经在运行了 

运行docker-compose up -d会在后台启动容器并使它们运行 

 

–verbose 
显示更多输出

 

–version 
显示版本号并退出

 

-f,–file FILE 
指定一个可选的Compose yaml文件(默认:docker-compose.yml

 

-p,–project-name NAME 
指定可选的项目名称(默认:当前目录名称)

 

docker-compose.yml命令说明  

每一个定义在docker-compose.yml中的服务必须明确指定一个p_w_picpath或者build选项,这与docker run命令行中输入的是对应相同的,对于docker run,在Dockerfile文件中指定的选项(比如CMDEXPOSEVOLUMEENV)是默认的,因此不必在docker-compose.yml中再指定一次  

 

p_w_picpath   

标明p_w_picpathID,这个p_w_picpath ID可以是本地也可以是远程的,如果本地不存在,Compose会尝试去pull下来

p_w_picpath: ubuntu    

p_w_picpath: orchardup/postgresql    

p_w_picpath: a4bc65fd    

 

build   

该参数指定Dockerfile文件的路径,该目录也是发送到守护进程的构建环境(这句有点),Compose将会以一个已存在的名称进行构建并标记,并随后使用这个p_w_picpath  

build: /path/to/build/dir    

 

command   

重写默认的命令,覆盖容器启动后默认执行的命令

command: 要执行的命令    

 

links   

连接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称  

links:    

 - db    

 - db:database    

 - redis    

此时,在容器内部,会在/etc/hosts文件中用别名创建一个条目,就像这样:  

172.17.2.186  db    

172.17.2.186  database    

172.17.2.186  redis    

 

环境变量也会被创建,关于环境变量的参数,会在后面讲到  

 

external_links   

连接到在这个docker-compose.yml文件或者Compose外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links遵循着和links相同的语义用法  

external_links:    

 - redis_1    

 - project_db_1:mysql    

 - project_db_1:postgresql    

 

ports   

暴露端口,指定两者的端口(主机:容器),或者只是容器的端口(主机会被随机分配一个端口)  

注:当以 主机:容器 的形式来映射端口时,如果使容器的端口小于60,那可能会出现错误,因为YAML会将 xx:yy这样格式的数据解析为六十进制的数据,基于这个原因,时刻记得要将端口映射明确指定为字符串  

ports:    

 - "3000"    

 - "8000:8000"    

 - "49100:22"    

 - "127.0.0.1:8001:8001"    

 

expose   

暴露端口而不必向主机发布它们,而只是会向链接的服务(linked service)提供,只有内部端口可以被指定  

 

expose:    

 - "3000"    

 - "8000"    

 

volumes   

挂载路径最为卷,可以选择性的指定一个主机上的路径(主机:容器),或是一种可使用的模式(主机:容器:ro)  

volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro

 

volumes_from:    

从另一个服务或容器挂载它的所有卷。

volumes_from:  

- service_name    

 - container_name    

 

environment   

加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行Compose的机器上找到对应的值,这有助于加密的或者特殊主机的值  

environment:    

  RACK_ENV: development    

  SESSION_SECRET:    

environments:    

  - RACK_ENV=development    

  - SESSION_SECRET    

  

env_file   

从一个文件中加入环境变量

如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。如果有变量名称与 environment 指令冲突,则以后者为准。

env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
# common.env: Set Rails/Rack environment
RACK_ENV=development  

 

net   

网络模式,可以在docker客户端的--net参数中指定这些值  

net: "bridge"    

net: "none"    

net: "container:[name or id]"    

net: "host"    

 

dns   

自定义DNS服务,可以是一个单独的值或者一张列表  

dns: 8.8.8.8    

dns:    

  - 8.8.8.8    

  - 9.9.9.9    

  

dns_search   


自定义DNS搜索范围,可以是单独的值或者一张列表  

  

dns_search: example.com    

dns_search:    

  - dc1.example.com    

  - dc2.example.com    

 

使用Compose只需要简单的三个步骤:

首先,使用Dockerfiledocker  commit来定义你的应用环境

第二步,用一个docker-compose.yml来定义你的应用,他们可以在下个互隔离的容器中组成你的应用。

第三步,执行docker-compose up  -d来启动你的应用,它会根据docker-compose.yml的设置来pull/run相关的容器。

我们创建一个经典的 Web 项目:一个 Haproxy,挂载三个 Web 容器。

docker-haproxy目录,作为项目工作目录,并在其中分别创建两个子目录: haproxy  web

[root@localhost apache]# mkdir -p /root/docker-haproxy/{haproxy,web}

/root/docker-haproxy/目录下创建docker-compose.yml文件

/root/docker-haproxy/haproxy目录下创建haproxy的主配置文件haproxy.cfg

/root/docker-haproxy/web目录下存放web站点网页文件

目录结构如下图所示:

wKioL1mpXVXik-e4AAAMCy2M3G8274.png-wh_50

Web 子目录:

生成一个index.html文件,其内容:

[root@localhost docker-haproxy]# cat web/index.html 
鑫旺 威武
aproxy 目录:
在其中生成一个  haproxy.cfg  文件
[root@localhost haproxy]# cat haproxy.cfg 
globallog 127.0.0.1 local0log 127.0.0.1 local1 noticedefaultslog globalmode httpoption httplogoption dontlognulltimeout connect 5000mstimeout client 50000mstimeout server 50000mslisten statsbind 0.0.0.0:70stats enablestats uri /frontend balancerbind 0.0.0.0:80mode httpdefault_backend web_backendsbackend web_backendsmode httpoption forwardforbalance roundrobinserver weba weba:80 checkserver webb webb:80 checkserver webc webc:80 checkoption httpchk GET /
docker-compose.yml

编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 web 容器,以及 1 haproxy 容器。

[root@localhost docker-haproxy]# vim docker-compose.yml weba:p_w_picpath: centos:supervisordvolumes:- /root/docker-haproxy/web/:/var/www/html/expose:- 80
webb:p_w_picpath: centos:supervisordvolumes:- /root/docker-haproxy/web/:/var/www/html/expose:- 80
webc:p_w_picpath: centos:supervisordvolumes:- /root/docker-haproxy/web/:/var/www/html/expose:- 80
haproxy:p_w_picpath: centos:supervisordvolumes:- /root/docker-haproxy/haproxy/:/etc/haproxy/:rocommand: /usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfglinks:- weba- webb- webcports:- "80:80"- "70:70"

运行 compose 项目:

docker-haproxy目录下执行docker-compose up  -d来启动你的应用

#cd docker-haproxy

[root@localhost docker-haproxy]# docker-compose up -d

查看容器启动情况

[root@localhost docker-haproxy]# docker ps

打开浏览器本机本机IP 192.168.100.15

wKioL1mpXfCA6gwfAAG_uB95uo8197.png-wh_50