😘B站狂神-docker
笔记来源于
Docker https://www.bilibili.com/video/BV1og4y1q7M4 视频整理
apt-get update
一.Docker入门
1. Docker 为什么会出现


2. Docker的历史


Docker是基于Go语言开发的!开源项目
官方文档Docker文档是超详细的
4. 虚拟化技术和容器化技术对比
4.1. 虚拟化技术的缺点
资源占用十分多
冗余步骤多
启动很慢

4.2. 容器化技术

比较Docker和虚拟化技术的不同
传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
容器内的应用直接运行在宿主机的内部,容器是没有自己的内核的,也没有虚拟硬件,所以轻便
每个容器间是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响
应用更快速的交互和部署
传统:一堆帮助文档,安装程序
Docker: 打包镜像发布测试,一键运行
更便捷的升级和扩缩容
更简的系统运维
更高效的计算资源利用
4.3. DevOps

5. 名词解释
镜像(image)
Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ===> run ===> tomcat01容器, 通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)
容器(container)
Docker利用容器技术,独立运行一个或者一组应用, 通过镜像来创建的
启动,停止,删除,基本命令!
就目前可以把这个容器理解为一个建议的linux系统
仓库(repository)
存放镜像的地方
Docker Hub(默认是国外的)
阿里云,,,都有容器服务(配置镜像加速!)
6. 阿里云镜像加速
登录阿里云服务器,找到
容器镜像服务设置Registry登录密码
找到镜像加速器
配置使用
7、 安装docker
卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。
$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装 Docker Engine-Community
使用 Docker 仓库进行安装
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
设置仓库
安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
使用以下命令来设置稳定的仓库。
使用官方源地址(比较慢)
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
可以选择国内的一些源地址:
阿里云
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华大学源
$ sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:
Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。
要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:
1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。
启动 Docker。
通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。
8. 底层原理
HelloWorld镜像

img 
img

底层原理
Docker Engine是一个客户端-服务器应用程序,具有以下主要组件:
一个服务器,它是一种长期运行的程序,称为守护进程(dockerd命令)
一个REST API,它指定程序可以用来与守护进程对话并指示它做什么的接口。
Docker是一个Client Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户 端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境就是我们所说的集装箱。

img 为什么Docker比Vm快
docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

img
二,Docker基本命令
1. Docker的常用命令

帮助命令
镜像命令
docker images 查看所有本地主机上的镜像
docker search 查找镜像
docker pull 下拉镜像
docker rmi 删除镜像
容器命令
说明: 我们有了镜像才可创建容器,linux,下载一个centos镜像来测试学习
新建容器并启动
列出所有的运行的容器
退出容器
删除容器
启动和停止容器的操作
常用的其他命令
后台启动容器
查看日志
查看容器中进程信息ps
查看镜像的元数据
进入当前正在运行的容器
从容器中拷贝文件到主机
三,Docker部署软件实战
1.Docker部署软件实战
Docker安装Nginx
端口暴露概念

2. Docker安装Tomcat
3. Docker部署es + kibana
可视化
portainer(先用这个)

Rancher(CI/CD再用)
四.Docker原理
特点
Docker奖项都是只读的,当容器启动时, 一个新的可写层被加载到镜像的顶部!
这一层就是我们通常说的容器层, 容器之下的都叫做镜像层

commit镜像
实战测试
五,容器数据卷
1. 容器数据卷
1.1. docker的理解回顾
将应用和环境打包成一个镜像!
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地!
容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面!
**总结: **容器的持久化和同步操作!容器间数据也是可以共享的!
1.2. 使用数据卷
方式一:直接使用命令来挂载 -v

测试文件的同步(在主机上改动,观察容器变化)

再来测试(测试通过)
停止容器
主机上修改文件
启动容器
容器内的数据依旧是同步的!
1.3. 实战:安装MySQL
思考:MySQL的数据持久化的问题!

1.4. 匿名和具名挂载
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载
拓展
六,DockerFile
初始DockerFile
DockerFile就是用来狗之间docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!


这个卷和外部一定有一个同步的目录!


