Docker 实战六 (Docker Compose)

Docker Compose

是一个可以定义和运行多个docker应用的工具,你可以使用yaml文件来配置你的应用服务。只需执行简单的一个命令就可以从配置中创建并启动所有服务。

Compose 适用于所有环境:生产、持续集成、开发、测试以及CI工作流

使用三步骤:

  • 需要安装docker ,以便使用Dockerfile 进行多次运行

  • 在docker-compose中定义组成应用程序的服务。这样它们就可以在一个隔离的环境中一起运行。

  • 运行docker-compose up启动你所有的应用

下面进入正题: 如何安装并部署一个简单的应用

Install Docker Compose(linux)

安装Docker Compose 必须先安装 docker,详情可以参考Get Started with Docker

# 下载
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授权
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version

看到版本信息说明安装成功

[root@localhost composetest]# docker-compose --version
docker-compose version 1.23.2, build 1110ad01

构建一个简单的应用

参照官网compose-demo
先创建项目路径composetest

$ mkdir composetest
$ cd composetest

1 构建python应用

创建一个名为app.py的文件在你的项目路径中

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! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

文件内容大致是:设置redis默认端口6379 主机为本机,启动后连接redis并执行hello(),将访问次数输出到页面。

2 构建Dockerfile文件

在项目路径下创建Dockerfile,内容如下

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

大致意思就是:

  • 使用基础镜像 Python 3.4
  • 将当前目录映射到镜像/code目录下
  • 设置工作目录为 /code
  • 安装 Python 依赖包
  • 启动 app.py 程序

其中有个坑,使用python-3.4构建是会报错

Fatal Python error: getentropy() failed
ERROR: Service 'web' failed to build: The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 139

修改python版本为python-3.5即可

3 构建docker-compose.yml 文件

在当前目录下创建docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Compose定义了两个服务一个web 一个redis

  • 构建web应用,从当前目录下的Dockerfile 构建,并开放5000端口
  • 使用官方redis 镜像库,默认端口6379

这样就可以实现python脚本中的访问6379,hits加一。

4 运行并构建docker compose

执行 docker-compose up

Building web
Step 1/5 : FROM python:3.4-alpine3.8
3.4-alpine3.8: Pulling from library/python
c87736221ed0: Pull complete
c3f51b0d0765: Pull complete
e919dffdee54: Pull complete
f0766e77b512: Pull complete
bcf776216162: Pull complete
Digest: sha256:e88f2ce19bcabb986adb3a87b5effc7eaf5900b8d6049ffb85ca3dd59df0c466
Status: Downloaded newer image for python:3.4-alpine3.8
 ---> f6d3872c2a66
Step 2/5 : ADD . /code
 ---> 7a4e55428219
 ...
 Creating composetest_redis_1 ... done
Creating composetest_web_1   ... done
Attaching to composetest_web_1, composetest_redis_1

访问http://192.168.124.16:5000/
页面

5 修改compose.yml 并添加挂载

针对web服务添加绑定

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"

6 重启docker-compose

[root@localhost composetest]# docker-compose restart
Recreating composetest_web_1 ... done
Starting composetest_redis_1 ... done
Attaching to composetest_redis_1, composetest_web_1
redis_1  | 1:C 21 Mar 2019 02:38:38.862 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 21 Mar 2019 02:38:38.862 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 21 Mar 2019 02:38:38.862 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf

7 修改应用配置

修改app.py 的返回信息

return 'Hello Chen! I have been seen {} times.\n'.format(count)

再次访问
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190321111724948.png

8 Docker Compose 常用命令

构建建启动nignx容器
docker-compose up -d nginx                     
登录到nginx容器中
docker-compose exec nginx bash            
删除所有nginx容器,镜像
docker-compose down                              
显示所有容器
docker-compose ps                                   
重新启动nginx容器
docker-compose restart nginx                   
在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose run --no-deps --rm php-fpm php -v  
构建镜像
docker-compose build nginx                         
不带缓存的构建
docker-compose build --no-cache nginx   
查看nginx的日志 
docker-compose logs  nginx                     
查看nginx的实时日志
docker-compose logs -f nginx                   

验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 
docker-compose config  -q                        
以json的形式输出nginx的docker日志
docker-compose events --json nginx       
暂停nignx容器
docker-compose pause nginx                 
恢复ningx容器
docker-compose unpause nginx             
删除容器(删除前必须关闭容器)
docker-compose rm nginx                       
停止nignx容器
docker-compose stop nginx                    
启动nignx容器
docker-compose start nginx                    

参考文档

Docker Compose官方安装
Docker-Compose 官方命令大全
docker-compose v3版本命令参考


Not matter of the today will drag tomorrow!

发布了83 篇原创文章 · 获赞 58 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_38423105/article/details/88710228