Docker简介

  • Docker依赖写时复制(copy-on-write),使修改应用程序非常迅速。
  • Docker推荐单个容器只运行一个应用或进程,鼓励面向服务的架构和微服务架构。
  • Docker的核心组件包括:
    • Docker客户端与服务器:Docker是一个C/S架构,客户端连接到服务端(Docker守护进程)执行相关命令,Docker提供CLI和RESTful API两种控制方式。
    • Docker镜像:用户基于镜像来运行容器,镜像是基于联合(Union)文件系统的一种层式结构,由一系列指令一步一步构建出来。
    • Registry:保存用户构建的镜像,类似Maven的中央仓库。
    • 容器:容器基于镜像启动,其中运行应用程序。

容器

  • docker run将运行指定镜像的容器,如果本地不存在该进行则去Docker Hub Registry下载。
  • 运行的容器的主机名就是容器的ID,是一个UUID,在docker命令知道容器ID时可以类似git那样只写前几位。
  • 正常情况下当退出容器时该容器就已经停止了。
  • 容器默认不会打开端口,需要在docker run -p/-P
    • -P可以在宿主机上随机选择一个位于49153~65535中的某个端口与容器内部开放端口映射
    • -p则自己指定映射,完整格式为 宿主ip:宿主port:docker port 其中前两者可以省略,省略则自动分配

镜像

  • Docker镜像是由文件系统叠加而成。
  • 最底层是引导文件系统,即bootfs,启动后会被移到内存中而引导文件系统则会被卸载。
  • 第二层是root文件系统rootfs,是一种或多种操作系统。
  • 后续就是利用联合加载(union mount)技术在root层加载更多的只读文件。

联合加载指一次同时加载多个文件系统,但是外面看起来只能看到一个文件系统。

  • 最顶端是一个可读写文件系统,用于Docker中的应用运行。修改一个文件时这个文件首先会从该读写层下面的只读层复制到读写层,修改后只读版本依然存在,但是被上层的读写层覆盖,这即写诗复制(copy-on-write)
  • Docker镜像中除了顶层的文件系统其他均为只读。

Register

  • 仓库名后加冒号和标签名指定仓库中某一唯一镜像。

ubuntu:12.10

  • 仓库包括用户仓库(user repository)和顶层仓库(top-level repository)
  • 用户仓库命名由用户名和仓库名组成,如suolu/ubuntu
  • 顶层仓库由Docker公司和优质基础镜像厂商管理,用户基于这些镜像进行构建自己的镜像。
  • pull镜像时如果不指定镜像的tag,则默认下载latest标签的镜像。

Dockerfile

  • 一般不推荐用docker commit构建镜像而用Dockerfile的定义文件和docker build命令构建镜像。
  • 保存Dockerfile的目录即构建环境,Docker称为上下文或者构建上下文,Docker会在构建镜像时将构建上下文和该上下文中的文件和目录上传到Docker守护进程。
  • Dockerfile中执行流程如下:
    • Dock而从基础镜像运行一个容器
    • 执行一条指令,对容器做修改
    • 执行类似docker commit的操作,提交一个新的镜像层
    • Docker再基于刚刚提交的镜像层运行一个新容器
    • 执行Dockerfile中的下一条指令
  • 构建时每执行一条指令都会返回一个镜像ID,当构建失败可通过docker run该镜像做调试。
  • 构建过程中之前的镜像层都可以看作缓存,当重新构建时可以从失败命令的前一个镜像层开始,除非build命令设置--no-cache。

格式

  • FROM,指定基础镜像,后续指令均基于该镜像

  • MAINTAINER,指定作者以及邮箱等

  • RUN,该指令会在shell中使用通过 /bin/sh -c 来执行

  • EXPOSE,告诉Docker服务端容器暴露的端口号,供互联系统使用。

  • CMD,指定容器启动时要运行的命令。同一个Dockerfile只认最后一个,且docker run中的命令将覆盖CMD。

CMD ["/bin/bash"]   //默认启动容器打开一个shell
  • ENTRYPOINT,与CMD类似,但是该指令提供的命令不会被docker run覆盖,docker run中命令将作为该指令中的命令的参数。
  • WORKDIR,为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
  • ENV,构建镜像过程中增加环境变量。
  • USER,指定该镜像启动时所使用的用户。
  • VOLUME,向镜像创建容器添加卷。
  • ADD,将构建环境下的文件和目录复制到镜像中。对于源是tar或RUL能自动解析。
  • COPY,与ADD类似,但是其只是简单的复制,不会做其他操作。
  • ONBUILD,添加触发器,其执行时机在于被当作其他基础镜像时,在FROM后马上执行。

《第一本Docker书》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. WordPaster-dedecms5.7整合教程

    1.1. 与dedecms5.7整合 本教程中提到的插件文件可在官网的php-ckeditor3x示例中找到. 示例:http://www.ncmem.com/download/WordPaster2 ...

  2. KindEditor4.x整合教程-Xproer.WordPaster

    1.1. 集成到KindEditor4.x 主要步骤如下: 1.上传插件文件夹 2.上传WordPaster文件夹   3.在引用页面为KindEditor增加插件按钮 <html xmlns= ...

  3. C++标准库addressof的应用

    C++11将addressof作为标准库的一部分,用于取变量和函数等内存地址. 代码示例: #include <memory> #include <stdio.h> void ...

  4. P750 内存插槽

    查看p750内存插槽占用情况 lscfg -vp | grep -p DIMM Memory DIMM: Record Name.................VINI Flag Field.... ...

  5. mui学习

      改变状态栏的颜色 <meta name="apple-mobile-web-app-capable" content="yes"> <me ...

  6. MVC 图片上传 带进度条(转)

    MVC 图片上传小试笔记 form.js 这个插件已经是很有名的,结合MVC的html辅助方法异步上传就很简单了.jQuery Form Plugin :http://www.malsup.com/j ...

  7. python 的 字节码 导入使用

    1. python 模块文件可以通过编译为字节码的形式: 名字:model.py x = def funt(): import model print(model.x) x = "zhang ...

  8. Visual Studio 简单使用常识操作

    Visual Studio 简单使用个人总结   转载请注明来源:www.cnblogs.com/icmzn(后续会持续更新) 可以查看一下链接,官方关于visual studio 2010 的介绍  ...

  9. POJ2779 线性DP 或 杨氏三角 和 钩子公式

    POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...

  10. 关于分页插件PageHelper

    上课的时候学习了分页插件,感受到了它的强大,这里总结如下: 1.首先在spring配置文件中引入依赖jar包: <dependency> <groupId>com.github ...