docker进阶v-2.0

docker进阶v-2.0

1.0 docker compose

1.1 compase 介绍

docker build run 手动操作单个容器

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

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

  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.
    services 什么是服务。
    docker-compose.yml 这个文件怎么写!

Run docker-compose up and Compose starts and runs your entire app.
启动项目
作用:批量容器编排。

理解

管理多个容器的一个工具,通过编写dockerfile文件来实现。

version: '2.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。 一组关联的容器。 博客。web、mysql。

1.2 安装

1,下载docker-compose

视频中的方法目前无法下载,我这里使用的是直接下载并复制的方式

下载网址

选择和视频中一样的版本。

docker进阶v-2.0_第1张图片

docker进阶v-2.0_第2张图片

mv docker-compose-Linux-x86_64 docker-compose  #修改下名字吧!

docker进阶v-2.0_第3张图片

2,授权

 [root@docker bin]#chomd +x docker-compose 

image-20230721212854370

3,检测一下,使用下命令查看您下载的版本信息。如果出现版本信息就是安装成功了,如果没有出现任何反应,或者出现报错就是安装的问题,按照上面的方法重新操作下即可。

docker进阶v-2.0_第4张图片

1.3 体验

相关网址:https://docs.docker.com/compose/gettingstarted/

这个实验失败了,但是以了解具体的过程为重要的。原因没有找到

Python应用,计数器应用

1,定义应用程序依赖关系

 [root@docker bin]#cd /home  #习惯切换到这个目录下
 [root@docker home]#ls
lighthouse
 [root@docker home]#mkdir composetest
 [root@docker home]#cd composetest
 [root@docker composetest]#vim app.py
 [root@docker composetest]#cat 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)
 [root@docker composetest]#vim requirements.txt  #添加一个依赖
 [root@docker composetest]#cat requirements.txt 
flask
redis
 [root@docker composetest]#


2,创建一个dockerfile 文件(单机玩具)

 [root@docker composetest]#vim requirements.txt
 [root@docker composetest]#cat requirements.txt 
flask
redis
 [root@docker composetest]#vim Dockerfile
 [root@docker composetest]#cat Dockerfile  #官方文档需要去远程下载东西,所以比较慢
,这里使用自己找的一个文件。

 [root@docker composetest]#vim Dockerfile 
 [root@docker composetest]#cat Dockerfile 
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip tall -r requirements.txt
CMD ["python","app.py"]


 [root@docker composetest]#

3,在Compose文件中定义服务(定义整个服务,需要的环境,web,redis),完整的上线服务。

 [root@docker composetest]#vim docker-compose.yml
 [root@docker composetest]#cat docker-compose.yml  #这个文件是需要放通服务器的5000端口,这里去放通下
cat docker-compose.yml
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

 [root@docker composetest]#ll
total 16
-rw-r--r-- 1 root root 514 Jul 21 21:39 app.py
-rw-r--r-- 1 root root  96 Jul 21 21:47 docker-compose.yml
-rw-r--r-- 1 root root 281 Jul 21 21:45 Dockerfile
-rw-r--r-- 1 root root  12 Jul 21 21:41 requirements.txt

4,使用Compose构建并运行应用

docker compose up  

时间比较长,需要等待下…docker进阶v-2.0_第5张图片

流程:

1,创建网络

2,执行dockerfile-compose yaml

3,启动服务。

  • Docker-compose yaml
  • Creating composetest_web_1 … done
  • Creating composetest_redis_1 … done

文件名;composetest

服务

 [root@docker composetest]#docker imags
docker: 'imags' is not a docker command.
See 'docker --help'
 [root@docker composetest]#docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
composetest-web   latest    d316c0bb24d0   12 minutes ago   55.1MB
redis             alpine    3900abf41552   19 months ago    32.4MB
 [root@docker composetest]#
  • 默认的服务名 文件名_服务名 _ num
  • 多个服务器。集群。A B _num 副本数量
  • 服务redis服务 => 4个副本。
  • 集群状态。服务都不可能只有一个运行实例。 弹性、10 HA 高并发。
  • kubectl service 负载均衡。

网络

 [root@docker composetest]#docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
96ddab4a050f   bridge                bridge    local
087576a77faa   composetest_default   bridge    local
312b9f23579b   host                  host      local
a29b5c6e783f   none                  null      local

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

