一. Docker基础篇:
Docker的三大要素:
- 镜像-只读的原本 类比java的类
- 容器-一个个在Docker中跑的程序(nginx, redis等) 类比java类创建出的实例
- 仓库-可以把打包好的镜像上传到DockerHub, 运维可以直接下载(国外的网站太慢, 用不到)
虚拟机和Docker的区别:
CentOS/ Ubuntu基础镜像仅170MB 而虚拟机的镜像系统要4个G(同时模拟了硬件)
docker(容器虚拟化技术) | 虚拟机技术 | |
---|---|---|
操作系统 | 与宿主机共享, docker引擎调节 | 宿主机os上运行虚拟机os |
储存大小 | 镜像小, 便于传输(Mb) | 镜像大(G) |
运行性能 | 几乎无额外性能损失 | 操作系统消耗额外cpu |
移植性 | 轻便灵活 | 与虚拟化技术耦合 |
硬件亲和性 | 面向软件开发 | 面向运维 |
部署速度 | 秒级 | 分钟级(10s+) |
开发/运维: DevOps 一次构建, 随处运行
Docker的架构图:
从远程Registry拉取到本地, 就是一个Images镜像, 这个镜像的实例就是一个Containers容器
镜像就是模板, 容器就是这个镜像的实例. 一个镜像可以创建很多容器. 可以把容器看成一个简易版的Linux环境, 和运行在其中的应用程序. 仓库是集中存放镜像文件的场所
Repository仓库和Registry仓库注册服务器是有区别的.
仓库注册服务器上往往存放着多个仓库, 每个仓库中又包含了多个镜像, 每个镜像有不同的标签(tag)
仓库又分为公开仓库和私有仓库. 两种形式, 世界最大公开仓库DockerHub, 国内的公开仓库 阿里云.
Docker安装的官方文档: 安装就看他
https://docs.docker.com/install/linux/docker-ce/centos/
阿里云镜像加速的配置文档: 配置阿里仓库就看他
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
专属加速地址
|
Docker指令之helloworld:
|
流程图:
docker命令:
|
tomcat为什么这么大呢?
|
|
|
使用镜像centos以后台模式启动一个容器:
$ docker run -d centos
然后
$ docker ps -a 进行查看, 会发现容器已经退出
因为:
Docker容器后台运行, 就必须有一个前台进程, 否则会自动退出
这个是Docker的机制问题:
比如nginx 我们配置启动服务只需要启动响应的service即可, 例如service nginx start
但是这样 nginx为后台进程模式运行, 就会docker前台没有对应运行的应用.
这样容器后台一启动, 就会立即自杀, 因为觉得自己没事做了.
所以: 要将后台运行的程序以前台进程的形式运行
docker run -it centos /bin/bash 后面的 bin/bash的作用
首先,docker run -it centos 的意思是,为centos这个镜像创建一个容器, -i和-t这两个参数的作用是,为该docker创建一个伪终端,这样就可以进入到容器的交互模式?(也就是直接进入到容器里面)后面的/bin/bash的作用是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中。这个/bin/bash就表示启动容器后启动bash。
|
|
比如:
|
|
二. Docker高级篇
- Docker镜像是什么:
轻量级的可执行的独立软件包, 用来打包软件运行环境和基于运行环境开发的软件, 它包含某个软件所需的所有内容, 包括代码, 运行时库, 环境变量, 和配置文件
UnionFS联合文件系统: 分层的轻量级高性能的文件系统.
Docker镜像加载原理: docker镜像实际上由一层层的文件系统组成,
bootfs: 主要包含bootloader和kernel, bootloader主要是引导加载kernel, linux刚启动时会加载bootfs文件系统, 在docker镜像的最底层是bootfs, 当boot加载完成后整个内核就都在内存中了, 此时内存的使用权已由bootfs转交给内核, 此时系统也会卸载bootfs
rootfs: 在bootfs上, 包含的就是典型linux系统中的/dev, /proc, /bin等标准目录和文档, rootfs就是不同操作系统的发行版, 比如ubuntu centos等.
tomcat 比centos还大的原因
docker采用分层镜像的原因: 共享资源
多个镜像都从相同的base镜像构建而来, 这样每个镜像的每一层都可被共享.
docker的镜像都是只读的, 当容器启动时, 一个新的可写层被加载到 镜像的顶部, 这一层 通常被成为容器层, 容器层之下的都叫镜像层.
- docker 的commit
我们对一个源镜像, 进行了自定义的修改和配置后, 得到了我们专属的容器, 那么怎么把这个容器分享给他人, 使得他人启动这个容器和我们启动这个容器达到一样的效果呢?
这里就可以用commit命令.
|
- docker容器数据卷:
当我们关闭容器后, 容器内的数据就没了, 那么我们关闭容器时, 需要对容器内产生的数据进行持久化. 这个要持久的数据就是数据卷.
k将运用与运行的环境打包形成容器运行, 运行可以伴随着容器, 但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据
Docker容器产生数据, 如果不通过docker commit生成新的镜像, 使得数据作为镜像一部分保存下来, 那么当容器删除后, 数据也就没了.
为了能保存数据在docker中, 我们使用卷
目的就是: 持久化和数据共享
@1: 可以使用命令行
|
@2. 通过dockerfile
dockerfile是对镜像 源码级 的描述,