Docker企业

官网:https://www.docker.com/
文档地址: https://docs.docker.com/ (Docker 官网文档超级详细)
仓库地址:https://hub.docker.com/

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

参考博客:https://blog.csdn.net/weixin_46703850/article/details/122807621

1、Docker Compose

1.1、Compose 概念

Docker Compose 作用

Docker
我们之前使用Docker的时候,我们写完项目以后要定义一个DockerFile文件, 然后通过这个文件再使用build命令去生成一个镜像,然后使用 run命令去执行,这些全都是手动操作而且是单个容器!如果每一个容器都这么去弄是非常麻烦的。现在我们想要的效果是怎样的呢?
比如说我们的微服务,假设公司里面有100个微服务,那就得启动100个项目,这100个微服务之间可能还存在依赖关系,全部手动启动非常非常的麻烦!那怎样去处理这种情况呢?
那可以使用Docker Compose来轻松高效的管理容器,说白了它就是可以让我们定义运行多个容器,只需要把它们定义在一个文件里面就好了!

官方介绍

网址:https://docs.docker.com/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 aDockerfileso it can be reproduced anywhere.
Dockerfile保证我们的项目在任何地方可以运行
2.Define the services that make up your app indocker-compose.yml so they can be run together in an isolated environment.
service什么是服务。
docker-compose.yml这个文件怎么写!
3.Run docker compose upand the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using Compose standalone(docker-compose binary).
启动项目

作用:批量容器编排

英文翻译
Compose是一个用于定义和运行多容器Docker应用程序的工具。

使用Compose,您可以使用yaml文件配置应用程序的服务。然后,使用一个命令,从配置中创建并启动所有服务

使用Compose基本上是一个三步过程:

1.使用 定义应用的环境,以便可以在任何位置重现它。Dockerfile
2.定义构成应用的服务,以便它们可以在隔离的环境中一起运行。docker-compose.yml
3.运行,Docker 撰写命令将启动并运行整个应用。您也可以使用 docker-compose 二进制文件运行

自己的理解

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

Dockerfile让程序在任何地方运行,比如我们现在有个web服务比如社区网站,那这个网站需要连接redis、mysql、nginx…这个地方就会涉及到多个容器,那多个容器每一个都去用Dockerfile启动会非常非常的麻烦,所以compose而生!

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,一组关联的容器。博客,web,mysql,wp

1.2、安装 Compose

