docker进阶

Docker Compose


简介

dockerfile build run 手动操作单个容器

Docker Compose 用来高效的管理容器。定义多个容器的运行

官方文档

定义、运行多个容器。

YAML file 配置文件

single command 。 命令有哪些

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

所有环境都可以使用dockercompose

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

三个步骤

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
    • dockerfile 保证我们的项目可以在任何地方运行
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
    • service服务
    • docker-compose.yml 文件怎么写
  3. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.
    • 启动项目

作用:批量容器编排。


Compose 是docker官方的开源项目。需要安装。

dockerfile可以让程序在任何地方运行。web服务,redis,mysql,nignx…多个容器

Compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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: {}

安装

DockerCompose下载

1
2
3
4
5
6
7
8
9
10
11
# 下载
在GitHub上下载,下载速度比较慢
sudo curl -L "https://github.com/docker/compose/releases/download/v1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

这个可能快一点
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 设置操作权限
chmod +x /usr/local/bin/docker-compose

docker-compose --help

安装成功

官方文档

体验


1.建立一个文件夹,并创建一个app文件

1
2
mkdir composetest
cd composetest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)
1
2
flask
redis

2.创建一个Dockerfile文件 应用打包为镜像

1
2
3
4
5
6
7
8
9
10
11
# 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"]

3.写一个yml文件 定义整个服务需要的环境 web redis

1
2
3
4
5
6
7
8
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"

4.启动compose

1
docker-compose up
1
# 使用docker-compose up 的时候会出现一直卡在某一个下载进度上 目前没有很好的解决办法 只能慢慢等

启动成功:

停止dockercompose

docker-compose down 或者 Ctrl + C

docker-compose

以前都是通过docker run 单个启动容器

docker-compose 。 通过docker-compose 编写yml配置文件,可以通过compose一键启动所有服务,或者停止。

docker小结

  1. Docker 镜像。 run == > 容器
  2. Dockerfile 构建镜像(服务打包)
  3. docker-compose 启动项目(编排 , 多个微服务/ 环境)
  4. docker网络

yaml规则

docker-compose 核心。

services中的内容可以参考官方文档,右侧可滑动的区域就是可以添加的services

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 三层

version:'' # docker-compose 的版本
services: # 服务
服务1: web
# 容器配置
images
build
network
......
服务2: redis
.....
服务3:
......
# 其他配置 网络/卷、全局规则
volumes:
networks:
config:

开源项目


博客
  1. 下载项目(docker-compose.yml)
  2. 如果需要文件。Dockerfile
  3. 文件准备齐全(直接一键启动)

后台启动 docker-compose up -d

实战


  1. 编写自己的springboot服务
  2. 使用dockerfile 构建对象
  3. 使用docker-compose.yml 编排项目(yml文件一定要写清楚)
  4. 放到服务器上 docker-compose up

项目部署要重新部署打包

1
docker-compose up --build #重新构建

在xshell 上输入 curl localhost:8080/hello 即可测试访问,或者登录云服务器ip地址访问

遇到不会的命令就–help

Swarm

Docker Engine 1.12 introduces swarm mode that enables you to create a cluster of one or more Docker Engines called a swarm. A swarm consists of one or more nodes: physical or virtual machines running Docker Engine 1.12 or later in swarm mode.

There are two types of nodes: managers and workers.

If you haven’t already, read through the swarm mode overview and key concepts.

需要四个服务器,1主3从

设置主机:docker swarm init --advertise-addr 公网ip地址

docker swarm join 加入一个节点

1
2
3
# 获取令牌(需要关闭主节点的防火墙 systemctl stop firewalld.service  关闭防火墙) 
docker swarm join-token manager
docker swarm join-taken worker

Raft协议

双主双从:假设一个节点挂了,其他节点能否能用

Raft协议:保证大多数节点可以用。只要>1,集群数大于3台

实验:

  1. 将一个主节点停止,另外一个主节点也不能用了
  2. 可以将其他节点离开
  3. 集群可用:3个主节点。至少有两个节点是可用的(主节点最好是奇数,保证存活一半以上)

Raft协议:保证大多数节点存活,才可以使用,高可用。

体验:创建服务,动态扩展服务,动态更新服务

1
2
docker run 启动容器! 不具有扩缩容功能
docker service 启动服务! 具有扩缩容功能

查看服务

1
2
docker service ps 服务名
docker service ls

动态扩容

1
2
docker service update --replicas 10 已开启的服务名   # 开启10台服务
docker service scale 已开启的服务名=10 #开启10台服务(一共10台,不是多开启10台)和update一样

概念总结


swarm:

集群的管理和编号。docker可以初始化一个swarm集群,其他节点可以加入(工作者,管理者)

Node

就是一个docker节点。多个节点就组成了一个网络集群。(管理,工作者)

Service

任务,可以在管理节点和工作节点来运行。核心!用户访问

Task

容器内的命令,细节任务

Docker Stack

docker-compose 单机部署

docker stac部署,集群部署