Docker企业及进阶开发

​学习视频​

1、Docker Compose

1.1、简介

​Docker​

Dockerfile build run 手动操作,单个容器!

微服务,100个微服务,依赖关系。

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

官方介绍

  1. 定义运行多个容器
  2. YAML file配置文件
  3. 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.

​所有的环境都可以使用compose。​​ 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:

Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
Dockerfile保证我们的项目再任何地方可以运行

Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
services 什么是服务。

Run docker-compose up and Compose starts and runs your entire app.
启动项目

​作用:批量容器编排​

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

​Dockerfile​​让程序在任何地方运行。web服务、redis、mysql、nginx… 多个容器。 run

Compose

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: {}

docker-compose up 100个服务

Compose:重要概念

  • 服务services, 容器、应用(web、redis、mysql…)
  • 项目project。 一组关联的容器

1.2、安装

1.下载

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

# 建议使用这个
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` >

Docker企业级进阶开发_redis

2.授权

chmod

Docker企业级进阶开发_flask_02

1.3、体验

​官网地址​

python应用,计数器,redis

Docker企业级进阶开发_flask_03

1.在home目录下创建一个composetest文件夹

mkdir composetest
cd composetest

2.在composetest文件夹下创建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.在composetest目录下requirements.txt文件

flask
redis

4.在composetest目录下Dockerfile文件

# 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"]

5.在composetest目录下docker-compose.yml文件

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

6.启动compose

docker-compose

​docker-compose up的执行流程​

1、创建网络

2、执行Docker-compose yaml

3、启动服务

Creating composetest_web_1 … done

Creating composetest_redis_1 … done

​启动成功并且成功运行​

Docker企业级进阶开发_运维_04

docker images

Docker企业级进阶开发_docker_05

自动的默认规则

1、文件名 composetest

2、服务

默认的服务名 文件名_num

​多个服务器,集群 A B_num 副本数量​

服务redis服务=>4个副本

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

​3、网络规则​

Docker企业级进阶开发_容器_06

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

Docker企业级进阶开发_容器_07

如果在同一个网络下,​​我们可以通过域名进行访问​

​停止命令​

docker-compose

docker-compose

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

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

Docker小结:

1、Docker镜像,run=>容器

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

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

4、Docker网络

1.4、yaml 规则

docker-compose.yaml 核心

​官方例子链接​

# 3层

version: '' # 版本
services: # 服务
服务1: web
# 服务配置
images
build
network
......
服务2: redis
.....
服务3: mysql
.....
# 其他配置 网络/卷 全局规则

Docker企业级进阶开发_容器_08

Docker企业级进阶开发_docker_09

1.5、实战

  1. 使用Compose一键部署WP博客
  2. 自己编写微服务上线

开源项目(博客)

Docker企业级进阶开发_flask_10

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

Docker企业级进阶开发_flask_11

docker-compose up -d #后台启动

Docker企业级进阶开发_docker_12

​实战​

Docker企业级进阶开发_docker_13

​项目重新部署打包​

docker-compose

2、Docker Swarm

2.1、购买四台1核2G以上的服务器

Docker企业级进阶开发_docker_14

Docker企业级进阶开发_容器_15

按量付费:用时花钱,不用不收钱,记得释放即可。

Docker企业级进阶开发_容器_16

Docker企业级进阶开发_flask_17

Docker企业级进阶开发_运维_18

Docker企业级进阶开发_flask_19

Docker企业级进阶开发_flask_20

分组可以不设置

Docker企业级进阶开发_redis_21

Docker企业级进阶开发_flask_22

2.2、4台机器安装docker

Docker企业级进阶开发_运维_23

2.3、工作模式

Docker企业级进阶开发_运维_24

Docker企业级进阶开发_redis_25

2.4、搭建集群

Docker企业级进阶开发_运维_26

Docker企业级进阶开发_redis_27

Docker企业级进阶开发_flask_28

Docker企业级进阶开发_redis_29

生成令牌在任何一个manager节点上就可以

Docker企业级进阶开发_docker_30

Docker企业级进阶开发_容器_31

Docker企业级进阶开发_容器_32

Docker企业级进阶开发_docker_33

2.5、Raft协议

Docker企业级进阶开发_flask_34

2.6、体会

命令只能在manager上执行

Docker企业级进阶开发_redis_35

Docker企业级进阶开发_容器_36

Docker企业级进阶开发_docker_37

Docker企业级进阶开发_运维_38

Docker企业级进阶开发_容器_39

Docker企业级进阶开发_运维_40

​虽然是在docker-1机器上创建的,但1、2、4上都没有这个docker进程​

Docker企业级进阶开发_容器_41

​跑到了3上,docker-3也是manager节点​

Docker企业级进阶开发_redis_42

​动态更新nginx成3个副本,1上没有,2、3、4都有nginx。但用1的ip访问也能访问到nginx​

Docker企业级进阶开发_docker_43

Docker企业级进阶开发_docker_44

如果开10个时,四个节点上分别跑3、3、2、2个nginx容器。
同样的命令也可以再设置成只有1个副本

Docker企业级进阶开发_redis_45

Docker企业级进阶开发_redis_46

Docker企业级进阶开发_flask_47

Docker企业级进阶开发_docker_48

Docker企业级进阶开发_redis_49

k8s更难,功能更多。swarm相当于简单版的k8s

2.7、概念总结

Docker企业级进阶开发_docker_50

Docker企业级进阶开发_运维_51

Docker企业级进阶开发_运维_52

Docker企业级进阶开发_运维_53

Docker企业级进阶开发_容器_54

Docker企业级进阶开发_flask_55

Docker企业级进阶开发_docker_56

Docker企业级进阶开发_flask_57

Docker企业级进阶开发_运维_58

Docker企业级进阶开发_flask_59

Docker企业级进阶开发_flask_60

docker

Docker企业级进阶开发_docker_61

Docker企业级进阶开发_docker_62

Overlay可使多个相互;ping不同的机器联通并变成一个整体

3、Docker Stack

Docker企业级进阶开发_redis_63

4、Docker Secret

Docker企业级进阶开发_容器_64

k8s中也有这个概念,学k8s的时候再说

5、Docker Config

Docker企业级进阶开发_容器_65

Docker企业级进阶开发_docker_66

Docker企业级进阶开发_redis_67

超过10台用k8s不用swarm

Docker企业级进阶开发_容器_68

Docker企业级进阶开发_docker_69

_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQwNzM1NTY=,size_16,color_FFFFFF,t_70#pic_center)

Docker企业级进阶开发_redis_67

超过10台用k8s不用swarm

Docker企业级进阶开发_容器_68

Docker企业级进阶开发_docker_69

Docker企业级进阶开发_redis_73