下载最新版的docker-compose文件
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
若是github访问太慢,可以用daocloud下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加权限
sudo chmod +x /usr/local/bin/docker-compose
可以发现,Compose安装是足够简单的,基本上依靠一个可执行脚本就完成了所有工作。这比传统编排部署工具比如Puppet、Chef都要简单,而类似Cloud Foundry BOSH这样耗时的工具就该被称为超重量级云编排引擎了。当然,Compose简单的背后,是以牺牲一些功能为代价的。
mkdir composetest
cd composetest
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0,5)
@app.route('/')
def hello():
count = get_hit_count()
return 'hello world! Ihava been seen {} times.\n'.format(count)
[root@iZbp102fxl8duhse0avs3mZ composetest]# ll
total 16
-rw-r--r-- 1 root root 124 Aug 12 11:36 docker-compose.yml
-rw-r--r-- 1 root root 248 Aug 12 11:39 Dockerfile
-rw-r--r-- 1 root root 12 Aug 12 11:25 requirements.txt
-rw-r--r-- 1 root root 516 Aug 12 11:59 testapp.py
testapp.py 一个支持也页面请求的python脚本,在第二步中已经给出详细的code,
下面简单介绍下:
docker-compose.yml : docker-compose 的配置文件
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/root/testcode
links:
- redis
redis:
image: "redis"
这里简单解释下:
web是web应用docker,然后将端口绑定到宿主机上,redis是后面redis的docker应用,在web脚本中用到的redis缓存,所以此处创建一个docker对应的服务;images是redis镜像,生成docker用
requirements.txt
这是编排部署核心所在,在这个YAML文件里,可以看到两个最高级别的key:web和redis,这意味着用Compose定义了由两个“服务”组成的Docker集群。其中,第一个服务叫web,它从当前目录的Dockerfile build得到;之后在容器中运行python testapp.py;把容器内的5000端口映射到宿主机的5000端口;挂载执行这些操作所在的目录到容器中/code目录下。之后,代码的修改就可以在容器中体现。第二个服务redis直接使用已有的redis镜像,Dockerfile不必另外编写。不难发现,Compose在这里扮演了指挥家的角色,它类似于Docker client的加强版,把docker run的参数列表固化在了YAML文件中,其语法格式和定义规则都与Docker命令行兼容。而且,可以按照这样的逻辑来定义更加复杂的“服务组”,例如分别为每个服务定义Dockerfile,然后把这些容器link到一起。而Docker在这里则扮演了乐队里的演奏者的角色,它们根据Compose的编排指令,执行具体的Docker容器部署工作。
Dockerfile的详细
FROM python:3.7-alpine
WORKDIR /root/code
ENV FLASK_APP testapp.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask","run"]
WORKDIR 如果没有/root/code目录要自己创建一个程序可以访问的目录,一般来讲当前用户就可以,如果需要特殊权限,重新授权一下就可以了,这个是通过dockerfile来创建docker镜像,笔者已经执行了,所以可以通过命令看到自己生成的镜像
[root@iZbp102fxl8duhse0avs3mZ composetest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest 0369a9cf8695 46 hours ago 185MB
haproxy latest 575a5788d81a 7 months ago 101MB
redis latest 7614ae9453d1 7 months ago 113MB
redis alpine 3900abf41552 8 months ago 32.4MB
ubuntu latest ba6acccedd29 10 months ago 72.8MB
django latest eb40dcf64078 5 years ago 436MB
composetest_web 就是通过docker文件创建的web镜像,这里也简单说下flask,flask是python的轻量级框架,可以自动试下简单的web调用,django则相对而言比较重,它是比较全的python脚手架。如果感兴趣的小伙伴可以去详细了解,
requirements.txt 是python脚本执行所需要依赖包:flask和redis
[root@iZbp102fxl8duhse0avs3mZ composetest]# cat requirements.txt
flask
redis
到此已经简单的docker-compose实战所需的文件基本上都完成了,下面我们执行下docker-compose up看下是否有报错,
笔者执行执行的时候是多次报错,有很多语法错误,和格式错误,多踩几次坑就好了, 如果想在后台执行,只需要在 docke-compose up -d
[root@iZbp102fxl8duhse0avs3mZ composetest]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b852f2b68b3 composetest_web "flask run" 9 hours ago Up 9 hours 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp composetest-web-1
73ae66443764 redis "docker-entrypoint.s…" 9 hours ago Up 9 hours 6379/tcp composetest-redis-1
9b651b43076f haproxy "docker-entrypoint.s…" 4 weeks ago Up 4 weeks 0.0.0.0:6301->6301/tcp, :::6301->6301/tcp Haproxy
0e206ce34569 django "/bin/bash" 5 weeks ago Up 4 weeks App2
ce9aa6740771 django "/bin/bash" 5 weeks ago Up 4 weeks App1
ee95a0ae7e5f redis "docker-entrypoint.s…" 5 weeks ago Up 5 weeks 6379/tcp redis-slave2
0df99da2ff2e redis "docker-entrypoint.s…" 5 weeks ago Up 5 weeks 6379/tcp redis-slave1
790681bc9bcf redis "docker-entrypoint.s…" 5 weeks ago Up 4 weeks 6379/tcp redis-master
如上可以看到compose-web对外映射的端口是5000,访问下可以可拿到如下结果,说明我们通过docker-compose查创建docker镜像已经成功了