测试一下刚才的文件是否同步到主机上了!
这种方式我们未来使用的十分多, 因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
数据卷容器
多个mysql同步数据!



多个mysql实现数据共享
结论
容器之间配置信息的传递, 数据卷容器的声明周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
DockerFile
dockerFile是用来构建docker镜像的文件!命令参数脚本!
查看婴喜爱官方是怎么做的?


很多官方镜像都像是基础包,很多功能都不具备,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,能我们一样可以!
DockerFile的构建过程
基础知识:
每个保留关键字(指令)都是必须大写字母
执行从上到下顺序执行
#表示注释每个指令都会创建提交一个新的镜像层,并提交!

dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!
Docker镜像逐渐成为企业的交互标准,必须要掌握!
步骤:开发,部署, 运维..... 缺一不可!
DockerFile: 构建文件, 定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
DockerFile指令说明

创建一个自己的centos

我们可以列出本地进行的变更历史

CMD 和ENTRYPOINT区别
测试CMD
测试ENTRYPOINT
七,Dockerfile制作tomcat镜像
Dockerfile制作tomcat镜像
准备镜像文件 tomcat压缩包,jdk的压缩包!

编写Dockerfile文件,官方命名
Dockerfile, build会自动寻找这个文件,就不需要-f指定了!
构建镜像
启动镜像
访问测试
发布项目(由于做了卷挂载, 我们直接在本地编写项目就可以发布了)
在本地编写web.xml和index.jsp进行测试

发现:项目部署成功, 可以直接访问ok!
我们以后开发的步骤:需要掌握Dockerfile的编写! 我们之后的一切都是使用docker进行来发布运行的!

发布自己的镜像到Docker Hub
Docker Hub
地址 注册自己的账号!

在这里插入图片描述 确定这个账号可以登录

在我们的服务器上提交自己的镜像

发布到阿里云镜像服务上
登录阿里云
找到容器镜像服务
创建命名空间

创建容器镜像

点击仓库名称,参考官方文档即可

总结


八,Docker网络
链接Docker0
测试

三个网络
原理
我们没启动一个docker容器, docker就会给docker容器分配一个ip, 我们只要安装了docker,就会有一个网卡 docker0桥接模式,使用的技术是veth-pair技术!
再次测试 ip addr

再启动一个容器测试, 发现又多了一对网卡

我们测试一下tomcat01和tomcat02之间是否可以ping通!

在这里插入图片描述
结论:容器与容器之间是可以相互ping通的!
绘制一个网络模型图

结论:tomcat01和tomcat02是共用的一个路由器,docker0
所有容器不指定网络的情况下,都是docker0路由的,doucker会给我们的容器分配一个默认的可用IP
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0.

Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)
只要容器删除,对应的网桥一对就没有了!

-- link
思考一个场景,我们编写了一个微服务,database url =ip; 项目不重启,数据ip换掉了,我们希望可以处理这个问题,可以按名字来进行访问容器
探究:inspect!

其实这个tomcat03就是在本地配置了tomcat02的配置?
本质探究:--link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 f22ed47ed1be
我们现在玩Docker已经不建议使用--link了!
自定义网络!不使用Docker0!
Docker0的问题:它不支持容器名链接访问!
自定义网络
查看所有的docker网络

网络模式
bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式
none: 不配置网络
host: 和宿主机共享网络
container:容器网络连通!(用的少, 局限很大)
测试
我们自己创建的网络就ok了!

在自己创建的网络里面启动两个容器
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
好处:
redis - 不同的集群使用不同的网络,保证集群时安全和健康的
mysql - 不同的集群使用不同的网络,保证集群时安全和健康的
网络连通

测试打通tomcat01 和mynet



结论:假设要跨网络 操作别人,就要使用docker network connect连通.....!
实战:部署redis

docker搭建redis集群完成!

SpringBoot微服务打包Docker镜像
构建springboot项目
? IDEA2020 Ultimate版本激活方案 亲测有效
打包应用
编写Dockerfile
构建镜像
发布运行!

