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. Java理论学时第一节。课后作业。

    设计思路:用nextFloat()函数将从键盘输入的值分别赋给多个变量,然后直接输出相加结果. 流程图: 源代码: 实验结果:

  2. Async Return Types

    Async methods have three possible return types: Task<TResult>, Task, and void. The Task<TRe ...

  3. 20155326 实验三 敏捷开发与XP实践

    20155326 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器 ...

  4. C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte

    using System.IO; /// <summary> /// WebApi返回图片 /// </summary> public HttpResponseMessage  ...

  5. ZUFE2480: 神奇的序列 2017-05-12 16:45 39人阅读 评论(0) 收藏

    2480: 神奇的序列 时间限制: 4 Sec  内存限制: 256 MB 提交: 31  解决: 15 [提交][状态][讨论版] 题目描述 序列a如下: a[0] = A; a[1] = B; a ...

  6. Navicat连接mysql8.0.1版本出现1251--Client does not support authentication protocol requested by server的解决

    转载自:https://blog.csdn.net/XDMFC/article/details/80263215 好不容易安装好mysql,但又出现了mysql客户端版本太低的问题.根据参考的这篇博客 ...

  7. 《mysql必知必会》学习_第四章_20180724_欢

    P27: select prod_name from products; # select 列 from 表 # 从表products 中检索 名为 prod_name 的列 P28 多个语句一起必须 ...

  8. ASP.NET Web API 框架研究 服务容器 ServicesContainer

    ServicesContainer是一个服务的容器,可以理解为—个轻量级的IoC容器,其维护着一个服务接口类型与服务实例之间的映射关系,可以根据服务接口类型获取对应的服务实例.构成ASP.NET We ...

  9. scikit-FEM-mesh

    # -*- coding: utf-8 -*- """ “Mesh”模块包含了有限元网格的不同类型. See the following implementations: ...

  10. nginx实现unigui群集

    nginx实现unigui群集 在笔者写此文的时候,UNIGUI1.50.x的版本已经发布,其提供的HyperServer已经支持群集. 有网友还专门为此做了群集方面的测试: 从上图可以看出:群集总共 ...