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. C++编译器详解(三)函数调用的区别:_cdecl以及_stdcall

    1._stdcall是Pascal程序的缺省调用方式,通常用于Win32 API中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上&qu ...

  2. java 定时执行

    Timer和TimerTask CountDownTimer (android)

  3. sql中的CONCAT函数运用实例1

    1 第一个例子 select a.*,b.name as repayment_type_value,c.name as status_value, d.product_name, CONCAT(a.d ...

  4. 【repost】DOM CRUD

    //DOM 的 CRUD // c 创建create // 1.直接往body中动态的添加标签(可以是任意类型)document.write('helloWorld');document.write( ...

  5. Hdu1695 GCD 2017-06-27 22:19 30人阅读 评论(0) 收藏

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  6. Codeforces812C Sagheer and Nubian Market 2017-06-02 20:39 153人阅读 评论(0) 收藏

    C. Sagheer and Nubian Market time limit per test 2 seconds memory limit per test 256 megabytes input ...

  7. sqoop快速入门

    转自http://www.aboutyun.com/thread-22549-1-1.html

  8. 2.启动MySql服务

    windows10下启动mysql服务出现服务名无效的原因及解决方法 问题原因:mysql服务没有安装. 解决办法: 在 mysql bin目录下 以管理员的权限 执行 mysqld -install ...

  9. 有人在用fastReport作报表时处理过字体自动缩小的问题吗,怎么做

    有人在用fastReport作报表时处理过字体自动缩小的问题吗,怎么做  我来答   浏览 49 次 1个回答 #吃瓜大会# Angelababy演技被吐槽, 你觉得她的演技怎么样? 最佳答案 热心 ...

  10. DevExpress GridControl 关于使用CardView的一点小结

    最近项目里需要显示商品的一系列图片,打算用CardView来显示,由于第一次使用,遇到许多问题,发现网上这方面的资源很少,所以把自己的一点点实际经验小结一下,供自己和大家以后参考. 1.选择CardV ...