Docker
Docker是在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等,极大的简化了容器的创建和维护。使得docker技术比虚拟机更为轻便、快捷。
与传统虚拟机比较
- 传统虚拟机:虚拟出一套硬件,在其上运行一个完整的操作系统,在该系统上再运行应用程序
- docker:容器内的应用程序直接运行于宿主的内核中,容器内没有自己的内核,而且没有进行硬件虚拟;每个容器内都有一个属于自己的文件系统,互不影响。
Docker优势
- 更高效的利用系统资源:内核级别的虚拟化,可以在一个物理机上运行很多的容器实例
- 更快速的启动速度
- 一致的运行环境
- 持续交付和部署
- 更轻松地迁移
- 更轻松的维护和扩展
Docker概念
- 镜像(Image):docker镜像就像一个模板,可以通过这个模板来创建容器服务。通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中)
- 容器(Container):Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。具有启动、停止、删除等一些基本命令。可以把容器理解为一个简易的linux系统。
- 仓库(Repository):仓库就是存放镜像的地方。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eGnI3ogZ-1602224518932)(C:/Users/free/Desktop/面试/interviewmd/assets/post/others/docker.png)]
底层原理
Docker是怎么工作的?
Docker 是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问。
Docker相对于VM有更少的抽象层。他利用的是宿主机的内核,VM需要guest OS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VdSEsPG1-1602224518935)(C:/Users/free/Desktop/面试/interviewmd/assets/post/others/vmdocker.png)]
常用命令
帮助命令
docker version
docker info // 显示docker系统信息,包括镜像和容器的数量
docker 命令 --help // 帮助命令
镜像命令
docker images // 查看主机上的所有镜像
docker search image-name // 搜索远程仓库镜像
docker pull image-name[:tag] // 下载远程镜像
docker rmi -f image-name/image-id // 删除指定镜像
docker rmi -f $(docker images -aq) // 删除所有镜像
容器命令
docker pull image-name // 新建容器
docker run [可选参数] image // 启动一个全新的容器
docker run -d --name nginx01 -p 3344:80 nginx
-d // 后台运行
--name // 名字
-p // 外部端口映射,使用主机的3344端口映射到容器内的80端口
docker ps // 列出运行中的容器
-a // 列出所有运行过的容器
exit // 退出容器
ctrl+p+q // 不停止容器退出
docker attach container-id // 进入一个正在运行的容器终端,不会开启一个新的终端
docker exec -it container-id /bin/bash // 进入容器并开启一个新的终端
docker start 容器id // 启动一个停止的容器
docker restart 容器id // 重启
docker stop 容器id // 停止当前容器
docker kill 容器id // 强制停止当前容器
其他命令
docker run -d centos // 后台启动
// docker容器使用后台运行,就必须有一个前台进程,如果没有应用,docker就会自动停止
docker logs // 查看日志
-tf // 显示日志
--tail number // 要显示的日志条数
docker inspect container-id // 查看容器信息
docker cp container-id:path dstpath
Docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、运行时库、环境变量和配置文件等。
所有的应用,直接打包docker镜像,可以直接跑起来。
Docker镜像加载原理
- UnionFS(联合文件系统)
- 一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)
- Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
- 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录。
- Docker镜像加载原理
- Docker的镜像实际上有一层一层的文件系统组成,这种层级的文件系统UnionFS。
- bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与典型的Linux/Unix系统是一样的,包含bootloader和kernel。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统会卸载bootfs。
- rootfs(root file system),在bootfs之上,包含的就是典型linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如ubuntu、centos等等。
- 对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
- Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层被称为容器层,容器之下的都叫做镜像层。
容器数据卷
容器之间的一个数据共享的技术,docker容器产生的数据,同步到本地。
目录的挂载,将我们容器内的目录,挂载到linux上面。
容器数据卷技术是为了容器的持久化和同步操作。容器间数据也是可以共享的。
使用数据卷
-
创建容器时直接使用命令来挂载
-v
-
docker run -it -v 主机目录:容器内目录
具名和匿名挂载
- 匿名挂载:只指定容器内路径
- 具名挂载:
-v 卷名:容器内路径
- 指定路径挂载:
-v 宿主机路径:容器内路径
- 指定权限:
-v :容器内路径:ro/rw
,ro表示只读,rw表示可读可写,是针对容器内的文件 - ro表示只读,容器内无权限进行修改,只能在宿主机操作。
Dockerfile
dockerfile就是用来构建docker镜像的构建文件,命令脚本。
通过这个脚本可以生成一个镜像。镜像是一层一层的,那么脚本也是一个一个的命令,一个命令就是一层。
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "--end--"
CMD /bin/bash
// 每一句就是一层
可以使用docker inspect container-id
查看卷挂载的目录
基础知识
- 每个保留关键字(指令)都必须是大写字母
- 执行从上到下顺序执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交。
Dockerfile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件。
Dockerfile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAIN # 镜像是谁写的,一般为名字+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 向里面添加内容,比如tomcat等
WORKDIR # 镜像的工作目录
VOLUME # 挂载卷目录
EXPOSE # 指定暴露的端口
RUN # 开始运行
CMD # 指定启动的时候要运行的命令,只有最后一个会生效,可以被替代,不能追加命令
ENTRYPOINT # 指定启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承dockerfile时候会运行这个指令。是一个触发指令
COPY # 类似于COPY,将文件拷贝到镜像
ENV # 构建的时候设置环境变量
例子:
FROM centos
# 设置维护者名称
MAINTAINER elbow95
# 设置环境变量
ENV MYPATH /usr/local
# 设置工作目录
WORKDIR $MYPATH
# 安装软件
RUN yum -y install vim
RUN yum -y install net-tools
#