Docke进阶篇学习笔记(已完善)

2022-02-11   


Docke进阶篇

首先感谢狂神的教程:

https://www.bilibili.com/video/BV1kv411q7Qc/?spm_id_from=autoNext

Docker Compose官方文档地址:https://docs.docker.com/compose/

Docker Compose

简介

Docker

DockerFile build run 手动操作,单个容器

微服务 100个微服务!依赖关系

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

定义,运行多个容器

Yaml file 配置文件

single command 命令有哪些?

所有的环境都可以使用Docker Compose

三步骤

  1. DockerFile保证我们的项目在任何地方可以运行
  2. docker-compose.yaml 这个文件写出来
  3. docker-compose up 启动项目

作用:批量容器编排

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

Dockerfile 让程序在任何地方运行 web服务器 redis mysql nginx... 多个容器

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

Compose重要的概念

  • 服务Services,容器,应用 (web,redis,mysql)
  • 项目Project 一组关联的容器 博客

安装Compose

  1. 下载

    #外网服务器,内网服务器不建议这样下载
    curl -L "https://github.com/docker/compose/releases/download/1.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.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
  2. 授权

    chmod +x /usr/local/bin/docker-compose
    
    root@sagamiyungooglecloud ~# docker -compose version
    unable to resolve docker endpoint: context "ompose" does not exist
    root@sagamiyungooglecloud ~ [1]# docker-compose version
    docker-compose version 1.29.2, build 5becea4c
    docker-py version: 5.0.0
    CPython version: 3.7.10
    OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
    

快速开始

地址:https://docs.docker.com/compose/gettingstarted/

通过Docker Compose上构建一个简单的python web应用程序,该应用程序使用Flask框架并在Redis中维护一个计数器,用来记录该Web应用被访问的次数

  1. 准备工作
#安装Python包管理工具
apt install python-pip
yum install python-pip
  1. 为项目创建目录
mkdir composetest
cd composetest
  1. 在项目目录中构建一个名为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)
  1. 编写Dockerfile文件
# syntax=docker/dockerfile:1
FROM
Learn more about the "FROM" Dockerfile command.
 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"]

#国内服务器版本
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN  pip install -r requirements.txt
CMD ["python","app.py"]
  1. 创建一个requirements.txt文件,内容如下
flask
redis
  1. 在项目目录创建一个docker-compose.yml文件,内容如下
version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
    
#此Compose文件定义了两个服务,web和redis
#该web服务使用从DockerFile当前目录中构建的图像
#将容器上的公共端口5000转发到主机上的端口5000,我们使用Flask web服务器的默认端口5000
#该redis服务使用从DockerHub注册表中提取的公共Redis镜像
  1. 使用Compose构建和运行应用程序

python应用,是一个计数器应用,使用Redis

  1. 应用 app.py
  2. DockerFile 将应用打包成镜像 (单机玩具)
  3. Docker-Compose yaml文件(定义整个服务,需要的环境:web,redis)完整的上线服务
  4. 启动Compose项目(docker-compose up 命令即可)

流程:

  1. 创建网络
  2. 执行Docker-Compose yaml
  3. 启动服务

Docker-Compose yaml

Creating composetest_web_1   ... done		
Creating composetest_redis_1 ... done

root@sagamiyungooglecloud ~# docker service ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

默认的服务器名 文件名 _ 服务名_ num

多个服务器,集群 _num 为副本数量

服务redis服务 =》 4个副本

集群状态,服务不可能只有一个运行实例 。弹性 高并发 负载均衡

kubectl service 负载均衡


网络规则

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

mysql :3306

10个容器实例:mysql,那就是10个ip 或者是redis

如果在同一个网络下,我们可以直接使用域名访问

停止:docker-compose down (需在项目文件夹内停止)或 Ctrl + C

docker-compose

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

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

Docker小结:

  1. Docker镜像 run =》 容器
  2. DockerFile构建镜像(服务打包)
  3. docker-compose启动项目(编排,多个微服务/环境)
  4. 精通Dockernetwork

yaml 规则

docker-composer.yaml核心思路

# 三层!

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

开源项目

博客

下载程序,安装数据库,配置...

compose应用 =》 一键启动

使用WordPress搭建博客

食用文档:https://docs.docker.com/samples/wordpress/

mkdir my_wordpress
cd my_wordpress/

vim docker-compose.yml
#以下为docker-compose.yml文件配置内容
version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    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: {}
  
#EOF

docker-compose up

