一、Docker 系统架构

守护进程

负责容器的创建、运行和监控,还负责镜像的构建和存储。docker demon 命令可启动 Docker 守护进程。

Docker 客户端

通过http与 docker 守护进程通信。与docker守护进程通信的 API 有非常清晰的定义和文档,开发者也可以利用 API 直接和守护进程通信,而不通过 docker 客户端。

Docker 镜像仓库

默认的寄存服务为 Docker Hub, 负责镜像的存储和发布。根据实际需要,我们也可以构建和运营自己的docker服务。

底层技术

cgroups

负责管理容器使用的资源,如内存和CPU;

namespaces

负责容器之间的隔离;确保系统的其他部分与容器的文件系统、主机名、用户、网络和进程都是分开的。

UFS (union file system)

负责存储容器的镜像层。

周边技术

swarm

docker 集群解决方案

compose

负责构建和运行多个docker容器所组成的应用程序的工具。主要用于开发和测试环境。

machine

非Linux系统(Windows、MacOS)上的GUI,用于运行和管理docker容器;

docker trusted registry

管理和存储docker镜像。

网络连接

overlay

服务发现

consul、skyDNS

服务编排及集群管理

kubernetes,swarm等等

专门用于托管容器的操作系统

虽然docker在大部分的Linux发行版本上 都运行的很好,但还是出现了一些新的发行版项目,他们只考虑需要运行容器的环境,希望做出体积小二容易管理的发行版,尤其是针对数据中心或集群的使用场景。

二、镜像是如何生成的

创建镜像的主要方法是通过 Dockerfiledocker build

构建环境的上下文

命令 docker build需要 Dockerfilebuild context。 build context 是一组本地文件和目录,他可以被 Dockerfile 的 ADDCOPY 指令引用,通常以目录路径的形式指定。

如果提供的URL以http开头,它会被假定位直接指向 dockerfile ,这样做没什么用,因为该 Dockerfile没有与任何上下文关联。

也可以将git仓库作为构建环境上下文。这种情况下,docker客户端会将Git仓库colone到本地,然后传递给守护进程作为构建环境上下文。

还可以通过stdin输入构建环境的上下文,方法是在需要输入上下文的地方使用 -参数。该输入可以是一个归档文件,支持 tar.gz / xz / bzip2 格式。

从构建环境的上下文中排除不必要的文件,可以使用.dockerignore文件,该文件类似 .gitignore

镜像

Dockerfile 中的每个指令执行后都会生成一个镜像层,这个镜像层可以用来启动容器。一个新的镜像层的建立,使用上一个镜像层启动容器,然后执行dockerfile中的指令,再把它保存为一个新镜像。

当dockerfile 执行成功后,中间的那些容器会被删掉,除非提供 --rm=false 参数。

由于每个指令的最终结果都只是个静态的镜像,本质上是一个文件系统以及一些元数据,因此即使指令中的持久进程,最终都会被停掉。比如你在一条指令中开启一个数据库服务的进程,但到了下一条指令,或启动容器的时候,它就已经不存在了。

如果你需要在启动容器的时候同事运行一个进程或服务,他必须从ENTRYPOINTCMD 指令中启动。

Docker 为了加快镜像构建的速度,会将每一个镜像层缓存下来。 Docker的缓存特性能大大提高工作效率。

基础镜像

基于镜像分层的特点,当我们需要一个环境时,无需重头开始去构建一个镜像。最理想的做法是完全不用创建镜像,直接使用某个现有的镜像,然后把配置文件和数据挂在上去即可。对于常用软件,比如数据库、web服务器,这是非常可行的。一般情况下使用官方镜像比自己创建一个镜像好得多,因为其他人已经找到使得该软件以最佳方式运行在容器中的方法。

如果你需要使用一个基础镜像以运行应用程序,那么应该先检查一下,应用程序所使用的编程语言或框架是否已提供了官方的镜像。如果只是需要一个小而完整的Linux 发行版本,可以选择 alpine,他的大小仅仅5MB多一点,但仍提供了一个包管理器,可以轻松安装大量应用和工具。

Dockerfile

Exec 与 Shell 的对比

