Docker笔记
Docker
参考资料
官方文档:https://docs.docker.com/docker-for-windows/
【官方文档超级详细】
【发布到仓库,git pull push】
这个笔记 b 站教程:https://www.bilibili.com/video/BV1og4y1q7M4?
前期基础
linux 基本命令
Docker 概述
使用 Docker 后的流程:
开发:建立模型—环境—打包带上环境,即镜像—放到 Docker 仓库
部署:下载 Docker 中的镜像,直接运行即可
Docker 的思想来自于集装箱,集装箱,对环境进行隔离
Docker 通过隔离机制,可以将服务器利用到极致。
#
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
xshell 链接服务器 https://blog.csdn.net/zzy1078689276/article/details/77280814
1 | [root@192 ~]# cd / |
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 的判断
要看到 Complet 再收手!
启动 Docker
1 | systemctl start docker # 代表启动成功 |
1 | docker version |
1 | Client: Docker Engine - Community |
1 | docker run hello-world |
中间一堆是签名信息
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的 |
【视频书签,https://www.bilibili.com/video/BV1og4y1q7M4?p=9】
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 |
常用其他命令
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=11】
后台启动 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 shen;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
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=15】
【20200618 毕竟生产力工具,加油搞,这周一定刷完!!每次关机都要重连,麻烦(╹▽╹)】
在 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 |
py0003null 大佬:
“ES_JAVA_OPTS=-Xms64m -Xmx512m”py0003null 大佬:
引号提前试试
原因是引号!!你没觉得怪怪的嘛
此时查看 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
点 测试链接
点 链接
具名和匿名挂载
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=23】
#
DockerFile 使用来构建 docker 镜像的文件
kas:
没有安装吧?kas:
安装一下就可以了py9001021 曾叙坚:
centos 默认使用 vi 写内容,vim 需要下载py9001021 曾叙坚:
是的,需要下载 vim 才能使用YF:
配置可以改下,字体就很炫酷了都建民:
用 vi 试试都建民:
你没有安装 vim都建民:
yum install vim都建民:
试试这个命令
1 | yum install vim # 编辑文件的,没有装一下 |
安装完之后就可以运行这个命令了
1 | 镜像是一层一层的,脚本是一行一行的 |
想保存并退出
Wesley.:
shift 加 冒号
1 | cat dockerfile1 |
1 | docker images |
启动生成的镜像
在容器内部创建一个文件
查看 Mounts,Source 对应容器外目录,匿名挂载卷
测试一下,在 container volume01 下生成文件
在主机挂载路径下,也同样生成
多个容器数据共享
【视频书签:https://www.bilibili.com/video/BV1og4y1q7M4?p=25】
看一下有啥 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
【视频书签,https://www.bilibili.com/video/BV1og4y1q7M4?p=29】
1 |
|
测试 ENTRYPOINT
run 的时候可以直接加命令
Docker 中许多命令都十分相似,我们需要了解他们的区别,最好的方式就是这样对比测试
实战 Tomcat 镜像
【视频书签,https://www.bilibili.com/video/BV1og4y1q7M4?p=30】