以上命令即可通过访问服务器5000端口来部署

docker-compose up -d 后台启动

实战:计数器

使用SpringBoot写一个计数器

  1. 编写一个SpringBoot项目
  2. 使用Dockerfile构建镜像
  3. 编写docker-composer.yaml启动项目
  4. 丢到服务器并启动 docker-compose up

假设项目要重新打包

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

小结:

未来项目只要有docker-compose文件。按照这个规则,启动编排容器。

公司:docker-compose 直接启动

网上开源项目:docker-compose 一键搞定

总结:

工程,服务,容器

项目compose:三层

  • 工程 Project
  • 服务
  • 容器 运行实例!docker k8s 容器

Docker Swarm

集群方式的部署

购买服务器

4台服务器 2G

这里我用GoogleCloud的试用金买了4台2核4G的服务器,顺便后期学习k8s也方便

毕竟有机会白嫖它不香么

同时我也把视频中阿里云注意事项写出,方便各位总结

阿里云服务器注意事项

  • 1核2G 后续要学习k8s的建议4G
  • 选择按量付费,带宽是按照流量来计费的,机器的费用是根据小时来计费的
  • 需要最低充值100元,才可使用按量计费
  • 在学习试验后要关闭服务器,以节约预算

安装环境

官方文档:https://docs.docker.com/engine/install/

要注意善用多执行操作

Centos及其环境安装(尽量选择Centos7进行测试)

#gcc环境安装
yum install gcc -y
yum install gcc-c++ -y

#安装需要的软件包
yum install yum-utils -y

#设置镜像仓库
#此处参考Centos8停止更新软件源的解决方案

#更新yum软件包索引
yum makecache fast

#安装Docker-ce
yum install docker-ce docker-ce-cli containerd.io

#启动Docker
systemctl start docker

#测试命令
docker -v
docker run hello-world
docker images

#卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

Debian及其环境安装(自身版本为Debian10)

#gcc环境安装
apt install gcc -y


#更新apt索引
apt-get update

#允许apt通过https存储库
apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
#添加GPG密匙
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

#添加稳定存储库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nightly
  
#更新软件仓库
apt-get update

#安装Docker-ce引擎
apt-get install docker-ce docker-ce-cli containerd.io

#测试是否成功安装
docker run hello-world

#卸载Docker引擎
apt-get purge docker-ce docker-ce-cli containerd.io

#删除宿主机上的所有容器,镜像,物理卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

工作模式

节点分为管理节点和工作节点

即为:manager 与 docker

操作全部在管理节点完成

同Redis集群的概念是相似的

使用了Raft算法来保证集群的一致性

搭建集群

通过docker swarm --help查看其命令

root@k8s-images-1 ~# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm
#我们看到这里的命令无非就是增删改查



#查看初始化参数
root@k8s-images-1 ~# docker swarm init --help

Usage:  docker swarm init [OPTIONS]

Initialize a swarm

Options:
      --advertise-addr string                  Advertised address (format: <ip|interface>[:port])
      --autolock                               Enable manager autolocking (requiring an unlock key to start a stopped manager)
      --availability string                    Availability of the node ("active"|"pause"|"drain") (default "active")
      --cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
      --data-path-addr string                  Address or interface to use for data path traffic (format: <ip|interface>)
      --data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default
                                               port (4789) is used.
      --default-addr-pool ipNetSlice           default address pool in CIDR format (default [])
      --default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)
      --dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
      --external-ca external-ca                Specifications of one or more certificate signing endpoints
      --force-new-cluster                      Force create a new cluster from current state
      --listen-addr node-addr                  Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
      --max-snapshots uint                     Number of additional Raft snapshots to retain
      --snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)
      --task-history-limit int                 Task history retention limit (default 5)


通过ip addr查看自己服务器的ip地址

我们可以通过--advertise-addr参数来指定dockerswarm的使用网络

docker swarm init  --advertise-addr  [you ipaddress]


Swarm initialized: current node (dg76kg0vnfwafdrgmkcgkn1jf) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1z3x6i4961mbfwc5ue7uz5ufjj47c7o2hm5n4p53t8mxzvwbnv-ec2pflsf62ah8d9yxco64ppoa 10.170.0.4:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

初始化节点:docker swarm init

加入一个节点:docker swarm join

#To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.    即为我们这个节点获取令牌

#获取令牌
docker swarm join-token manager
docker swarm join-token worker

#然后将获取的令牌键入到想要添加节点的主机上

同理把之后的节点搭建进去