一些指令(RUNCMDENTRYPOINT)能够接受 shell 和 exec 这两种格式。exec 格式需要用到一个JSON数组,如:["executable","param1","param2"],其中第一个元素是可执行文件,其他元素是他执行时所使用的参数。shell格式使用的是自由形式的字符串,字符串会传给 /bin/sh -c 执行。exec格式适用于需要规避 shell 对字符串做出错误解析的情况,或者当径向力没有包含 /bin/sh 时。

常用指令

这些指令在 docker 网站上都可以找到非常详细的说明文档,随着docker的持续发展,文档也会有调整,下列指令描述如果与官方文档不一致,请以官网文档为准。

ADD

从构建环境上下文或远程URL将文件复制至镜像。如果是从一个本地路径添加一个压缩文件,他会被自动解压。

CMD

当容器启动执行时执行特定的指令。如果还定义了 ENTRYPOINT , 该指令将被解释为 ENTRYPOINT 的参数(这时候请确保使用的是 exec 格式)。CMD指令也会被 docker run 命令中镜像名称后面的参数覆盖。加入定义了多个CMD,只有最后一个会生效。

COPY

从构建环境上下文复制文件至镜像。它有两种形式,COPY src dest 或 COPY ["SRC","DEST"],如果路径中有空格的话,必须使用第二种格式。

ENTRYPOINT

设置一个在容器启动时运行的可执行文件(以及默认参数)。任何CMD指令或docker run 命令中镜像名称之后的参数,将作为参数传递给这个可执行文件。 ENTRYPOINT 指令通常用于提供“启动”脚本,目的是在解析参数之前,对变量和服务进行初始化。

ENV

设置镜像内的环境变量。这些变量可以被随后的指令应用。

EXPOSE

向 Docker 表示该容器将会有一个进程监听所指定的端口。提供这个信息的目的是用于连接容器或在执行 docker run 命令式通过 -p 参数把端口发布出来; EXPOSE 本身不会对网络有实质性的改变。

FROM

设置 Dockerfile 使用的基础镜像;随后的指令将基于该镜像之上。 FROM 必须为 Dockerfile 的第一条指令。

MAINTAINER

设置镜像维护者的姓名和联系方式

ONBUILD

指定当镜像被用作另一个镜像的基础镜像时将会执行的指令。

RUN

在容器内执行指定的指令,并把结果保存下来。

USER

设置任何后续的RUN、CMD或ENTRYPOINT指令执行时所用的用户(用户名或UID)。

VOLUME 

指定为数据卷的文件或目录。如果该文件或目录已经在镜像中存在,那么当容器启动时,他就会被复制到这个卷。如果提供了多个参数,那么就将被解释成多个数据卷。

WORKDIR

对任何后续的 RUN、CMD、ENTRYPOINT、ADD、COPY指令设置的工作目录。这个指令可多次使用。

三、外部可访问 && 端口转发

假设你在容器中运行一个 Nginx web服务器,你如何使外界可以访问他呢?通过 -p-P 选项来发布端口。比如:

$docker run -d -p 8000:80 nginx

容器启动后,我们可以通过 localhost:8000 访问到容器内的 web 服务。其中 -p 8000:80 参数告诉 docker 将主机的 8000 端口转发到容器的 80 端口。或者可以使用 -P 参数来告诉 Docker 自动选择一个主机上未使用的端口。

四、数据卷 && 数据容器

数据卷,是一个目录,但并不属于UFS的一部分,它只是在主机上被绑定挂在到容器的一个普通目录。有三种方式可以挂载数据卷:

执行 Docker 时,通过 -v 选项来指定数据卷

docker run -it --name test -v /data debian /bin/bash

通过 Dockerfile 的 VOLUME 命令

FROM debian
VOLUME /data

指定数据卷要绑定的主机目录

docker run -v /home/data:/data debian ls /data

这个例子把主机的 /home/data 目录绑定到容器的 /data 目录,容器能够使用主机 /home/data 目录下的文件。

在执行 docker run 命令时,我们通过传入 --volumes-from container 参数可以实现容器间的数据共享。一个常用的做法是,创建数据容器,这种容器的唯一目的就是与其他容器分享数据。

五、Docker 常用命令

  1. docker build 从dockerfile构建镜像。
  2. docker images 列出所有本地镜像。
  3. docker run 这是一个相对复杂的命令,支持非常多参数。
  4. docker attach 查看容器内主进程,并与之交互
  5. docker create 创建容器但不启动运行
  6. docker exec 在同期中运行一个命令
  7. docker rm 删除一个或多个容器

