Docker
参考资料
官方文档:https://docs.docker.com/docker-for-windows/
【官方文档超级详细】
【发布到仓库,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
1 | [root@192 ~]# cd / |
用户名
密码
查看ip:vmware里面输入,ip addIPr
视频书签,p602:20
https://www.bilibili.com/video/BV1og4y1q7M4?p=6
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的 |
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 |
Docker镜像
原理
UnionFS 联合文件系统
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
Docker 中使用的 AUFS(Advanced Multi-Layered Unification Filesystem)就是一种联合文件系统。 AUFS
支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS
里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 目前支持的联合文件系统包括 OverlayFS
, AUFS
, Btrfs
, VFS
, ZFS
和 Device Mapper
。
各 Linux 发行版 Docker 推荐使用的存储驱动如下表。
Linux 发行版 | Docker 推荐使用的存储驱动 |
---|---|
Docker on Ubuntu | overlay2 (16.04 +) |
Docker on Debian | overlay2 (Debian Stretch), aufs , devicemapper |
Docker on CentOS | overlay2 |
Docker on Fedora | overlay2 |
在可能的情况下,推荐 使用 overlay2
存储驱动,overlay2
是目前 Docker 默认的存储驱动,以前则是 aufs
。你可以通过配置来使用以上提到的其他类型的存储驱动。
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的精髓