docker进阶v-2.0_第6张图片

如果在同一个网络下,我们可以直接通过域名访问。没有把IP写死,之后方便做高可用的功能。

停止服务

docker compose stop

快捷键  crtl+c

docker-compose
以前都是单个 docker run 启动容器。
docker-compose。 通过 docker-compose 编写 yaml配置文件、可以通过 compose 一键启动所有服务,停止。!

1.4 小结

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

扩展 yaml 规则

docker compose 核心

#三层

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

docker进阶v-2.0_第7张图片

学习要掌握规律。多写,多看,compose.yaml配置!

1,官方文档:https://docs.docker.com/compose/compose-file/#specifying-durations

2、开源项目 compose.yaml redis、mysql、mq!

1.5 开源项目

博客

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

compose应用。==> 一键启动

参考文档:https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/wordpress/

1,创建一个文件夹

mkdir docker-compose.yml

2,进入目录

cd my_wordpress/

3,编写一个docker-compose.yml 文件

services:
  db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10.6.4-focal
    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8.0.27
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
    ports:
      - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
volumes:
  db_data:
  wp_data:

4,运行这个项目

docker compose up -d
#使用docker ps 查看下具体的信息

查看是容器的80端口映射到主机的80端口的,因此直接访问该端口就可以访问wordpress网站了。这里端口是上面的文件写到的,可以在之前的文件位置修改端口

docker进阶v-2.0_第8张图片

image-20230722111047915

访问测试

首次加载可能是需要几分钟的时间的,这里查看已经是可以访问到的就可以了,不继续等待了

image-20230722111533925

上面访问的时候网络是的,测试了一下将不之后很快就访问成功了docker进阶v-2.0_第9张图片

2.0 Docker Swarm

2.1 环境准备

和博主一样购买阿里云的服务器吧,因为创建集群最少需要4台,我这里没有服务器了,买4台吧

密码:hR2>fR9#dZ2

docker进阶v-2.0_第10张图片

要求这几个服务同一个网段,同一个vpc内,

使用xshell连接下四台服务器,并且命名。

docker进阶v-2.0_第11张图片

2.2 四台机器安装docker

小技巧

docker进阶v-2.0_第12张图片

安装成功了,这里的安装步骤参考之前安装的步骤即可。

docker进阶v-2.0_第13张图片

2.3 工作模式

参考文档: https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/

docker进阶v-2.0_第14张图片

2.4 搭建集群

1,启动docker

systemctl start docker

2,查看下网络配置

 [root@docker1 ~]#docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
37f1b6becdf0   bridge    bridge    local
ccb7d9cab91b   host      host      local
06fd5ac4016e   none      null      local

3,查看下docker swarm 如何使用

docker swarm --help

重点关注红色方格内就可

docker进阶v-2.0_第15张图片

a,

docker swarm init  --help

地址,可以是公网,也可以是私网

docker进阶v-2.0_第16张图片

3,使docker1成为管理节点

查看下服务器的网络

ip addr

docker进阶v-2.0_第17张图片

使docker1成为管理节点

docker swarm init --advertise-addr 172.16.0.54  # 地址为服务器的内网地址,不走公网速度更快,同时也省钱。

docker进阶v-2.0_第18张图片

使docker2加入这个集群里面

docker swarm join-token manager  #获取主节点令牌
docker swarm join-token worker   #获取worker节点令牌
docker swarm join --token SWMTKN-1-13dmi1tciqy8xw0otkcw8ldqsrnfi4hywl0541tqw8dd9temlb-clygsoiqz5m9r4jluwzmghie0 172.16.0.54:2377  #这个命令就是docker1中提到的让其他节点加入该管理节点成为worker

现在docker2成为docker1的worker节点

image-20230722134728168

让docker3也加入该节点

方法有两种,

  • 直接继续在docker3中执行添加节点的命令

  • docker1管理节点生成一个新的命令

docker swarm join-token worker

docker swarm join --token SWMTKN-1-263ji3tea4uijblme9g3d1l0yk8qhgizatt2zadvxrfcx0aka6-5ndtaln8my2lesiiugkbo9kp4 172.16.0.54:2377 #新生成了命令

docker3中执行下

docker4作为一个主(manger)节点

docker1中执行生成主节点的令牌docker swarm join-token manager

image-20230722141750560

docker4中执行下