以后我们使用了Docker之后,给别人交互的就是一个镜像即可!
九,Docker Compose
Docker Compose
简介
Docker
Dockerfile 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:
Define your app’s environment with a
so it can be reproduced anywhere.
Dockerfile保证我们的项目再任何地方可以运行
Define the services that make up your app in
so they can be run together in an isolated environment.
services 什么是服务。
Run
and Compose starts and runs your entire app.
启动项目
作用:批量容器编排
我自己的理解
Compose是Docker官方的开源项目,需要安装!
Dockerfile让程序在任何地方运行。web服务、redis、mysql、nginx... 多个容器。 run
Compose
docker-compose up 100个服务
Compose:重要概念
服务services, 容器、应用(web、redis、mysql...)
项目project。 一组关联的容器
安装
下载
授权

体验(没有测试通过)
地址:https://docs.docker.com/compose/gettingstarted/
python应用。 计数器。redis!
应用app.py
Dockerfile 应用打包为镜像
Docker-compose yaml文件(定义整个服务,需要的环境 web、redis) 完整的上线服务!
启动compose 项目 (docker-compose up)
流程:
创建网络
执行Docker-compose.yaml
启动服务
yaml规则
docker-compose.yaml 核心!
https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples
开源项目:博客
https://docs.docker.com/compose/wordpress/
下载程序、安装数据库、配置....
compose应用 => 一键启动
下载项目(docker-compse.yaml)
如果需要文件。Dockerfile
文件准备齐全,一键启动项目即可

实战:自己编写微服务上线
编写项目微服务
Dockerfile构建镜像
docker-compose.yml编排项目
丢到服务器运行 docker-compose up


总结:
工程、服务、容器
项目 compose: 三层
工程 Project
服务
容器 运行实例! docker k8s 容器
十,Docker Swarm
Docker Swarm
集群
购买服务器
登录阿里云账号,进入控制台,创建实例






到此,我们的服务器购买成功!
四台机器安装docker
和我们单机安装一样
技巧: xshell直接同步操作,省时间!
Swarm集群搭建

在这里插入图片描述
初始化结点docker swarm init
docker swarm join 加入一个结点!
把后面的结点都搭建进去

100台!
生成主节点init
加入(管理者,worker)
Raft协议
双主双从:假设一个结点挂了!其他结点是否可以用!
Raft协议:保证大多数结点存活才可以使用,只要>1, 集群至少大于3台!
实验:
1、将docker1机器停止。宕机!双主,另外一个结点也不能使用了!

可以将其他结点离开
docker swarm leave

worker就是工作的,管理结点操作! 3台结点设置为了管理结点。
十分简单:集群,可用! 3个主节点。 > 1台管理结点存活!
Raft协议:保证大多数结点存活,才可以使用,高可用!
体会
弹性、扩缩容!集群!
以后告别 docker run!
docker-compose up!启动一个项目。单机!
集群: swarm docker-service
k8s service
容器 => 服务!
容器 => 服务! => 副本!
redis => 10个副本!(同时开启10个redis容器)
体验:创建服务、动态扩容服务、动态更新服务

灰度发布(金丝雀发布)

在这里插入图片描述
查看服务

动态扩缩容
移出!docker service rm
docker swarm其实并不难
只要会搭建集群、会启动服务、动态管理容器就可以了!
概念的总结
swarm
集群的管理和编号,docker可以初始化一个swarm集群,其他结点可以加入。(管理,工作者)
Node
就是一个docker结点,多个结点就组成了一个网络集群(管理、工作者)
Service
任务,可以在管理结点或者工作结点来运行。核心,用户访问。
Task
容器内的命令、细节任务!

service

命令 -> 管理 -> api -> 调度 -> 工作结点(创建Task容器维护创建!)
服务副本和全局服务

调整service以什么方式运行
拓展: 网络模式 "PublishMode":"ingress"
Swarm:
Overlay:
ingress:特殊的Overlay网络!负载均衡的功能!ipvs vip!
其他命令学习方式
Docker Stack
Docker Secret
Docker Config
拓展到k8s
云原生时代
Go语言!必须掌握! Java Go!
并发语言!
B语言,C语言的创始人。Unix创始人VB
go指针
这有帮助吗?