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来启动,而是集成了containerdrunc等多个组件。

 

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制作。

  1. 利用commit方式制作docker镜像,此步骤和git提交代码类似。

使用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 //容器使用主机的网络

containername_or_id //使用其他容器的网络,共享ipport等网络资源

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

修改本地镜像的repositorytag名称(镜像重命名):

命令: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_wexxxxx-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方式制作容器的方法后面会在下一篇讲解

posted @ 2020-03-26 10:07  小黄鱼的圈子  阅读(485)  评论(0编辑  收藏  举报