Docker Compose 容器管理
文章目录
一、Docker Compose 介绍
我们操作单个服务时,需要先创建DockerFile,然后 build 创建容器并运行。但要是有100个微服务呢,显然一个一个的去操作不显示,而且服务之间有强的依赖关系。这时候就需要Docker Compose 来轻松高效的管理容器。
作用: 批量容器编排。
Compose 是Docker 官方的开源项目。需要安装
DockerFile 让程序在任何地方运行。web 服务,redis,mysql, nginx… 多个容器。run Compose
docker-compose up 100 个服务。
Compose:重要的概念
- 服务service,容器,应用(web,redis,mysql…)
- 项目project。一组关联的容器。
二、Docker Compose 安装与测试
下载 docker-compose
[root@izbp1ca5vr2fxjgbmapekkz ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 423 100 423 0 0 131 0 0:00:03 0:00:03 --:--:-- 131
100 16.7M 100 16.7M 0 0 4511k 0 0:00:03 0:00:03 --:--:-- 29.8M
授权安装
[root@izbp1ca5vr2fxjgbmapekkz bin]# sudo chmod +x /usr/local/bin/docker-compose
官方测试用例
- Create a directory for the project:
mkdir composetest
cd composetest
- 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)
- Create another file called requirements.txt in your project directory and paste this in:
flask
redis
- In your project directory, create a file named Dockerfile and paste the following:
# syntax=docker/dockerfile:1
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
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
- Create a file called docker-compose.yml in your project directory and paste the following:
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
-
ls
7.启动:From your project directory, start up your application by running docker-compose up.
8 查看镜像
发现redis,python自动帮我们下载了。- 停止服务 docker-compose down
以前都是单个 docker run 启动容器,现在是通过 docker-compose编写yml文件,通过 compose 一键启动所有服务,或停止。
总结:
- 应用 app.py
- Dockerfile 应用打包为镜像
- Docker-compose.yml 文件 (定义整个服务,需要的环境。web,redis)完整的上线服务
- 启动 compose 项目 (docker-compose up)
流程:
- 创建网络
- 执行 docker-compose.yml
- 启动服务
三、Docker Compose 详解
1. yml 书写规则
整个yml可分为三层:
version: '' # 版本
service: # 服务
服务1: web
# 服务配置
images
build
network
服务2: redis
...
服务3: redis
# 其他配置 网络/卷,全局规则
volumes:
networks:
configs:
2. 自己编写微服务上线
- 新建项目demo
controller
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class controller {
@Autowired
StringRedisTemplate redisTemplate;
@RequestMapping("/hello")
public String Hello() {
Long views = redisTemplate.opsForValue().increment("views");
return "hello world !!! views: "+ views;
}
}
application.properties
server.port=8080
spring.redis.host=redis
- 编写 Dockerfile 文件
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
- 编写 docker-compose.yml 文件
version: '3.8'
services:
kuangapp:
build: .
image: kuangapp
depends_on:
- redis
ports:
- "8090:8080"
redis:
image: "redis:alpine"
- 项目打包上传至服务器,并且上传 Dockerfile 文件和 docker-compose.yml 文件
- 执行 docker-compose up 命令 运行
- 测试