Docker
Docker

参考资料
官方文档:https://docs.docker.com/docker-for-windows/
【官方文档超级详细】
仓库地址:https://hub.docker.com/
【发布到仓库,git pull push】
b站教程:https://www.bilibili.com/video/BV1og4y1q7M4?
【这个教程非常简洁!且深入!基于企业应用场景!推荐!以下笔记都基于该课程】
前期基础
linux基本命令,类似cd,mkdir等
Docker概述
Docker为什么会出现
一款产品,开发和上线两套环境,应用环境配置费时费力,而且容易出问题,尤其
对于机器学习和深度学习的库更是如此,很可能存在版本问题、底层依赖冲突问题
所以发布项目时,不只是一套代码过去,而是代码+环境整体打包过去,所谓开发
即运维,保证系统稳定性,提高部署效率
使用Docker后的流程:
-
开发:建立模型–环境–打包带上环境,即镜像–放到Docker仓库
-
部署:下载Docker中的镜像,直接运行即可
Docker的思想来自于集装箱,集装箱,对环境进行隔离
Docker通过隔离机制,可以将服务器利用到极致。
Docker的历史
2010年,几个搞IT的人,在美国成立一家公司dotCloud,做一些pass的云计服
务,他们将自己的容器化技术命名为Docker,Docker基于Go语言开发,Docker刚
刚诞生的时候,没有引起行业的注意,dotCloud活不下去,然后他们决定开源
2013年,创始人将Docker开源,不开则以,一开惊人,刚开源的时候,每个月都
会更新一个版本,2014年4月9日,Docker 1.0发布
容器vs虚拟机
在容器技术出来之前,用的是虚拟机技术
虚拟机原理示意图

缺点:
- 资源占用多
- 冗余步骤多
- 启动很慢
容器化技术示意图
不是模拟的完整的操作系统

二者对比
比较虚拟机和Docker的不同
| 传统虚拟机 | Docker | |
|---|---|---|
| 虚拟内容 | 硬件+完整的操作系统+软件 | APP+LIB |
| 大小 | 笨重,通常几个G | 轻便几个M或KB |
| 启动速度 | 慢,分钟级 | 快,秒级 |
Docker安装
Docker的基本组成

明确几个概念:
-
镜像(image):docker镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器,类似Python中的Class
-
容器(container):类似Python中通过Class创建的实例,Object;容器可以理解为一个简易的系统
-
仓库(repository):存放镜像的地方,
分为公有仓库和私有仓库
-
Docker Hub:国外的
-
阿里云:配置镜像加速
-
环境准备
我们要有一台服务器,并且可以操作它
- Linux命令基础,购买linux阿里云的服务器
- CentOS 7
- 使用Xshell链接远程服务器
安装xshell
下载CentOS7 https://www.jianshu.com/p/a63f47e096e8
下载VMware 360软件管家下载
VMware配置虚拟机 https://blog.csdn.net/babyxue/article/details/80970526
xshell链接服务器 https://blog.csdn.net/zzy1078689276/article/details/77280814
|
|

用户名
密码
查看ip:vmware里面输入,ip addIPr
https://www.bilibili.com/video/BV1og4y1q7M4?p=6
Centos安装
https://docs.docker.com/engine/install/centos/
卸载旧的版本
|
|

安装基本环境
|
|

设置镜像的仓库
注意!!下载默认用国外的,太慢不要用!
用国内镜像,百度搜索,docker的阿里云镜像地址
|
|

直接复制粘贴就OK了
更新软件包索引
|
|

没有问题的话就是可以用的
安装docker引擎
|
|
注意这里会有几个个y/n的判断


要看到Complet再收手!
启动Docker
|
|
|
|
|
|
|
|

中间一堆是签名信息
run的运行流程图

查看下载的镜像
|
|

卸载Docker
|
|
阿里云镜像加速
支付宝扫码登录,短信验证,确认授权
我有两个问题
-
阿里云镜像加速必须配置嘛?
哎呦我去: 加速快
哎呦我去: 要是翻墙就无所谓了
-
这个阿里云必须要买嘛,买哪个,我看阿里云好多产品
哎呦我去:不需要买
哎呦我去:免费的
哎呦我去:阿里云搜索容器服务
哎呦我去:有一个镜像加速
-
这个地址是哪来的呀
操作


控制台搜索 容器镜像服务

找到加速地址

|
|

底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程在主机上。通过Socket从客户端访问!
DockerServer接受到Docker-Client的指令,

Docker为什么比VM快?
1. Docker有着比虚拟机更少的抽象层
2. docker主要用的是宿主机的内核,vm需要Guest OS