image-20230722141832794

成为了主节点

此时再docker1中查看节点的信息docker node ls

image-20230722142047193

集群搭通成功了!目前是双主双从

总结

1,生成主机点

2,加入(管理者,worker)

2.5 raft协议

  • 双主双从:假设一个节点挂了!其他节点是否可以用?
  • raft协议:保证大多数节点存活才可以使用。只要>1,集群至少大于3台

实验:

1,将docker1机器停止。宕机的效果,

目前是双主(docker4也是主节点),结果发现docker4也使用不了

  • 停止docker1 的服务image-20230722142803123

  • docker4执行下docker主节点的命令image-20230722142839954

    发现会报错,无法使用

​ 重启docker1机器的docker服务

主节点管理者变成docker4了。

image-20230722143311245

此时docker4 可以使用docker node ls命令了

image-20230722143531846

2,使docker3机器离开该集群

docker swarm leave

 [root@docker3 ~]#docker swarm leave 
Node left the swarm.

离开时需要时间的,等待一会管理节点查看下集群的节点信息

image-20230722144403825

发现docker3机器应down掉了。

此时让docker3机器也成为一个主节点,同样的步骤是,在docker1 中指定生成主节点的指令,然后将结果在docker3机器中运行。

#docker1 中
[root@docker1 ~]#docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-263ji3tea4uijblme9g3d1l0yk8qhgizatt2zadvxrfcx0aka6-3s4eqdlel0v53vqh3v2jq1u79 172.16.0.54:2377

 [root@docker1 ~]#


#docker3 中
 [root@docker3 ~]# docker swarm join --token SWMTKN-1-263ji3tea4uijblme9g3d1l0yk8qhgizatt2zadvxrfcx0aka6-3s4eqdlel0v53vqh3v2jq1u79 172.16.0.54:2377
This node joined a swarm as a manager.

此时docker3中也可以使用管理命令了

 [root@docker3 ~]#docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
sfwh5us3amnkc3cr3ntyc01ru     docker1    Ready     Active         Reachable        19.03.8
v0joyuir5n5o9y30uqh72fign     docker2    Ready     Active                          19.03.8
37m06a9a34aoq1bdokujbylgi     docker3    Down      Active                          19.03.8
k4s3bu56i6v8kw7v9xgg0jo9w *   docker3    Ready     Active         Reachable        19.03.8
jxmgfiwevpddztjleqpwbj012     docker4    Ready     Active         Leader           19.03.8

3,worker 就是工作的,管理节点来操作,三台机器设置为了管理节点

现在将docker1机器的docker服务停止,会发现其他两个管理节点还是可以使用的。

#docker1 中
 [root@docker1 ~]#systemctl stop docker

#docker3中
 [root@docker3 ~]#docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
sfwh5us3amnkc3cr3ntyc01ru     docker1    Ready     Active         Unreachable      19.03.8
v0joyuir5n5o9y30uqh72fign     docker2    Ready     Active                          19.03.8
37m06a9a34aoq1bdokujbylgi     docker3    Down      Active                          19.03.8
k4s3bu56i6v8kw7v9xgg0jo9w *   docker3    Ready     Active         Reachable        19.03.8
jxmgfiwevpddztjleqpwbj012     docker4    Ready     Active         Leader           19.03.8

#docker4中
 [root@docker4 ~]#docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
sfwh5us3amnkc3cr3ntyc01ru     docker1    Down      Active         Unreachable      19.03.8
v0joyuir5n5o9y30uqh72fign     docker2    Ready     Active                          19.03.8
37m06a9a34aoq1bdokujbylgi     docker3    Down      Active                          19.03.8
k4s3bu56i6v8kw7v9xgg0jo9w     docker3    Ready     Active         Reachable        19.03.8
jxmgfiwevpddztjleqpwbj012 *   docker4    Ready     Active         Leader           19.03.8

再停止一个管理节点

#docker3 中
 [root@docker3 ~]#systemctl stop docker

#docker4 中
 [root@docker4 ~]#docker node ls #因为停止是需要一段时间的,所以等待一会再操作就会发现执行不了管理员命令了。
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.

这个实验就再次证明,集群要是可用,就至少有3个主节点。>1台管理节点存活

实验做完就把docker3 和1 的docker服务启动起来吧systemctl start docker

2.6 体会