Install Docker Compose | Docker Documentation
安装网址:https://docs.docker.com/compose/install/

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` > /usr/local/bin/docker-compose

在这里插入图片描述
2、授权

sudo chmod +x /usr/local/bin/docker-compose

在这里插入图片描述

3、安装成功
docker-compose version
在这里插入图片描述

1.3、Compose 快速开始

快速开始,参考官方地址:https://docs.docker.com/compose/gettingstarted/
python应用,计数器,redis

1.应用app.py

为项目创建文件夹

mkdir composetest
cd 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)

在这里插入图片描述
创建requirements.txt文件

flask
redis

在这里插入图片描述

2.Dockerfile应用打包为镜像

创建Dockerfile文件

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.Docker-compose yaml文件(定义整个服务,需要的环境,web,redis)完整的上线服务!

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

截止目前,一共有4个文件
在这里插入图片描述
4.启动compose项目(docker-compose up命令)

docker-compose up的执行流程:
1.创建网络
2.执行Docker-compose yaml
3.启动服务器

Docker-compose yaml
Creating composetest_web_1 … done
Creating composetest_redis_1 … done
在这里插入图片描述
这里有两个东西:
1.文件名 composetest
2.服务,一个web,一个redis

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

自动默认规则?
28
docker image在这里插入图片描述docker service查看,报错了,现在我们没有用集群是没有服务这个概念的!
在这里插入图片描述
默认的服务名是:文件名_服务器_num

未来会有多个服务器,是一个集群,那我们的项目它可能跑在A服务器上,也有可能跑在B服务器上,甚至这两个服务器上都跑,那这个时候_num就代表副本数量,比如说未来我们要启动一个服务,redis服务,单机部署肯定不行,假如说我们有4个服务器,那redis服务上肯定有4个副本,甚至10个副本,集群状态,服务都不可能只有一个运行实例。真实的项目,一定是弹性的、10 HA 高并发,未来使用k8s的话,里面使用kubectl ,service 里面就会有负载均衡

3.网络规则
在这里插入图片描述
比如我们要运行10个服务,那这10个服务最终把它打包成一个完整项目,那这个项目上线之后,对内的网络,是非常麻烦的,这些规则,那compose自动帮我们维护了一个网络,那项目中的内容都在同一个网络下面,就可以通过域名访问,不然的话只能通过ip

查看一下这个网络
在这里插入图片描述
在这里插入图片描述
如果在同一个网络下,我们可以直接通过域名进行访问

停止命令

docker-compose down
Ctrl+C

在这里插入图片描述
以前都是单个docker run启动容器
现在可以通过docker-compose编写yaml配置文件、可以通过compose一键启动所有服务,停止

Docker小结

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

1.4、Yaml配置文件规则

docker-compose.yaml 核心
对着文档学习:https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-file-structure-and-examples

​ yaml配置文件共三层:

# 3层

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

依赖
在这里插入图片描述

在这里插入图片描述
部署

副本
在这里插入图片描述

学习,要掌握规律!
只要多写,多看compose.yaml配置,可以从
1.官方文档查看:https://docs.docker.com/compose/compose-file/#specifying-durations
2.开源项目

1.5、使用Compose一键部署博客

使用Compose一键部署WordPress博客(推荐一个开源博客系统,FutureCMS)

Quickstart: Compose and WordPress | Docker Documentation,地址:https://docs.docker.com/samples/wordpress/

下载程序、安装数据库、配置…

compose应用 => 一键启动

1.下载项目,新建文件夹,编写docker-compse.yaml
在这里插入图片描述
在这里插入图片描述
2.如果需要文件。Dockerfile
3.文件准备齐全,一键启动项目即可
在这里插入图片描述
4.测试,通过IP前台启动
在这里插入图片描述
在这里插入图片描述
我们之前是docker -d 后台启动,现在也可以后台启动docker-compose up -d
在这里插入图片描述
一切都很简单!掌握:linux,docker,k8s,docker基础,原理,网络,服务,集群,错误排查,日志查看

1.6、实战:自己编写微服务上线

创建项目

新建一个普通的springboot项目
在这里插入图片描述

1.HelloController

package com.example.compose.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Autowired
    StringRedisTemplate redisTemplate;

    @GetMapping("/hello")
    public String hello(){
        // 自增
        Long  view = redisTemplate.opsForValue().increment("views");
        return "hello,this views is: "+view;
    }
}

2.application.properties配置文件

# 应用名称
spring.application.name=Compose
# 应用服务 WEB 访问端口
server.port=8080
spring.redis.host=redis

3.编写Dockerfile,用于构建镜像

FROM java:8

COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

4.docker-compose.yaml 编排项目

version: "3.8"
services:
  kuangapp:
    build: .
    image: kuangapp
    depends_on:
      - redis
    ports:
      - "8080:8080"
  redis:
    image: "redis:alpine"

5.maven打包
在这里插入图片描述
6.上传到服务器
在这里插入图片描述
注意打的包应该不只是几kb,如果只有几kb,那一定是错了,可以从网上搜索一下解决方案!
在这里插入图片描述
7.启动项目
在这里插入图片描述
在这里插入图片描述
8.访问项目
在这里插入图片描述

FTP安装与配置

1.关闭防火墙

#关闭防火墙
$ systemctl stop firewalld.service   

#禁止防火墙开机启动
$ systemctl  disable firewalld.service     

2.安装

#安装
yum install -y vsftpd

#设置开机启动
systemctl enable vsftpd.service

#启动
systemctl start vsftpd.service

#停止
systemctl stop vsftpd.service

#查看状态
systemctl status vsftpd.service

3.运行

失败原因是关闭防火墙之后docker需要重启,执行以下命令重启docker即可:

[root@192 myapp]# service docker restart
Redirecting to /bin/systemctl restart docker.service

4.访问测试成功

[root@192 ~]# curl http://127.0.0.1:8080/hello
hello,this views is: 6

在这里插入图片描述

重新构建

假设项目要重新部署或者打包,可以使用docker-compose up --build,进行重新构建

在这里插入图片描述

小结

未来公司项目只要有docker-compose文件,你就要研究一下它是怎样做的,按照这个规则,启动编排容器!如果公司有docker-compose就可以直接启动,网上的开源项目有docker-compose,那也是一键搞定!

总结:工程、服务、容器
项目最终会有一个完整的工程,那工程可以会有多个服务,那服务最终跑起来后就是一个个容器!

项目 compose: 三层

  • 工程 Project
  • 服务
  • 容器 运行实例! 现在这个容器是docker直接管理的,我们以后会用 k8s 管理,k8s会把docker容器做进一步的封装,k8s就是直接封装这个容器,全部容器化组,用pods去管理

2、Docker Swarm

参考文档地址:https://docs.docker.com/engine/swarm/

2.1、Docker Swarm

集群环境准备

购买服务器(4台服务器2G)

登录阿里云账号,进入控制台,创建实例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到此,我们的服务器购买成功!1主3从!

在这里插入图片描述

四台机器安装docker

和我们单机安装一样
技巧: xshell直接同步操作,省时间!
在这里插入图片描述
在一个窗口输入的,4个窗口都会同步!

yum安装gcc环境
在这里插入图片描述
···具体步骤参考Docker安装

Swarm集群搭建

工作机制:https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/
在这里插入图片描述
在这里插入图片描述

$ docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm 

Commands:
  ca          # Display and rotate the root CA
  init        # 初始化一个Swarm
  join        # 加入一个集群作为一个节点 和/或 管理者
  join-token  # 管理生成的令牌
  leave       # 离开swarm
  unlock      # 解锁swarm
  unlock-key  # 解锁密钥管理
  update      # 更新swarm
docker swarm init --help

在这里插入图片描述
地址有公网有私网,公网是对外的,私网是对内的,私网是不需要流量

获取自己的IP地址
在这里插入图片描述
在这里插入图片描述
命令:

初始化结点docker swarm init
docker swarm join加入一个结点!
在这里插入图片描述

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

把docker2加到docker1里面了!
在这里插入图片描述
把后面的结点都搭建进去,在主节点上查看一下:
在这里插入图片描述
双主双从:这是不科学的,一般我们至少要有3个主结点才可以

现在给你100台服务器搭成集群!
1.生成主节点init
2.加入(管理者,worker)

Raft协议

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

实验

1、将docker1机器停止。宕机!双主,另外一个主结点也不能使用了!
在这里插入图片描述
docker4也是个主节点,发现也不能用了
在这里插入图片描述
现在重启docker1,发现虽然docker1还是主节点,但它已经不是老大了!
在这里插入图片描述
现在把docker3离开这个集群,使用docker swarm leave可以将其他结点离开
在这里插入图片描述
发现
在这里插入图片描述
现在生成一个令牌,让docker3以管理员身份再加进来了!
在这里插入图片描述
在这里插入图片描述
在docker2中也使用这个令牌,发现是不可以的,因为它是个工作节点,不能使用管理命令的
在这里插入图片描述
worker就是工作的,管理命令只能在管理结点操作!现在我们将3台结点设置为了管理结点。

现在我们将docker1和docker3这两个主节点停掉,发现docker4这个主节点也不可用了!
在这里插入图片描述
十分简单:集群要保证可用!至少要有 3个主节点,而且随时要保证 > 1台管理结点存活!否则不能使用

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

体会

弹性、扩缩容!集群!这些在k8s中都非常多,用了swarm后,我们现在所有东西都是集群操作,那他就应该具备弹性,扩缩容!

我们现在可以自己做一个项目体验一下,以后告别 docker run!容器是玩具,脱离了编排没有任何意义,所以现在最基本的要启动一个项目使用docker-compose up启动一个项目。docker-compose 它也是单机的!那我们在集群中,所有东西都到了swarm里面,它是一个集群节点,这个时候我们所有的东西都是docker-service,在未来的k8s里面,它也是一个个service,service下面就是一个个pods,pods里面是容器组,里面有非常非常多的小容器。未来单个的容器变成企业中的服务。

容器 => 服务!

容器 => 服务! => 副本!

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

比如我们的redis,我在一个机子上我启动3份,对于我来说其实就是启动了3个容器,对于它单个来说,它是独立的,但是对于集群来说,它要保证高可用,比如我们web连接redis,redis不可能只有1台,比如现在我们有3台,它分布在不同的机器上,有了swarm以后,web通过redis去连redis,不通过IP,它屏蔽了底层的差异,之后redis动态的扩展就非常方便了!

体验:创建服务、动态扩容服务、动态更新服务
在这里插入图片描述
灰度发布(金丝雀发布)
在这里插入图片描述

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

查看服务,只有一个副本
在这里插入图片描述
发现我在docker1上面启动了Nginx在docker3上有了,这其实是随机分布的
在这里插入图片描述
现在压力来了,访问人数突然增多,那我们就得多开几个服务,创建3个副本给my-nginx这个服务

动态扩缩容
在这里插入图片描述
现在只要在集群里面,无论访问哪个IP都能访问到Nginx

比如这个docker1没有Nginx
在这里插入图片描述
我们访问docker1的IP,依然能够访问到Nginx
在这里插入图片描述
只要是一个服务,它可以在集群中任意节点都可以访问,服务可以有多个副本动态扩缩容实现高可用!

弹性,扩缩容非常重要!

动态扩缩容(scale 命令同 updata)

在这里插入图片描述

移除!docker service rm

在这里插入图片描述
docker swarm其实并不难,只要会搭建集群、会启动服务、动态管理容器就可以了!
k8s更难,功能更多,副本,服务器,多容器!swarm相当于简单版的k8s

概念的总结

swarm

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

Node

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

Service

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

Task

容器内的命令、细节任务!
在这里插入图片描述
在docker-compose.yaml文件中部署了replicas副本,那对于我们这边就会生成4个任务,虽然说我们这是一个大的服务,比如就叫他web,Wordpress,那他这里面肯定有4个副本,这每个副本跑在哪个镜像上,跑在哪个服务器上,不是我们关心的,这是docker swarm集群节点随机分配的,

service

在这里插入图片描述
一个service可以去创建多个副本,其实每一个副本就是一个task任务,这个任务里面就跑着我们最终运行的容器

内部原理
在这里插入图片描述
docker会收到命令,那这个命令通过API,会进入一个scheduler调度,调度他自己有自己内部的一个算法,他会去调度该哪个节点去把他运行起来

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

服务副本和全局服务

在这里插入图片描述
我们刚刚所有的东西它是随机分配的,我们的工作节点和我们的管理节点都可以跑项目,但是我们项目可以分为在全局跑的还有只能在副本上跑的,比如说我的工作节点我不想让它跑东西,我可以让它只以副本的方式启动!如下:

调整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 www.baidu.com
#场景?日志收集
每一个节点有自己的日志收集器,过滤,把所有日志最终再传给日志中心
服务监控,状态性能

拓展: 网络模式 “PublishMode”:“ingress”

Swarm中有3个重要网络:

  • ingress:默认为这个
  • Overlay:我们可以把多个服务,在集群里面,它跨机器我们也可以把它加进来
  • ingress:特殊的Overlay网络!具有负载均衡的功能!会自动帮我们做负载均衡,核心ipvs vip!

在这里插入图片描述
在这里插入图片描述
这个ingress网络里面其实就是绑定了我们4个IP,所以说我们现在是在同一个网络下的,虽然docker在4台机器上甚至多台,实际网络是同一个!使用的是虚拟IP技术,使用的是ingress网络,ingress网络是一个特殊的Overlay网络

比如现在我们有4台服务器,这4台服务器它IP是不同的,每个服务里都有docker,现在我们把它搭建成一个集群,如果他们还是在单独内部的话,它的网络是ping不通的,所以这个时候就有一层网络叫Overlay网络,让他们能够ping通,我们把所有节点加到Overlay网络的之后,它们就可以互相ping通里面的东西了!集群网络就变成了一个整体了!

其他命令学习方式

2.2、Docker Stack

在这里插入图片描述
docker-compose 单机部署项目
docker stack 集群部署

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

# docker-compose 文件
version: '3.4'
services:
	mongo:
		image: mongo
		restart: always
		networks:
			- mongo_network
		deploy:
			restart policy:
				condition: on-failure
			replicas: 2
	mongo-express:
			image: mongo-express
			restart: always
			networks:
				- mongo_network
			ports:
				- target: 8081
				published: 80
				protocol: tcp
				mode: ingress
			environment:
				ME_CONFIG_MONGODB_SERVER: mongo
				ME CONFIG MONGODB PORT: 27017
			deploy:
				restart policy:
					condition: on-failure
				replicas: 1
networks:
	mongo_network:
		external: true

2.3、Docker Secret

安全!配置密码!证书!
在这里插入图片描述
Docker Config 配置
在这里插入图片描述

2.4、拓展到k8s

云原生时代

10台机器以上优先选择k8s

Go语言!必须掌握! Java Go!

Docker是Go开发的,K8S也是Go开发的!Etcd也是Go的项目!Go是天生的并发语言

B语言,C语言的创始人。Unix创始人VB

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

go指针!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值