Docker之commit制作镜像
一、docker是什么?
Docker是一个为开发人员和系统管理员提供分布式应用程序的开放平台。它是一个开源的容器引擎,基于Go语言并遵从Apche2.0协议开源。
功能:Docker可以让开发者打包他们的应用和依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,从而实现虚拟化。
机制:沙箱机制,相互之间不会有接口,更重要的是容器开销极低。
下面的图片比较了Docker和传统虚拟化方式的不同之处,可见容器技术直接复用本地主机的操作系统,和宿主机共享硬件资源及操作系统,实现资源的动态分布,而传统方式则是在硬件层面实现。
二、为什么要用docker?
ü 更快速的交付和部署
ü 更高效的虚拟化
ü 更轻松的迁移和扩展
ü 更简单的管理
特性 |
容器 |
虚拟机 |
启动 |
秒级 |
分钟级 |
硬盘使用 |
一般为MB |
一般为GB |
性能 |
接近原生 |
弱于 |
系统支持量 |
上千个 |
几十个 |
docker 需要的资源更少, docker 在操作系统级别进行虚拟化, docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化
docker 更轻量, docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。
三、Docker的三个基本概念
镜像(Image)
容器(Container)
仓库(Repository
镜像:它是一个只读的模板,不包含任何动态数据,其内容在构建之后也不会改变。
多个只读层重叠在一起,除了最下面一层,其它层都会有一个指针指向下一层。统一文件系统 (union file system) 技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
容器:和镜像类似,唯一的区别在于容器的最上面那一层是可读写的。可理解为容器=镜像+可读写层
仓库:集中存放镜像文件的场所。通常,一个仓库包含同一个软件不同版本的镜像,而标签常用语对应软件的各个版本。
四、Docker架构概览
上图展示了Docker客户端、服务端和Docker仓库,默认情况下Docker会在Docker中央仓库中寻找镜像,这种利用仓库管理镜像的设计概念类似于Git。
Docker采用C/S架构,Docker deamon作为服务器接收来自客户端请求,并处理这些请求,比如创建容器、管理镜像。目前,Docker容器运行已经不是简单的通过Docker deamon来启动,而是集成了containerd和runc等多个组件。
v Containerd:是一个简单的守护进程,管理shim,向Docker Engine提供接口。使用UnixSocket通信,协议是grpc。
v Shim:管理一个容器
v RunC:运行一个容器,直接与容器多以来的cgroups/kernel等进行交互,负责容器所需环境。
工作流程:
dockerd拿到镜像后,通过grpc通知docker-containerd进程启动容器,docker-containerd收到dockerd启动容器请求之后,再启动docker-containerd-shim进程,docker-containerd-shim进程启动后,按照runtime准备运行环境,再启动docker-runc进程。docker-runc进程打开容器的配置文件,找到rootfs位置,根据配置文件启动相应进程。
五、Docker镜像的制作
制作镜像主要有两种方式,第一种使用commit命令,第二种使用dockerfile制作。
- 利用commit方式制作docker镜像,此步骤和git提交代码类似。
u 使用docker pull命令从仓库获取所需要的镜像到本地
命令:docker pull [options] <dir_name>.<realm_name>:<tag>
Options说明:
-a 拉取所有tagged镜像
--disable-content-trust 忽略镜像的校验,默认开启
如:$docker pull ubuntu:12.04或者 docker pull docker hub xxx:v1
u 使用该镜像创建一个容器
命令:docker run [options] image [command]
实例:docker run --privileged --name=huangyu --net=host -it -v ~:/share docker hub xxx:v1
冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
Options说明:
--privileged 容器内的root拥有真正的root权限
--name 容器名称
--net=xxx 容器网络设置,xxx可以有以下几种形式
bridge //使用docker deamon指定的网桥
host //容器使用主机的网络
container:name_or_id //使用其他容器的网络,共享ip和port等网络资源
none //容器使用自己的网络,类似bridge,但是不进行配置
-i //打开STDIN,用于控制台交互
-t //分配一个伪终端或终端绑定到容器上
-v //给容器挂在存储卷,挂在到容器的某个目录
其他参数详解请参考:https://www.cnblogs.com/yfalcon/p/9044246.html
u 使用上述容器安装需要的应用
使用apt命令安装应用程序和环境,如安装python软件,apt install python在安装主软件的同时优先进行依赖包的安装否则无法安装主软件,可使用:apt -f install xxx
commit容器创建镜像到本地
命令:docker commit [options] container ID <repository>:<tag>
Options说明:
-a //提交的镜像作者
-m //提交时的说明文字
-p //在commit时,将容器暂停
docker commit -a “huangyu” -m “web_ci_test” 123456789Ac huangyu_web:20191230
u 修改本地镜像的repository和tag名称(镜像重命名):
命令:docker tag <image id> <new repository>:<new tag>
实例:docker tag 123456789Ac xxxxx-xxx-docker.xxx.com.cn/webci/huangyu_web:20191230
xxxxx-xxx-docker为推送到网络上的文件名
xxx.com.cn为网络网址
webci/huangyu_we为xxxxx-xxx-docker下新建文件夹名称
将本地文件push到制品库
命令:docker pull [options] <dir_name>.<realm_name>:tag
Options说明:
--disable-content-trust:忽略镜像的校验,默认开启
实例:docker push xxxxx-xxx-docker.xxx.com.cn/webci/huangyu_web:20191230
u Docker常用命令
docker images 显示本地已有的所有镜像
docker ps 显示在运行状态的容器
docker ps -a可查看所有容器,包括终止状态的
docker ps -a|grep huangyu 可筛选容器名称以huangyu开头的容器
docker logs 获取容器的输出信息
docker start 直接将一个已经终止的容器启动运行
docker stop 终止一个运行中的容器
docker restart 将一个运行态的容器终止,然后再重新启动
docker save导出镜像到本地文件
docker export导出本地某个容器
docker import从容器快照文件中再导入为镜像
docker load从导出的本地文件中再导入到本地镜像库
docker rmi删除镜像
docker rm 删除容器
注意:在删除镜像之前,先用docker rm删除依赖于这个镜像的所有容器
dockerfile方式制作容器的方法后面会在下一篇讲解