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. WordPaster2产品介绍

    更新WordParser组件,集成ImagePaster组件功能.完善粘贴剪帖板图片,粘贴电脑图片文件,粘贴word,粘贴excel逻辑. 大幅度优化和精简js代码,js代码行数从1932行减少到97 ...

  2. 阿里云oss怎么上传文件夹

    最近公司在做工程项目,实现文件夹云存储上传 网上找了很久,发现很多项目都存在一些问题,但还是让我找到了一个成熟的项目. 工程: 对项目的文件夹云存储上传功能做出分析,找出文件夹上传的原理,对文件夹的云 ...

  3. HtmlControls和Webcontrols命名空间的区别

    HtmlControls(以下简称HC)是对大部分Html标签的复制,这些标签原来是什么样,经过服务器解释后的HC就是什么样.要使用HC,只需要在相应的html标签内加上runat=“server”属 ...

  4. 20145232 《Java程序设计》课程总结

    学期总结 实验报告链接汇总 实验一 Java开发环境的熟悉 实验二 Java面向对象程序设计 实验三 敏捷开发与XP实践 实验四 Andoid开发基础 实验五 Java网络编程 代码托管链接 :Jav ...

  5. How to transfer developer profile to one mac to another mac

    Export developer profile from old mac. In the Xcode Organizer, select your team in the Teams section ...

  6. Surface 2装机必备软件指南

    新买的Surface到货了还不知道有什么用,每天就用来划划点点?有点太浪费了吧!跟哥走,哥给你推荐几款Surface 2装机必备的软件~应用商店,走起~ 初次使用看过来:Win8宝典 如果你是一个像我 ...

  7. C语言注意点汇总

    计算机的一切源头都是0和1,其中0:断电,1:有电. 计算机语言发展史:机器语言--汇编语言--高级语言.机器语言0.1直接对硬件起作用.汇编语言,给机器语言添加了一些符号,使其更易于让人理解.记忆. ...

  8. hdu 1698 Just a Hook 【线段树+lazy】

    题目 写了一天的线段树,这道题主要说明一下sum是赋值的,不是累加的,并且在push_down的时候lazy也是赋值的.因可能对懒标记的理解还不是很透彻吧. #include <iostream ...

  9. Delphi XE3写DLL,用Delphi7调用,报错!

    http://bbs.csdn.net/topics/390870532 用delphi xe3写的DLL,delphi7调用,参数都是PAnsiChar,DLL里的函数接收delphi7传的入参,没 ...

  10. 使用nohup后台执行ftp传输命令

    因为有的时候会需要长时间传输文件,所以想用nohup 结合shell脚本一起使用,就不用一直在电脑面前了 . nohup 用法: nohup command & 然后就会出现 对应的 pid ...