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. js 数组操作函数有:push,pop,join,shift,unshift,slice,splice,concat

    (1)push 和 pop 这两个函数都是对数组从尾部进行压入或弹出操作.push(arg1,arg2,...)可以每次压入一个或多个元素,并返回更新后的数组长度.注意如果参数也是数组的话,则是将全部 ...

  2. 【20171101】the first day in a new company

    英文差的要命还飙英文,擦嘞!!! 就是想记录下 点滴 如下配图: | | | V 手动配图这是图!!!

  3. android 按照拼音模糊查询中如何把字符转换成拼音

    http://files.cnblogs.com/liaolandemengxiang/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9.rar 首先转换成的 ...

  4. robotium测试创建java文件和junit文件区别

    两者本身差别不大,只是构造方式不同,我一般都用java文件来创建. 1.当有源码测试时,创建junit测试文件 ActivityInstrumentationTestCase2<T>T可以 ...

  5. AngularJS 杂项知识点

    1.要用ngChange要同时使用ngModel,下拉选择获取当前选中值. 2.打包代替动态加载(js文件) requirejs真正的价值在于模块化,不是动态加载,angularjs本身有模块化机制, ...

  6. css中box-sizing简单说明(标准盒式模型和怪异盒式模型)

    今天写程序做布局的时候,遇到关于css中盒式模型的问题,百度了下这属性的解释,脑大啊,文字太绕看不懂.怎么办,于是自己动动手写了段程序测试,嗯,不错,一看效果就恍然大明白了.这里简单说明下,也可能说得 ...

  7. Java学习--数组与方法

    1. public class MethodDemo01{ public static void main(String args[]){ printInfo() ; // 调用printInfo() ...

  8. nfs 客户端挂住

    mount -t nfs -o soft,retry=1,timeo=10,intr 192.168.9.27:/mnt/vm /mnt/nfs-vm 可以让NFS client在连接不到NFS se ...

  9. [LintCode] Permutations

    http://www.lintcode.com/en/problem/permutations/# Given a list of numbers, return all possible permu ...

  10. Centos7 下一键安装JDK和Maven

    JDK 1. 使用yum search java|grep jdk 查看jdk版本 2. 选择版本安装 yum install java-1.7.0-openjdk,如果用1.8的,只用改版本号即可. ...