Docker
参考资料
官方文档:https://docs.docker.com/docker-for-windows/
【官方文档超级详细】
【发布到仓库,git pull push】
前期基础
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
VMware配置虚拟机 https://blog.csdn.net/babyxue/article/details/80970526
xshell链接服务器 https://blog.csdn.net/zzy1078689276/article/details/77280814
1 | [root@192 ~]# cd / |
查看ip:vmware里面输入,ip addr
Centos安装
https://docs.docker.com/engine/install/centos/
卸载旧的版本
1 | # 卸载旧的版本 |
安装基本环境
1 | # 安装基本的安装包 |
设置镜像的仓库
注意!!下载默认用国外的,太慢不要用!
用国内镜像,百度搜索,docker的阿里云镜像地址
1 | # 不要用官网默认这个! |
直接复制粘贴就OK了
更像软件包索引
1 | yum makecache fast |
没有问题的话就是可以用的
安装docker引擎
1 | yum install docker-ce docker-ce-cli containerd.io # docker-ce 社区版 ee 企业版 |
注意这里会有几个个y/n的判断,直接同意即可,或者安装直接加-y
参数。
启动Docker
1 | systemctl start docker # 代表启动成功 |
1 | docker version |
1 | Client: Docker Engine - Community |
1 | docker run hello-world |
中间一堆是签名信息(sha256加密)
run的运行流程图
查看下载的镜像
1 | docker images |
卸载Docker
1 | # 卸载依赖 |
阿里云镜像加速
支付宝扫码登录,短信验证,确认授权
我有两个问题
阿里云镜像加速必须配置嘛?
加速快
要是翻墙就无所谓了
这个阿里云必须要买嘛,买哪个,我看阿里云好多产品
不需要买
免费的
阿里云搜索容器服务
有一个镜像加速
- 这个地址是哪来的呀
控制台搜索 容器镜像服务
找到加速地址
1 | sudo mkdir -p /etc/docker # 创建一个陌路 |
Docker是真么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程在主机上。通过Socket从客户端访问!
DockerServer接受到Docker-Client的指令,
Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- docker主要用的是宿主机的内核,vm需要Guest OS
所以说新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导
Docker命令
帮助命令
1 | docker version # 显示docker的基本信息 |
镜像命令
docker images
查看所有本地主机上的镜像
1 | [root@192 ~]# docker images |
1 | # 解释 |
1 | --all , -a Show all images (default hides intermediate images) # 显示所有 |
docker search
搜索仓库中的镜像,相当于网页搜索
mysql
1 | docker search mysql |
1 | docker search --help |
1 | # 解释 |
1 | docker search mysql --filter=STARS=3000 # 搜索出Stars大于3000的 |
docker pull
下载镜像
1 | docker pull mysql # 下载mysql镜像,default tag,默认最新版latest |
1 | [root@192 ~]# sudo systemctl daemon-reload |
1 | # 指定版本下载 |
版本来自于官网,版本库https://hub.docker.com/_/mysql
1 | docker images |
此时查看镜像,可以看到新下载的两个
docker rmi
remove images
1 | # 删除一个 可以通过名称 也可以指定id -f表示删除所有 |
容器命令
说明:有了镜像才能创建容器,linux,下载一个centos镜像来测试学习
1 | docker pull centos |
新建容器并启动
1 | docker run [可选参数] image |
进入退出容器
1 | # 进入 |
注意这里面主机名,编程了centos的id
这里面就是一个容器,套娃啊
查看运行的容器
1 | # 查看正在运行的容器 |
1 | [root@192 ~]# docker ps |
退出容器
1 | 容器停止退出 |
1 | [root@192 ~]# docker run -it centos /bin/bash |
删除容器
1 | 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f |
1 | [root@192 ~]# docker ps -a |
1 | [root@192 ~]# docker ps -aq # 所有容器id |
启动和停止容器的操作
1 | docker start |
1 | [root@192 ~]# docker run -it centos /bin/bash |
常用其他命令
后台启动docker
1 | docker run -d 镜像名 |
1 | Last login: Wed Jun 17 19:47:35 2020 |
查看日志
1 | docker logs |
1 | [root@192 ~]# docker logs --help |
1 | whiel true;do echo shenzai;sleep |
1 | 运行一个 |
查看正在运行的容器信息
1 | [root@192 ~]# docker inspect cb6d7fbc3f27 |
1 | 停止正在疯狂输出的那个容器 |
进入当前正在运行的容器
1 | 我们通常容器都是使用后台方式运行的e |
从容器内拷贝文件到主机上
1 | 运行 |
查看内容占用
1 | docker stats |
小结
1 | [root@192 home]# docker --help |
部署实践
部署Nginx
1 | 官网搜索nginx,可以看到帮助文档 |
端口暴露
可以公网访问
找到服务器地址
浏览器输入 192.168.147.132:3344/
1 | [root@192 home]# docker ps |
再次刷新网页,服务关闭
思考问题:每次改动nginx配置文件,都需要进入容器内部,十分麻烦,要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?-v 数据卷技术!
部署tomcat
在docker hub上查看版本号和使用方法
官方文档一定要翻烂,超多版本,我的天呐~
官方方法
1 | docker run -it --rm tomcat:9.0 |
ctrl+c退出
1 | docker ps -a |
可以看到并没有tomcat,印证阅后即焚模式,容器会删除,镜像不会删除
平时不建议这样搞
正常方法
1 | docker pull tomcat:9.0 # 之前下过了,应该不用下了,这里老师讲错了 |
1 | 启动运行,应该加上版本号 |
1 | 进入容器 |
发现问题
- linux命令少了
- 没有webapps
这是阿里云镜像的原因:默认使用最小镜像,所有不必要的都剔除了,保证最小可运行环境
再次找到结构
在浏览器中输入:http://192.168.147.132:3355/
思考问题:我们以后部署项目,如果每次都要进入容器是不是身份麻烦?我要是可以在容器外部提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了!
docker容器 tomcat+网站
docker mysql
部署es+kibana
1 | es 暴露的端口很多 |
1 | 先感觉stop一下 |
1 | 通过 -e 限制内存 |
没成功啊,SEI能告诉我为啥!!
1 | docker run -d --name elasticsearch02 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2 |
百度答案:
- 设置启动内存更小:
ES_JAVA_OPTS=-Xms64m -Xmx512m
- 引号提前试试
原因是引号!!你没觉得怪怪的嘛
此时查看stats,发现内存占用在控制范围内
ctrl + C退出,记得stop
思考:用kibana链接elasticsearch
可视化
- portainer(先用这个)
- Rancher(CI/CD时用)
portainer
Docker图像化界面管理工具,提供一个后台面板供我们操作!
1 | docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker --privileged=true portainer/portainer |
访问外网8088
用户名
密码
【中午吃饭重连了一下,失败,不知道发生了啥】
【平时不会用这个,好吧,先往下】
Docker镜像
原理
UnionFS 联合文件系统
bootfs:boot file system
rootfs:root file system
Docker镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部,这一层就是我们通常说的容器层,容器层之下的都叫镜像层
commit提交镜像
1 | docker commit # 提交容器成为一个新的副本 |
1 | docker images |
这是一个前台程序
将webapps.dist里面所有的文件拷贝到webapps里面,其中-r必须有,表示目录递归拷贝
1 | docker commit -a="paidaxing" -m="add webapps app" 当前容器的id tomcat02:1.0 |
发现新的版本,比之前的大了一些,因为里面记录了我们的改动
如果想保存当前容器的状态,可以通过commit提交,获得一个镜像
好比我们以前学习VM的时候的快照
到这里算是入门了
接下来三个部分是docker的精髓
容器数据卷
什么是容器卷
docker是要将应用和环境打包成一个镜像
这样,数据就不应该在容器中,否则容器删除,数据就会丢失,这就是删库跑路
故容器之间要有一个数据共享技术
在Docker容器中产生的数据,同步到本地,这就是卷技术
本质上是一个目录挂载,将容器内的目录挂载到虚拟机上
目的:容器的持久化和同步操作
容器间可以数据共享
使用数据卷
方式一:直接使用命令来挂载
1 | docker run -it -v -p |
新开一个窗口
1 | docker inspect 容器id |
找到挂载信息Mounts
测试
容器停止后,修改主机文件,再启动容器的时候,数据同样改变
双向同步
实战安装mysql
MySQL的数据持久化命令
1 | docker search mysql |
链接测试:打开SQLyog
点 测试链接
点 链接
具名和匿名挂载
DockerFile使用来构建docker镜像的文件
1 | yum install vim # 编辑文件的,没有装一下 |
安装完之后就可以运行这个命令了
1 | 镜像是一层一层的,脚本是一行一行的 |
想保存并退出
Wesley.:
shift 加 冒号
1 | cat dockerfile1 |
1 | docker images |
启动生成的镜像
在容器内部创建一个文件
查看Mounts,Source对应容器外目录,匿名挂载卷
测试一下,在container volume01下生成文件
在主机挂载路径下,也同样生成
多个容器数据共享
看一下有啥images
启动docker01,用之前建的padaxing/centos 1.0 镜像
1 | docker run -it --name docker01 padaxing/centos:1.0 # 1.0必须写 |
当前这个ctrl+p+q不停止退出
依次启动docker02、docker03
1 | docker run -it --name docker02 --volumes-from docker01 padaxing/centos:1.0 |
docker02继承docker01的volumes
可以验证,在docker01下加一个数据,在docker02下也会出现
创建docker03,同样继承docker01
1 | docker run -it --name docker03 --volumes-from docker01 padaxing/centos:1.0 |
在docker03的volume01下建立文件,在docker01的volume01下同样也有
即通过–volumes-from 可以实现不同容器间的数据共享
删除docker01,数据还在
1 | docker rm -f |
可以看到,删除docker01,进入docker02,数据依然在
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用位置
但是如果持久化到了本地,即使所有容器删除了,本地数据是不会删除的
DockerFile
是用来构建docker镜像的文件,可以理解为命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push 发布镜像(DockerHub、阿里云镜像仓库 私有/共有)
这个写一个项目时一样的
官方DockerFile示例
看一下官方的DockerFile
可以看到官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像
官方既然可以制作镜像,我们亦可以
DockerFile基础知识
- 每个指令都必须是大写字母
- 按照从上到下顺序执行
- #表示注释
- 每一个指令都会创建体检一个新的镜像层,并提交
docker是面向开发的,我们以后要发布项目,做镜像,就要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业的交付标准,必须掌握!
DockerFile命令
1 | FROM # 基础镜像 比如centos |
实战构建自己的centos
Docker Hub中99%的镜像都是从FROM scratch开始的
添加centos7的压缩包
1 | 创建一个自己的centos |
xshell新开一个界面
1 | 官方默认centos |
回到mydockerfile
1 | 下面给官方centos加上自定义的内容 |
ESC, shif + : 输入wq保存并退出
如果写错了需要修改、
1 | vim mydockerfile-centos |
下面通过这个这个文件创建镜像
1 | docker build -f dockerfile-centos -t mycentos:0.1 . |
依次执行命令
最终返回Successfully表示成功
1 | docker run -it mycentos:0.1 # 版本号必须写,不然他会去找最新的 |
这时可以看到这些功能都有了
可以通过查看docker构建历史
可以看到当前这个镜像是怎么一步一步构建起来的
我们平时拿到一个镜像也可以通过这个方法研究一下他是怎么做的
CMD与ENTRYPOINT
1 | FROM centos |
测试ENTRYPOINT
run的时候可以直接加命令
Docker中许多命令都十分相似,我们需要了解他们的区别,最好的方式就是这样对比测试