Docker Compose(单机使用)

介绍


以前使用Docker时


(一)写完项目后需要定义一个DockerFile


(二)通过DockerFile文件使用 docker build命令生产一个镜像


(三)通过run 命令去执行


上述流程全是手动操作,并且只能操作单个容器!


 


 


如果有个这样的案例


微服务。 100 个微服务!(就需要启动一百个项目,如果使用docker就需要每个去执行上述操作,而且每个项目可能之间还有依赖关系)依赖关系。


 


 


当遇见这种情况的时候我们就需要使用Docker Compose 来轻松高效的管理容器 。定义运行多个容器。(只需要把它定义在一个文件里就可以了,类似于shell脚本)


 


Docker Compose的概述(官网)

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。要了解有关Compose的所有功能的更多信息,请参阅功能列表

Compose可在所有环境中工作:生产,登台,开发,测试以及CI工作流。您可以在“常见用例”中了解有关每种情况的更多信息。


使用Compose基本上是一个三步过程:

  1. 使用定义您的应用环境,Dockerfile以便可以在任何地方复制。
  2. 定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
  3. Run docker-compose up  and Compose启动并运行您的整个应用程序。(补充down停止)

总结:Docker Compose作用就是批量容器的编排

补充:Compose是Docker官方的开源项目,需要安装!

使用dockerfile 在如何地方都可以运行(简化运维和部署的工作)

比如:现在有  web服务、redis、mysql、cassandra、nginx等多个容器。以前就需要i一个一个的run运行

现在使用一个yaml文件就可以一起运行了

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

可以看见,这个compose里面会去先运行redis,然后在运行web服务,一百服务也如此



Compose :重要的概念



1、服务 services , 容器。应用。(例如: web 、 redis 、 mysql....,这么多服务,我们就可以使用compose进行编排。我们将这些编排好的服务打包就会生成一个项目 )



1、项目 project 。 一组关联的容器。 博客。 web 、 mysql 。



 

 

安装

下载docker compose

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_docker-compose



sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker- compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
# 这个可能快点!
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker- compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

下载完毕!



docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_docker_02

赋予可执行权限

[root@master LH]# chmod +x /opt/LH/docker-compose (docker-compose通常放在docker相同目录下,我通常会将这两个文件放在/usr/bin目录下)

查看是否安装成功

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_redis_03

Docker-Compose的初级体验

第一步:定义应用程序依赖项

1、为项目创建目录

[root@master opt]# mkdir -p kuangre
[root@master opt]# cd kuangre/

2、在项目目录中创建调用的文件,并将其粘贴到: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)

3、创建在项目目录中调用的另一个文件,并将其粘贴到:requirements.txt

flask
redis

第二步:创建DockerFile

#一个基本的环境包
FROM python:3.7-alpine
#工作的目录
WORKDIR /code
#刚定义的app.py的环境
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
#运行
RUN apk add --no-cache gcc musl-dev linux-headers
#拷贝文件
COPY requirements.txt requirements.txt
#使用pip安装
RUN pip install -r requirements.txt
#暴露的端口为5000
EXPOSE 5000
#拷贝当前目录运行
COPY . .
CMD ["flask", "run"]

这告诉 Docker:

  • 以 Python 3.7 映像为起点生成映像。
  • 将工作目录设置为 。/code
  • 设置命令使用的环境变量。flask
  • 安装 gcc 和其他依赖项
  • 复制并安装 Python 依赖项。requirements.txt
  • 向图像添加元数据,以描述容器正在端口 5000 上侦听
  • 将项目中的当前目录复制到图像中的工作目录。..
  • 将容器的默认命令设置为 。flask run

第三步:定义server服务在compos file上运行(编写*.yaml文件)

vim  docker-compose.yml

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

解释,这里有两种生成镜像的方法,一种是使用build将DockerFile生成镜像,另一种是从镜像仓库拉去。

第四步:从项目目录中,通过运行 启动应用程序。docker-compose up(docker -f yaml文件  up)

 

做个小总结:



1 、应用 app.py



2 、 Dockerfile 应用打包为镜像



3 、 Docker-compose yaml 文件 (定义整个服务,需要的环境。 web 、 redis ) 完整的上线服务!



4 、启动 compose 项目( docker-compose up )



 



流程:



1 、创建网络



2 、执行 Docker-compose yaml



3 、启动服务。



Docker-compose yaml



Creating composetest_web_1 ... done



Creating composetest_redis_1 ... done



启动了两个项目



docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_Docker_04



自动的默认规则?(使用暴露的端口号5000去执行)



 



docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_Docker_05

docker imgaes (查看自动创建的images镜像)

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_Docker_06

 

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_Docker_07



默认的服务名 文件名 _ 服务名 _ num



多个服务器。集群。 A B _num 副本数量



服务 redis 服务 => 4 个副本。



集群状态。服务都不可能只有一个运行实例。 弹性、 10 HA 高并发。



kubectl service 负载均衡



3、网络规则 (通过compose启动的项目,都会在这个compose里面,它会自己帮我们进行维护。并且他们在同一个网络下)

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_redis_08

10个服务 => 项目 (项目中的内容都在同个网络下。域名访问)

查看这个网络下发的服务

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_docker_09

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_redis_10


如果在同一个网络下,我们可以直接通过域名访问。


HA !



例如:我们直接写redis、mysql的域名即可,IP的话会自己动态生成



 



停止: docker-compose down



 



Docker 小结:



1 、 Docker 镜像。 run => 容器



2 、 DockerFile 构建镜像(服务打包)



3 、 docker-compose 启动项目(编排、多个微服务 / 环境)



4 、 Docker 网络



 



yaml

docker-compose核心

总共分为三层

第一层:
version:''  #它与docker-compose相对应

第二层:
server:     #服务
      服务1: web 
           # 服务配置 
              images 
              build 
              network ..... 
      服务2: redis .... 
      服务3: mysql

第三层:      #统称其他配置

网络/卷、全局规则 
volumes: 
networks: 
configs:

按照顺序启动(depends_on最后启动)

docker 一个镜像启动多个容器映射端口 一个docker镜像运行多个实例_redis_11

了解更多yaml相关知识,官网推荐:https://docs.docker.com/compose/compose-fifile/#specifying-durations