Docker实战指南 0x06 Docker Compose

Docker & K8S 752 字

https://docs.docker.com/compose/

Dockerfile。商城。拆分很多微服务。10微服务

购物车微服务+Redis+MySQL = 一套服务(自动化的全套部署,全套下线)。交给Docker Compose【编排】。一个整套的application会有非常多的service

一次性的将所有相关联的服务自动部署。

前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。批量的维护整套应用

使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具

Compose的三步最佳实战:

  1. 定义自己应用的 Dockerfile 文件。为了在anywhere进行构建。
  2. 使用 docker-compose.yml定义我们服务。这一整套服务可以一起在一个隔离环境运行.
  3. 运行 docker-compose up 就可以启动整个app.

总结:批量服务编排。docker-compose.yml声明服务的规则。

单机环境。

1、安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose version

2、体验

1、创建一个测试应用

#1、Create a directory for the project:

mkdir composetest
cd composetest

#2、Create a file called app.py in your project directory and paste this in:
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、Create another file called requirements.txt in your project directory and paste this in:
flask
redis

2、创建Dockerfile

#In your project directory, create a file named Dockerfile and paste the following:
FROM python:3.7-alpine
WORKDIR /code
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
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

3、在Compose file里定义服务

#Create a file called docker-compose.yml in your project directory and paste the following:
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

4、Compose构建和运行应用

docker-compose up -d
#访问 http://localhost:5000/ 测试效果

5、效果

自己打包---》dockerfile--》结合docker-compose

1、创建网络

​ 默认的网络:1998ee0450ee composetest_default bridge local

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
#默认两个服务都用一个网络,是contextName_default;web里面可以使用redis的hostname访问
#cache = redis.Redis(host='redis', port=6379)
#默认每一个启动的容器 contextName_serviceName_1
docker network inspect composetest_default  
#效果:这个网络里面有。两个容器
#docker service ls #查看当前的服务。docker集群下,我们能看到所有的服务 容器的名_num。代表第几个副本。

集群状态下;compose更帅。我们可以直接定义服务在多个机器都有副本。

2022-10-04T12:50:49.png

2、构建每个镜像

3、创建两个容器在同一网络,我们可以使用hostname访问

docker-compose帮我们自定的部署了pyweb,redis,并且pyweb能访问redis。pyweb的5000浏览器也能访问

2022-10-04T12:51:11.png

2022-10-04T12:51:47.png

整个docker:

1、dockerfile

2、docker-compose

3、docker二次开发,如何更换底层存储驱动,如何自定义docker的网络。。。

详情:https://docs.docker.com/compose/compose-file/#reference-and-guidelines

#语法
三层
version: ""
services:  #定义很多服务
    服务1:
      #当前服务配置
    服务2:
      #当前服务配置
#服务要用的网络、卷,等其他全局规则,定义
volumes:
networks:
configs:
secrets:



networks:
  outside:
    external: true #外面创建好了,docker-compose不自动创建
如果自定义用了网络。卷等,都必须声明
version: "3"
services:
  java-app: 
     build: .
     ports:
       - "9000:8080"
     depends_on:
       - mysql
     command: java -jar /app.jar --spring.datasource.url=jdbc:mysql://mysql:3306/wps?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
     networks:
       - app-network
  mysql:
    image: mysql:5.7
    environment:
       MYSQL_ROOT_PASSWORD: 123456
    networks:
       - app-network

networks:
  app-network: {}


docker-compose up -d
docker-compose up -d --build #再触发一下手动构建


随便网上一个项目。dockerfile+docker-compose 一键搞定
mysql dockerfile-->run 网上的项目拉下来,把的sql文件导入数据。


docker-compose替代了dockerfile。完全可以(镜像存在)自定义的镜像 dockerfile+docker-compose。

整个docker-compose up/down/rm 单机情况下的编排

app-redis。用同一个网络。

集群情况。官方默认docker-swarm

docker 5个。 2主(HA) 3从(工作节点)

5、概念

工程、服务、容器

  • Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
  • Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例

6、实战-使用Compose构建一个wordpress应用

https://docs.docker.com/compose/wordpress/

maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见