弹性扩缩容,集群

以后告别docker run

docker-compose up ! 启动一个项目。单机

容器=>服务!

redis! 3份,容器!、

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

容器=>服务!==>10个副本(同时开启10个redis容器)

灰度发布,金丝雀发布

把之前down掉的机器在集群管理这里删除掉吧 docker node rm 集群id

docker进阶v-2.0_第19张图片

查看下docker service命令的帮助吧

docker进阶v-2.0_第20张图片

启动一个NGINX服务,容器内8888端口映射主机80端口

再此执之前去服务器控制台放通了服务器的80和8888 端口

image-20230722163544599

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

查看服务的replicas

image-20230722161726005

服务随机分布到docker1上了,说明下,这个是随分布的,尽管这里没有反馈到。之后会遇到是随机平均分配到其他的节点中。

image-20230722162122747

其他的节点都没有启动服务

docker进阶v-2.0_第21张图片

升级创建副本

创建副本docker service update --replicas 1 my-nginx

docker进阶v-2.0_第22张图片

此时查看三台服务器上都运行了my-nginx服务

docker进阶v-2.0_第23张图片

​ 此时再有运行服务上的服务器IP都可以通过浏览器访问IP+端口,访问到nginx服务

docker进阶v-2.0_第24张图片

但是没有运行容易服务的服务器也可以访问到nginx页面

docker进阶v-2.0_第25张图片

同时运行10个副本也是可以的,随时动态扩缩容。

docker进阶v-2.0_第26张图片

此时就发现每个机器都将这10个服务分了下来

docker进阶v-2.0_第27张图片

也可以回滚到最初的一个节点

docker进阶v-2.0_第28张图片

此时整个集群就只有一个服务在运行了

docker进阶v-2.0_第29张图片

动态扩缩容

docker service scale my-nginx=5 #以扩容5个副本为例

docker进阶v-2.0_第30张图片

移除 docker service rm 容器id

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

2.7 概念总结

  • swarm

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

  • node

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

  • service

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

  • task

  • 容器内的命令,细节任务

    docker进阶v-2.0_第31张图片

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

服务副本与全局服务

docker进阶v-2.0_第32张图片

调整service以什么方式运行:

--mode string
Service mode (replicated or global) (default "replicated")
docker service create --mode replicated --name mytom tomcat:7 默认的
docker service create --mode global --name haha alpine ping baidu.com
#场景?日志收集
每一个节点有自己的日志收集器,过滤。把所有日志最终再传给日志中心
服务监控,状态性能。

docker compress 网络

 [root@docker1 ~]#yum -y install bridge-utils  #安装一个网络工具

拓展:网络模式: “PublishMode”: “ingress”
Swarm:
Overlay:
ingress : 特殊的 Overlay 网络! 负载均衡的功能! IPVS VIP!
虽然docker在4台机器上,实际网络是同一个! ingress 网络 ,是一个特殊的 Overlay 网络,将各个集群的网络映射到overlay网络上,这样于外部而言就是一个整体的网络。

docker进阶v-2.0_第33张图片

docker进阶v-2.0_第34张图片

3.0 docker stack

docker-compose 单据部署项目

docker stack部署,集群部署

#单机
docker compose up -d wordpress.yaml
#集群
docker stack deploy wordpress.yaml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bP8tqR6c-1690020237896)(C:/Users/%E5%88%9D%E7%8E%96/AppData/Roaming/Typora/typora-user-images/image-20230722174647838.png)]**

4.0 docker secret

docker进阶v-2.0_第35张图片

5.0 docker config

docker进阶v-2.0_第36张图片

网上找案例跑起来——>学习方法

实验做完及时把实例删除掉,都是按量付费的。

docker进阶v-2.0_第37张图片

6.0 扩展到k8s

6.1 云原生时代

go 语言 必须掌握,Java,go!

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

罗伯特·格瑞史莫(Robert Griesemer),罗布·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及[Mac OS X](https://baike.baidu.com/item/Mac OS X?fromModule=lemma_inlink)平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。

com/item/静态?fromModule=lemma_inlink)强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

罗伯特·格瑞史莫(Robert Griesemer),罗布·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及[Mac OS X](https://baike.baidu.com/item/Mac OS X?fromModule=lemma_inlink)平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。

你可能感兴趣的:(docker,docker,容器,运维)