DockerFile build run 手动操作,单个容器!
如果是微服务,100个微服务!各种依赖关系
官方文档 Overview of docker-compose CLI | Docker Documentation
步骤:
1、DockerFile 保证我们的项目在任何地方可以运行
2、service 什么是服务;
docker-compose.yml 文件怎么写?
3、启动项目 up / down
Compose 是 Docker 官方的开源项目,需要安装!
Dockerfile 让程序运行在任何地方,web 服务,redis,mysql,nginx…多个容器
docker-compose.yml
version: "3.9" # optional since v1.27.0
services:
web: # 再启动 web
build: .
ports:
- "8000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis # 先启动 redis
volumes:
logvolume01: {}
docker-compose up 100 个微服务,一建上线
Compose 重要概念
服务 service (web、redis、mysql …)
项目 project = 一组关联的容器 = 对外的业务单元
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
# 官方镜像
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
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)
# requirements.txt 文件
flask
redis
# 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"]
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
docker compose up . # 启动
docker compose down # 停止
# 流程
1、创建网络
2、执行 docker-compose.yml
3、启动服务
⠿ Network composetest_default Created
⠿ Container composetest-redis-1 Created
⠿ Container composetest-web-1 Created
# 语法 - 3 层
version: '' # 版本
services: # 服务
服务1: web
# 服务配置
images:
build:
network:
...
服务2: redis
...
服务3: mysql
...
服务4: ...
# 其他配置 网络、卷、全局规则
volumes:
networks:
configs:
Quickstart: Compose and WordPress | Docker Documentation
version: "3.9"
services:
db: # db 服务
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql # 挂载到本地 db_data 目录下
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress: # WordPress 服务
depends_on: # depends_on 解决服务依赖,启动次序
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html # 挂载到本地的 WordPress_data 目录下
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes: # 全局配置
db_data: {}
wordpress_data: {}
集群的方式部署,环境需要 4 台 2v4g 的云服务器
Swarm mode overview | Docker Documentation
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CeoNfhcI-1651712847192)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428215748278.png)]
docker swarm --help
# 查看 swarm 命令
docker swarm init --advertise-addr 172.16.0.4
# 初始化一个节点,连接到节点内网地址-eth0
docker swarm join --token SWMTKN-1-6a8k9vzo6vlnlq6wrzeolrcznkiwfxz151g4bjo2t8g8dla27u-by93wkc6oka6nxbic09rxz6yx 172.16.0.4:2377
# 得到命令 == 其他节点 join 加入进来
docker swarm join-token manager
docker swarm join-token worker
# 主节点,获取管理员的令牌,生成后其他节点加入
docker node ls
# 其他节点加入后,可以查看
docker swarm leave
# 离开集群
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXr7rpIf-1651712847193)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428221303675.png)]
Raft 协议:保证大多数节点存活才可以用,至少 > 一台,集群模式至少 > 三台,高可用
告别 docker run
docker-compose up 启动一个项目,单机版!
集群: swarm docker service 容器==》服务==》副本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DttHvuAr-1651712847193)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428223126272.png)]
service 启动,具有扩缩容,滚动更新
docker service --help
# 查看创建命令
docker service create -p 8888:80 --name mynginx nginx
# 启动一个服务
docker service ps mynginx
# 查看启动的服务
docker service ls
# 查看 service
docker service rm mynginx
# 删除 service
docker service update --relipcas 3 mynginx
# 创建 三个 nginx 副本
# --relipcas number 可以实现动态扩缩容 number 可以根据实际情况填写
docker service create --replicas 2 --network host -p 8081:8081 --name nginx nginx
# 创建 2 副本的nginx
docker service create --mode
# --mode 默认使用副本运行
docker compose up -d wordpress.yaml
# 单机
docker stack deploy wordpress.yaml
# 集群
docker secret create
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsoHm8ph-1651712847194)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428231054415.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mylfTato-1651712847194)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220428231218415.png)]