其实经常用到的命令还有很多,可以在 http://docs.docker.com 查阅完整的释义,也可以在命令行通过 --help参数查看具体使用说明。

写在后面

本文地址:https://www.cnblogs.com/kelsen/p/9608578.html

如果您有任何建议或疑问请在下面留言交流。

Docker 基础 - Docker 与前端(二)的更多相关文章

  1. [Docker基础]Docker安装教程

    Install Docker Docker支持几乎所有的Linux发行版,也支持Mac和Windows. 各操作系统的安装方法可参考Docker官网. 安装环境 ubuntu 16.04 Docker ...

  2. Docker基础-Docker数据管理

    1.数据卷 数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作. 数据卷可以提供很多有用的特性: 1.数据卷可以在容器之间共享和重用,容器间传递 ...

  3. Linux - docker基础

    目录 Linux - docker基础 docker的概念 docker安装流程 docker基本命令学习 docker 的 hello docker 运行一个ubuntu容器 Docker与Cent ...

  4. 二、Docker基础操作

    原文:二.Docker基础操作 一.下载镜像 命令:docker pull xxxxxx(镜像名) docker pull training/weapp 二.运行镜像 docker run -d -P ...

  5. docker 基础命令二

    开启/停止/重启 查看当前正在运行容器docker ps 查看包括已经停止的所有容器docker ps -a 显示最新启动的一个容器docker ps -l 新建一个容器运行docker run 启动 ...

  6. Docker 基础 (二)

    网络管理 容器网络模式 Docker支持5种网络模式 bridge 默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中 host  容器不会获得一个独立的n ...

  7. Docker系列(二):Docker基础命令

    docker的部署安装(Linux kernel至少3.8以上): yum install docker docker1.8安装:(下面 是两个命令) # cat >/etc/yum.repos ...

  8. Docker基础入门及示例

    Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环 ...

  9. 从零开始构建docker基础镜像

    段子 今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我 ...

随机推荐

  1. 手机调试 --- 通过chrome测试手机网站

     移动端有时候我们要调试手机网站. Chrome怎么调试手机页面呢? 毕竟有时候手机支持的JS度跟PC不一样.最开始就遇见了.手机端浏览器不支持执行string.includes. PC端支持该函数, ...

  2. MVC初级知识之——View与Controller的讲解

    Controller是MVC中比较重要的一部分.几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据.在ASP.NET MVC Preview5中,将原来的Controller类一分为二 ...

  3. 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

    第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  ...

  4. Java基础——iO(二)

    接着上一篇,继续做学习笔记.学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了.添加.修改.删除啥的,几行代码就可以搞定了.这只是我一个初学者的一点小心思,IO ...

  5. 分机号-2015决赛C语言C组第一题

    标题:分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, 766,918,201 就不符合要 ...

  6. if语句格式及流程

    if语句是条件判断功能 1. if 条件: if语句块 执行流程:判断条件是否为真. 如果真. 执行if语句块 2. if 条件: if语句块 else: else语句块 执行流程:判断条件是否为真. ...

  7. CSS3实现的几个小loading效果

    昨晚上闲的没事突然想做几个小loading效果,下面是昨晚上做的几个小案例,分享给大家 1.水波loading:这个loading是我觉得非常简单,但是看上去的效果却非常不错的一个小loading 这 ...

  8. OSGI企业应用开发(十)整合Spring和Mybatis框架(三)

    上篇文章中,我们已经完成了OSGI应用中Spring和Mybatis框架的整合,本文就来介绍一下,如何在其他Bundle中,使用Mybatis框架来操作数据库. 为了方便演示,我们新建一个新的Plug ...

  9. 用sparkR, 分析上亿条订单数据的脚本。

    上周我们这个10人的小团队开发的推荐拉新系统, 日拉新人数已接近4万人.过去几个月这个系统从无到有, 拉新从日增几千稳步增长到日增几万, 同事们几个月来,每天工作13个小时以上,洗澡时间都没有, 有时 ...

  10. tomcat上传内容报错

    公司项目报错: o.s.boot.web.support.ErrorPageFilter          :  Forwarding  to  error  page  from  request  ...