Docker Compose 项目

简介:

二、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包非常方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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" ]
1
2
3
4
5
6
7
8
[root@localhost apache] # cat supervisord.conf 
[supervisord]
nodaemon= true
[program:sshd]
command = /usr/sbin/sshd  -D
  
[program:httpd]
command = /usr/sbin/httpd  -DFOREGROUND
1
2
[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

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

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

#docker-compose  -v

1
2
[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中的服务必须明确指定一个image或者build选项,这与docker run命令行中输入的是对应相同的,对于docker run,在Dockerfile文件中指定的选项(比如CMDEXPOSEVOLUMEENV)是默认的,因此不必在docker-compose.yml中再指定一次  

 

image   

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

image: ubuntu    

image: orchardup/postgresql    

image: a4bc65fd    

 

build   

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

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

1
[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文件,其内容:

1
2
[root@localhost docker-haproxy] # cat web/index.html 
鑫旺 威武
1
2
aproxy 目录:
在其中生成一个  haproxy.cfg  文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost haproxy] # cat haproxy.cfg 
global
   log 127.0.0.1 local0
   log 127.0.0.1 local1 notice
  
defaults
   log global
   mode http
   option httplog
   option dontlognull
   timeout connect 5000ms
   timeout client 50000ms
   timeout server 50000ms
  
listen stats
     bind 0.0.0.0:70
     stats  enable
     stats uri /
  
frontend balancer
     bind 0.0.0.0:80
     mode http
     default_backend web_backends
  
backend web_backends
     mode http
     option forwardfor
     balance roundrobin
     server weba weba:80 check
     server webb webb:80 check
     server webc webc:80 check
     option httpchk GET /
docker-compose.yml

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost docker-haproxy] # vim docker-compose.yml 
  
weba:
   image: centos:supervisord
   volumes:
     /root/docker-haproxy/web/ : /var/www/html/
   expose:
     - 80
webb:
   image: centos:supervisord
   volumes:
     /root/docker-haproxy/web/ : /var/www/html/
   expose:
     - 80
webc:
   image: centos:supervisord
   volumes:
     /root/docker-haproxy/web/ : /var/www/html/
   expose:
     - 80
haproxy:
   image: centos:supervisord
   volumes:
     /root/docker-haproxy/haproxy/ : /etc/haproxy/ :ro
   command /usr/local/haproxy/sbin/haproxy  -f  /etc/haproxy/haproxy .cfg
   links:
     - weba
     - webb
     - webc
   ports:
     "80:80"
     "70:70"

运行 compose 项目:

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

#cd docker-haproxy

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

查看容器启动情况

1
[root@localhost docker-haproxy] # docker ps

打开浏览器本机本机IP 192.168.100.15

wKioL1mpXfCA6gwfAAG_uB95uo8197.png-wh_50


     本文转自柴鑫旺 51CTO博客,原文链接:http://blog.51cto.com/chaixinwang/1962048,如需转载请自行联系原作者






相关文章
|
22天前
|
存储 机器学习/深度学习 中间件
快速上手 Elasticsearch:Docker Compose 部署详解
本文介绍了如何使用Docker Compose快速搭建Elasticsearch学习环境。Elasticsearch是一款用于实时搜索和分析的分布式中间件,适用于多种场景,如搜索、日志分析、机器学习等。首先,创建docker网络,拉取最新版8.12.2镜像。接着,编写docker-compose.yml文件,配置单节点集群,设置端口映射、内存限制及数据卷挂载。然后,创建并配置数据卷目录,允许远程访问和跨域。最后,启动服务并验证,通过浏览器访问确认服务运行正常。本文为初学者提供了一个简便的Elasticsearch部署方法。
126 4
快速上手 Elasticsearch:Docker Compose 部署详解
|
27天前
|
关系型数据库 MySQL Java
Docker Compose详细教程(从入门到放弃)
Docker Compose详细教程(从入门到放弃)
116 0
|
1月前
|
Java Docker 微服务
如何使用Docker和Docker Compose部署微服务
【2月更文挑战第12天】
177 0
|
14天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
71 0
|
27天前
|
NoSQL Java Redis
利用Docker部署一个简单的springboot项目
利用Docker部署一个简单的springboot项目
67 2
|
27天前
|
JavaScript Java jenkins
如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)
如何利用CentOS7+docker+jenkins+gitee部署springboot+vue前后端项目(保姆教程)
75 0
|
1月前
|
数据可视化 应用服务中间件 nginx
如何查看docker 项目的配置文件
【2月更文挑战第21天】
|
1月前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
41 0
|
2月前
|
资源调度 JavaScript 前端开发
如何使用 Docker 来部署 Vue 项目?
【2月更文挑战第8天】
72 2
|
2月前
|
Docker 容器
Docker Compose的安装与配置
Docker Compose的安装与配置
120 2
Docker Compose的安装与配置