1 docker概述

1.1 docker简介

Docker目标是实现轻量级的操作系统虚拟化解决方案。比虚拟机更轻量级。

虚拟机可以理解成一栋楼里的一个个房间(共享花园基地等),而docker可以理解成房间里的一个个胶囊卧室(共享wifi,厕所),隔离层次比较低。

虚拟机就是硬件的虚拟化,不共享操作系统内核。所以,开启关闭一个虚拟机是很费劲的,就等于重新起一台服务器那么费劲,而docer共享操作系统,一个容器就是个特殊的进程,所以启动很快

1.2 docker组件

1.2.1 客户端:dockerclient 服务端:dockerserver

Docker 是一个客户端、服务端(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker守护进程有时也称为Docker引擎。Docker提供了一个命令行工具docker以及一整套RESTful API来与守护进程交互。

1.2.2 docker镜像

Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变

1.2.3 Registry 仓库

Docker用Registry来保存用户构建的镜像。Register分为公共和私有两种。Docker公司运营的公共Registry叫做Docker Hub。用户可以在Docker Hub注册账户,分享并保持自己的镜像。用户也可以在Docker Hub上保存自己的私有镜像

1.2.4 容器

Docker 可以帮用户构建和部署容器,用户只需把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或者多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或执行阶段。

2 image镜像

2.1 介绍

在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。

由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不 可写,所以镜像是无状态的

2.1.1 父镜像

每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个 镜像是上层镜像的父镜像。

2.1.2 基础镜像

一个没有任何父镜像的镜像,谓之基础镜像。

2.1.3 镜像id

所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 碰撞机率,所以服务器总是返回长ID

2.2 获取镜像

Docker pull:从仓库获取需要的镜像

sudo docker pull ubuntu:12.04

该命令实际上相当于 $ sudo docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像

有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。 从其它仓库下载时需要指定完整的仓库注册服务器地址。例如

sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04

2.3 列出本地镜像

docker images 显示本地已有的镜像

sudo docker images

2.4 创建镜像

2.4.1 使用dockerfile来创建镜像

(1)docker build来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令,新建一个目录和一个 Dockerfile。

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

(2)Dockerfile 中每一条指令都创建镜像的一层,例如:

FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

使用#来注释

FROM 指令告诉 Docker 使用哪个镜像作为基础

接着是维护者的信息

RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件

编写完成 Dockerfile 后可以使用 docker build 来生成镜像。

$ sudo docker build -t="ouruser/sinatra:v2" .

其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。 然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。

*注意一个镜像不能超过 127 层

2.4.2 从本地文件系统导入镜像

要从本地文件系统导入一个镜像,可以使用 openvz(容器虚拟化的先锋技术)的模板来创建: openvz 的模板下载地址为 templates 。

比如,先下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz  |docker import - ubuntu:14.04

2.4.3 上传镜像

用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。

sudo docker push ouruser/sinatra

2.4.4 存出和载入镜像

(1)如果要导出镜像到本地文件,可以使用 docker save 命令

sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

(2)可以使用 docker load 从导出的本地文件中再导入到本地镜像库

sudo docker load --input ubuntu_14.04.tar

(3)移除本地镜像

如果要移除本地的镜像,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器

sudo docker rmi training/sinatra

3 docker容器

3.1 启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

3.1.1 新建并启动

docker run

docker run -t -i ubuntu:14.04 /bin/bash

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开

3.1.2 启动已终止容器

docker start

3.2 守护态运行

更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。

docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

3.3 终止容器

docker stop 来终止一个运行中的容器

docker restart 命令会将一个运行态的容器终止,然后再重新启动它

3.4 进入容器

在使用 -d 参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或 nsenter 工具等

3.4.1 attach命令

docker attach 是Docker自带的命令

$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#

3.4.2 nsenter命令

senter是一个命令行工具,用来进入到进程的linux namespace中

3.5 导出和导入容器

3.5.1 导出容器

如果要导出本地某个容器,可以使用 docker export 命令。这样将导出容器快照到本地文件。

$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar

3.5.2 导入容器快照

docker import 从容器快照文件中再导入为镜像

$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
# 以url形式导入
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0

3.6 删除容器

可以使用 docker rm 来删除一个处于终止状态的容器。 例如

$sudo docker rm  trusting_newton
trusting_newton

4 数据卷volumes

在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)

【总结】docker的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

  10. 微服务与Docker介绍

    什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...

随机推荐

  1. sping aop 源码分析(-)-- 代理对象的创建过程分析

    测试项目已上传到码云,可以下载:https://gitee.com/yangxioahui/aopdemo.git 具体如下: public interface Calc { Integer add( ...

  2. Centos-强制将内存中数据写入磁盘-sync

    sync 强制将内存中数据写入磁盘,以免数据丢失.在linux系统中,修改过的操作并不会立即写入磁盘,而是先写到内存中,通过buffer队列当达到指定时间或者指定大小再一次性写入磁盘,提高IO效率,正 ...

  3. Python-找字典中公共key-zip reduce lambda

    场景实例: 西班牙足球联赛,每轮球员进球统计: 第一轮:{'1':1,'2':4,'5':2,'7':3} 第一轮:{'2':1,'5':4,'6':2,'3':3} 第一轮:{'1':1,'4':4 ...

  4. 商品现货数据不好拿?商品季节性难跟踪?一键解决没烦恼的Python爬虫分享

    更多精彩内容,欢迎关注公众号:数量技术宅.探讨数据分析.量化投资问题,请加技术宅微信:sljsz01 季节性在大宗商品的交易中至关重要 大宗商品交易中,特别是在期货市场,由于商品价格周期的存在,季节性 ...

  5. Java知识系统回顾整理01基础01第一个程序02命令行格式编译和执行Java程序

    一.先看运行效果 在控制台下运行第一个Java程序,可以看到输出了字符串 hello world 二.准备项目目录 通常都会在e: 创建一个project目录 在这个例子里,我们用的是e:/proje ...

  6. 【题解】[LNOI2014]LCA

    题目戳我 \(\text{Solution:}\) 这题的转化思想很巧妙-- 考虑把\(dep\)给拆掉. 首先可以明确的是,每一个\(LCA\)一定在\(root\to z\)的路径上. 考虑一个\ ...

  7. 《New Horizon College English》 (Third Edition) -长篇阅读(Skmming and Scanning)

    <New Horizon College English>(Third Edition) <新视野大学英语>(第三版) 长篇阅读(Skmming and Scanning) 总 ...

  8. ubuntu20 使用命令安装 mongodb

    安装 mongodb sudo apt-get install mongodb -y mongodb 服务管理 # 启动 mongodb 服务 service mongodb start # 关闭 m ...

  9. .NET Core使用FluentEmail发送邮件

    前言 在实际的项目开发中,我们会遇到许多需要通过程序发送邮件的场景,比如异常报警.消息.进度通知等等.一般情况下我们使用原生的SmtpClient类库居多,它能满足我们绝大多数场景.但是使用起来不够简 ...

  10. Hello World -- 第一篇博客 -- 活着的意义

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...