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

  1. 利用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方式制作容器的方法后面会在下一篇讲解

Docker之commit制作镜像的更多相关文章

  1. WIN7安装Docker Toolbox、制作镜像并发到阿里云

    一.安装Docker Toolbox,并配置国内源加速 WIndows7不支持Hyper-v,所以只能采用Docker Toolbox的方式使用Docker.传送门:http://mirrors.al ...

  2. Docker 0x05: Dockerfile制作镜像

    目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...

  3. Docker之Alpine制作镜像且上传至阿里云

    目的: Alpine制作jdk镜像 Alpine制作jre镜像(瘦身) Docker镜像上传至阿里云 Alpine制作jdk镜像 alpine Linux简介 Alpine Linux是一个轻型Lin ...

  4. docker commit 制作镜像

    docker commit -m="commit jdk" --author="gutianlangyu" ae56f6cad215 gutianlangyu/ ...

  5. Docker:手动制作镜像 [五]

    一.制作docker镜像的步骤 1.启动容器安装软件服务 2.将安装好服务的容器commit提交为镜像 3:.启动新容器来测试新提交的镜像 二.制作支持ssh远程登录的docker镜像 1.启动容器安 ...

  6. Docker笔记——Docker安装及制作镜像

    1 Docker安装本文中Docker运行环境为Ubuntu 14.04.1 LTS 3.13.0-32-generic x64参考:https://docs.docker.com/v1.11/eng ...

  7. Docker --Dockerfile(制作镜像)

    Dockerfile Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像 Dockerfile 常用指令 FROM 作用:指定基础镜像,Docke ...

  8. Docker学习笔记-CentOS7镜像

    前言: 环境:centos7.5 64 位 正文: 第一步:下载centos7镜像 docker pull centos 第二步:建立centos7的容器 sudo docker run --priv ...

  9. Docker上定制CentOS7镜像

    原文:Docker上定制CentOS7镜像 前言: 环境:centos7.5 64 位 正文: 第一步:下载centos7镜像 docker pull centos 第二步:建立centos7的容器 ...

随机推荐

  1. Inno Setup 升级时不再询问用户安装路径

    UsePreviousAppDir Description: When this directive is yes, the default, at startup Setup will look i ...

  2. java中Runnable和Callable的区别

    文章目录 运行机制 返回值的不同 Exception处理 java中Runnable和Callable的区别 在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是ja ...

  3. Swoole 实战:MySQL 查询器的实现(协程连接池版)

    目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...

  4. 记一次痛苦的Django报错调试经历:

    开发的程序在我的本地mac上,ubuntu上,以及树莓派上都成功实现了迁移和运行,但是当准备将运行好好地程序迁移到阿里云的服务器上的mysql数据库上时,出现了非常多的幺蛾子的问题. 具体如下: 初始 ...

  5. pynlpir.License过期问题解决方案

    报错信息:pynlpir.LicenseError: Your license appears to have expired. Try running "pynlpir update&qu ...

  6. 1745 Divisibility

    Divisibility Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14084 Accepted: 4989 Descrip ...

  7. 商汤提出解偶检测中分类和定位分支的新方法TSD,COCO 51.2mAP | CVPR 2020

    目前很多研究表明目标检测中的分类分支和定位分支存在较大的偏差,论文从sibling head改造入手,跳出常规的优化方向,提出TSD方法解决混合任务带来的内在冲突,从主干的proposal中学习不同的 ...

  8. 也谈解决Combobox绑定数据后取值出现System.Data.DataRowView的问题

    刚才遇到一个怪现象:同一个窗口,同一张表,通过第一个Combobox值的改变,动态绑定第二个Combobox,结果出现一个怪现象,第一个Combobox有的值改变第二个Combobox一切正常,有几个 ...

  9. Java——Java实现生产者消费者

    1.生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括"生产者"."消费者"."仓库"和"产品" ...

  10. LateX的简单字体设置(颜色,居中,大小等)

    \(\color{red}{Ⅰ.文本单行居中}\) $$\text{我是蒟蒻}$$ \[\text{我是蒟蒻} \] \(\color{Black}{Ⅱ.设置字体颜色}\) $$\color{Purp ...