小结:

  1. 生成主节点 init
  2. 加入(manager)管理组,加入(worker)工作组

目标:双主双从

Raft协议

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

Raft协议:保证大多数节点存活才可以用 只要>1 集群至少>=3

实验:

  1. 将第一台试验机即Leader主机的docker服务停止后(宕机),那么另一个主结点也不能使用了
  2. 可以将其他节点离开

​ docker swarm leave

  1. work就是工作的,管理节点执行管理命令 3台机器设置为管理节点

集群:至少保证3个主节点

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

体会

弹性,负载,扩缩容

以后告别docker run!

docker-compose up 启动一个项目

集群:swarm docker service

容器 =》 服务

redis! = 3份容器

集群:高可用,web -> redis (3台,不同的机器上)


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

root@k8s-images-1 ~# docker service --help

Usage:  docker service COMMAND

Manage services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

Run 'docker service COMMAND --help' for more information on a command.

灰度发布:金丝雀发布


#用docker service 启动nginx服务器
docker service create -p 8888:80 --name my-nginx nginx

#docker run   容器启动!不具有扩缩容器
#docker service 	服务!	具有扩缩容器,滚动更新


#查看服务
root@k8s-images-1 ~ [1]#  docker service ps my-nginx
ID             NAME         IMAGE          NODE           DESIRED STATE   CURRENT STATE            ERROR     PORTS
vl7pw6xlzaqn   my-nginx.1   nginx:latest   k8s-images-1   Running         Running 26 minutes ago
root@k8s-images-1 ~# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
iijs808s2l1j   my-nginx   replicated   1/1        nginx:latest   *:8888->80/tcp

#更新服务(动态扩缩容)
docker service update --replicas [number] my-nginx    #此处的数为运行总大小
docker service scale my-nginx=[number]		#此处的数字为要扩容的大小


#移除我们的服务
docker service rm my-nginx

服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用

弹性,扩缩容

服务的高可用,任何企业,云

k8s!云原生应用

docker swarm其实并不难

只要会搭建集群,会启动服务,动态管理容器就可以了

swarm => k8s 副本,服务器,多容器!

概念总结

swarm

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

Node

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

Service

任务,可以在我们的管理节点或工作节点来运行,核心

Task

容器内的命令,细节任务

命令 -> 管理 -> api -> 调度 -> 工作节点(创建容器维护容器)

逻辑是不变的

k8s service api

拓展:网络模式:"PublishMode":"ingress"

Swarm:

Overlay:

ingress:特殊的Overlay网路,具有负载均衡的功能。 IPVS VIP!

虽然Docker在四台机器上,实际网络是同一个

Docker Stack

Docker-compose 单机部署项目

Docker Stack部署,集群部署

#Docker-compose单机启动项目
docker-compose up -d wordpress.yaml

#集群
docker stack deploy wordpress.yaml

#docker-compose	文件

这里狂神说的较为粗略

我引申一个资料,供各位以参考

https://blog.csdn.net/huangjun0210/article/details/86502021

Docker Secret

即为Docker的安全模块

安全,配置密码,证书

root@SagamiYunCloud ~# docker secret

Usage:  docker secret COMMAND

Manage Docker secrets

Commands:
  create      Create a secret from a file or STDIN as content
  inspect     Display detailed information on one or more secrets
  ls          List secrets
  rm          Remove one or more secrets

Run 'docker secret COMMAND --help' for more information on a command.

Docker Config

配置

root@SagamiYunCloud ~# docker config

Usage:  docker config COMMAND

Manage Docker configs

Commands:
  create      Create a config from a file or STDIN
  inspect     Display detailed information on one or more configs
  ls          List configs
  rm          Remove one or more configs

Run 'docker config COMMAND --help' for more information on a command.

容器单独没有什么意义,有意义,容器编排

以上三门技术视频说已经很少用了,狂神说可以有兴趣学一学,不过

我可没那个兴趣

哈哈(作为开发是足够足够了)

拓展到K8s

云原生时代

云应用

电商网站

在线教育平台

可视化数据平台

下载 => 配置!

大趋势既是k8s

k8s,10台机器以上

GO

Go语言!必须掌握!

Docker是Go开发的

K8s也是Go开发的

...

Go是一门天生并发语言,与C类似,但是有GC,内存安全与并发

Go 指针!

入门

基础语法

高级对象

如何操作数据库

框架

大厂都在转Go!

完结撒花

Q.E.D.


一个平凡人的追梦之旅