一、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. Python数据分析入门与实践 学习

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程.pandas提供了快速,灵活和富有表现力的数据结构 ...

  2. python自动化测试开发利器ulipad最佳实践(可写python测试代码也可编写selenium、Appium等)...

    介绍 UliPad是一个国人开发的python轻量级编辑器,导向和灵活的编程器.它如类浏览器,代码自动完成许多功能,如:HTML查看器,目录浏览器,向导等. 下载与安装 下载地址:https://py ...

  3. 从Webpack源码探究打包流程,萌新也能看懂~

    简介 上一篇讲述了如何理解tapable这个钩子机制,因为这个是webpack程序的灵魂.虽然钩子机制很灵活,而然却变成了我们读懂webpack道路上的阻碍.每当webpack运行起来的时候,我的心态 ...

  4. Java 线程池(ThreadPoolExecutor)原理分析与实际运用

    在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 有关java线程技术文章还可以推荐阅读:< ...

  5. centos6.5宽带拨号上网

    CentOS6以后要安装rp-pppoe这个软件,centos之前的版本是adsl-setup命令安装. (1)查看是否安装 #rpm -qa|grep rp-pppoe 没有内容输出则没安装,若可以 ...

  6. pytho xlrd简介

    xlrd:是什么? xlrd是python的一个模块,主要用来对Excel进行读的操作,相对应的,xlwd就是对Excel进行写的模块了. xlrd中有哪些方法可以用呢? 1.打开Excel文件读取数 ...

  7. vue添加,删除内容

    vue 提交添加内容,点击删除内容 1 html <input v-model="inputValue" /> <button @click="hand ...

  8. 域名系统(DNS)初探

    1.定义 域名:又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称(如mail.cctv.com),用于在数据传输时对计算机的定位标识(有时也指地理位置): 域名系统 ...

  9. 使用Golang + lua实现一个值班机器人

    我们在的项目组呢,有一项工作是,收邮件(很大程度上使用邮件是为了存个底),然后从我们的系统里边查一下相关信息,然后回复个邮件的工作.虽然工作量并不大,但是会把时间切的稀碎.为了拯救我的时间,所以做了一 ...

  10. Redis 到底是单线程还是多线程?我要吊打面试官!

    最近在Java技术栈公众号发布的一篇文章,其中有一道题: Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) 好些粉丝在后台问我:为什么请回,Redis不是单线程吗? 大家注意 ...