所以说新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导
Docker命令
帮助命令
|
|

镜像命令
docker images
查看所有本地主机上的镜像
|
|

|
|
|
|

docker search
搜索仓库中的镜像,相当于网页搜索

mysql

|
|

|
|

|
|
|
|

docker pull
下载镜像
|
|
|
|
|
|
版本来自于官网,版本库https://hub.docker.com/_/mysql


|
|
此时查看镜像,可以看到新下载的两个

docker rmi
remove images
|
|


容器命令
说明:有了镜像才能创建容器,linux,下载一个centos镜像来测试学习
|
|

新建容器并启动
|
|
进入退出容器
|
|

注意这里面主机名,变成了centos的容器id
这里面就是一个容器,套娃啊
查看运行的容器
|
|
|
|
退出容器
|
|
|
|
删除容器
|
|
|
|
|
|
启动和停止容器的操作
|
|
|
|
常用其他命令
后台启动docker
|
|
|
|
查看日志
|
|

|
|
|
|
|
|
查看容器中进程信息
|
|
查看正在镜像的元数据
|
|
|
|
进入当前正在运行的容器
|
|
从容器内拷贝文件到主机上
|
|
查看内容占用
|
|
小结

|
|


作业练习
部署Nginx

|
|
端口暴露

可以公网访问
找到服务器地址

浏览器输入 192.168.147.132:3344/

|
|
再次刷新网页,服务关闭
思考问题:每次改动nginx配置文件,都需要进入容器内部,十分麻烦,要是可以在容器外部提供一个映射路径,达到在容器外修改文件名,容器内部就可以自动修改?-v 数据卷技术!
部署tomcat

在docker hub上查看版本号和使用方法

官方文档一定要翻烂,超多版本,我的天呐~
官方方法
|
|


ctrl+c退出
|
|

可以看到并没有tomcat,印证阅后即焚模式,容器会删除,镜像不会删除
平时不建议这样搞
正常方法
|
|

|
|

|
|

发现问题
- linux命令少了
- 没有webapps

这是阿里云镜像的原因:默认使用最小镜像,所有不必要的都剔除了,保证最小可运行环境

再次找到结构

在浏览器中输入:http://192.168.147.132:3355/

思考问题:
我们以后部署项目,如果每次都要进入容器是不是身份麻烦?我要是可以在容器外部提供一个映射路径,
webapps,我们在外部放置项目,就自动同步到内部就好了!
部署es+kibana

|
|

|
|

|
|

没成功啊,谁能告诉我为啥!!
|
|
py0003null大佬: “ES_JAVA_OPTS=-Xms64m -Xmx512m”
py0003null大佬: 引号提前试试
原因是引号!!你没觉得怪怪的嘛

此时查看stats,发现内存占用在控制范围内

ctrl + C退出,记得stop

思考:用kibana链接elasticsearch

可视化
- portainer(先用这个)
- Rancher(CI/CD时用)
portainer
Docker图像化界面管理工具,提供一个后台面板供我们操作!
|
|

访问外网8088

用户名
密码

【中午吃饭重连了一下,失败,不知道发生了啥】


【平时不会用这个,好吧,先往下】
Docker镜像
原理
UnionFS 联合文件系统

bootfs:boot file system
rootfs:root file system




Docker镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部,这一层就是我们通常说的容器层,容器层之下的都叫镜像层

commit提交镜像
|
|
|
|

这是一个前台程序

将webapps.dist里面所有的文件拷贝到webapps里面,其中-r必须有,表示目录递归拷贝


|
|

发现新的版本,比之前的大了一些,因为里面记录了我们的改动
如果想保存当前容器的状态,可以通过commit提交,获得一个镜像
好比我们以前学习VM的时候的快照
到这里算是入门了
接下来三个部分是docker的精髓
容器数据卷
什么是容器卷
docker是要将应用和环境打包成一个镜像,这样,数据就不应该在容器中,否则容
器删除,数据就会丢失,这就是删库跑路,故容器之间要有一个数据共享技术
在Docker容器中产生的数据,同步到本地,这就是卷技术,本质上是一个目录挂
载,将容器内的目录挂载到虚拟机上

目的:
-
容器的持久化和同步操作
-
容器间可以数据共享
使用数据卷
方式一:直接使用命令来挂载
|
|

新开一个窗口
|
|

找到挂载信息Mounts

测试

容器停止后,修改主机文件,再启动容器的时候,数据同样改变
双向同步
实战安装mysql
MySQL的数据持久化命令
|
|

链接测试:打开SQLyog

