zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Docker Compose

Docker Compose
2023-09-14 09:08:29 时间

官方文档:https://docs.docker.com/compose 

一、介绍

  Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。是用来定义和运行多个Docker容器应用的工具,它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 

Compose 中有两个重要的概念:

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

  • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

  Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

二、Linux 安装

curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

chmod a+x /usr/local/bin/docker-compose  
docker-compose -version
docker-compose version 1.19.0, build 9e633ef

 

三、启动一个项目

3.1 编写一个yaml文件

pwd
/home/bigberg/docker/compose-test

# 编写yaml文件
vim docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
      - "8888:80"


# version :  需要和docker 版本相匹配

# services : 定义组中的容器和服务等

# web : 容器镜像服务的标识,通过这个标识来管理镜像

# build .  :  构建镜像的目录

# ports : 映射的端口

version 对应的docker版本:

  

3.2 编写一个Dockerfile文件   

FROM centos
MAINTAINER bigberg
RUN yum -y install httpd php php-gd php-mysql
RUN echo "<?php phpinfo()?>" > /var/www/html/index.php
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
EXPOSE 80

 

 3.3 构建镜像

docker-compos up

  构建完成后查看:

 docker-compose ps
      Name                     Command              State          Ports        
--------------------------------------------------------------------------------
composetest_web_1   /usr/sbin/httpd -D FOREGROUND   Up      0.0.0.0:8888->80/tcp

  访问地址:(项目确实起来了)

  

 

四、python-web事例

  4.1 定义应用的一些依赖

  创建文件夹   

mkdir -p compose-test/python-test
cd compose-test/python-test

  创建一个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)
app.py

  在app.py中,host='redis' 中redis 是 redis 容器的主机名,在这个项目的网络中可以被解析

Name:      redis
Address 1: 172.20.0.3 625eb281eafd

  创建一个requirements.txt文件

flask
redis

  4.2 创建一个Dockerfile  

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
  • 构建使用的python:3.4-alpine镜像
  • 将当前目录添加到镜像中/code目录
  • 设置工作目录为 /code
  • 安装python依赖
  • 设置容器启动运行命令为 python app.py

  4.3 创建docker-compose.yml 文件

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

  这个ymal文件有两个服务:web 和 redis

  web服务:

  • 构建使用Dockerfile中定义的镜像
  • 映射端口5000到宿主机端口5000,也就是flask web的默认端口

  redis服务:

  • 构建使用的是Docker Hub中公共Redis镜像

  4.4 构建项目

docker-compose up

  4.5 访问项目

  

  每次刷新,访问的次数会增长

  4.6 修改ymal文件,将目录挂在到镜像中

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

  通过volumes 将当前目录挂在到镜像中的 /code目录,这个就可以在宿主机目录中修改文件,容器中也会生效,不必每次修改都要重新构建

  4.7 重新docker-compose up  

docker-compose up

  

 

  4.8 修改app.py文件  

Hello world!
改为

Hello from Docker!