点 测试链接

点 链接

具名和匿名挂载


使用DockerFile来构建docker镜像的文件

kas: 没有安装吧?
kas: 安装一下就可以了
py9001021曾叙坚: centos 默认使用vi写内容,vim需要下载
py9001021曾叙坚: 是的,需要下载vim才能使用
YF: 配置可以改下,字体就很炫酷了
都建民: 用vi 试试
都建民: 你没有安装vim
都建民: yum install vim
都建民: 试试这个命令
|
|

安装完之后就可以运行这个命令了

|
|

想保存并退出
Wesley.: shift 加 冒号

|
|

|
|

启动生成的镜像

在容器内部创建一个文件

查看Mounts,Source对应容器外目录,匿名挂载卷

测试一下,在container volume01下生成文件

在主机挂载路径下,也同样生成
多个容器数据共享

看一下有啥images

启动docker01,用之前建的padaxing/centos 1.0 镜像
|
|

当前这个ctrl+p+q不停止退出

依次启动docker02、docker03
|
|
docker02继承docker01的volumes
可以验证,在docker01下加一个数据,在docker02下也会出现

创建docker03,同样继承docker01
|
|

在docker03的volume01下建立文件,在docker01的volume01下同样也有
即通过–volumes-from 可以实现不同容器间的数据共享
删除docker01,数据还在
|
|

可以看到,删除docker01,进入docker02,数据依然在
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用位置
但是如果持久化到了本地,即使所有容器删除了,本地数据是不会删除的
DockerFile
是用来构建docker镜像的文件,可以理解为命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库 私有/共有)
这个写一个项目时一样的
官方DockerFile示例
看一下官方的DockerFile

可以看到官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方既然可以制作镜像,我们亦可以
DockerFile基础知识
- 每个指令都必须是大写字母
- 按照从上到下顺序执行
- # 表示注释
- 每一个指令都会创建体检一个新的镜像层,并提交

docker是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业的交付标准,必须掌握!
DockerFile命令

DockerFile
|
|
实战构建自己的centos
Docker Hub中99%的镜像都是从FROM scratch开始的
添加centos7的压缩包
|
|
xshell新开一个界面
|
|

回到mydockerfile

|
|

ESC, shif + : 输入wq保存并退出
如果写错了需要修改、
|
|
下面通过这个这个文件创建镜像
|
|

依次执行命令

最终返回Successfully表示成功

|
|

这时可以看到这些功能都有了
可以通过查看docker构建历史

可以看到当前这个镜像是怎么一步一步构建起来的
我们平时拿到一个镜像也可以通过这个方法研究一下他是怎么做的
CMD与ENTRYPOINT
|
|

测试ENTRYPOINT

run的时候可以直接加命令

Docker中许多命令都十分相似,我们需要了解他们的区别,最好的方式就是这样对比测试
区别:
CMD是直接产生了覆盖现象,想要在后面追加命令则需要输入被覆盖的命令加上要追加的命令;而entrypoint可以直接在后面追加命令不会产生覆盖现象
实战Tomcat镜像
|
|
3.运行镜像
|
|
4.启动镜像
|
|

5.访问测试

6.发布项目(由于做了卷挂载,我们直接在本地编写就可以发布了!)
web.xml文件
|
|
index.jsp文件
|
|
发布自己的镜像
1、地址https://hub.docker.com/ 注册自己的账号
2、确定这个账号可以登录
3、在我们的服务器上提交自己的镜像
|
|
4、登录完毕后就可以提交镜像了,就是一步 docker push

|
|
push上去的时候一定记得带上版本号
小结:

Docker网络
理解docker0
1、清空所有环境
测试

三个网络
|
|

|
|
原理
1、我们每启动一个docker容器,docker就会给docker容器分配一个IP,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术
再次测试IP addr

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

|
|
3、我们来测试一下tomcat01 和 tomcat02是否可以ping通!
|
|
绘制一个网络模型图:

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

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

思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可以解决这个问题,可以使用名字来进行访问容器? 这里使用的是--link 技术
|
|
探究inspect:

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

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

|
|
结论:我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
好处:
redis - 不同的集群使用不同的网络,保证集群是安全和健康的
mysql - 不同的集群使用不同的网络,保证集群是安全和健康的
网络连通


|
|

|
|
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!
实战:部署Redis集群
IDEA整合Docker
Docker 整合Docker
Docker Compose
Docker Swarm
各种bug
Xshell链接失败

|
|
注:电脑休眠重启后,机子会断开,要重新在vmware里面输入ip addr 获得ip

修改xshell中的主机接口即可
