Docker 基础 - Docker 与前端(二)
一、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发行版本上 都运行的很好,但还是出现了一些新的发行版项目,他们只考虑需要运行容器的环境,希望做出体积小二容易管理的发行版,尤其是针对数据中心或集群的使用场景。
二、镜像是如何生成的
创建镜像的主要方法是通过 Dockerfile 和 docker build。
构建环境的上下文
命令 docker build需要 Dockerfile和build context。 build context 是一组本地文件和目录,他可以被 Dockerfile 的 ADD 和 COPY 指令引用,通常以目录路径的形式指定。
如果提供的URL以http开头,它会被假定位直接指向 dockerfile ,这样做没什么用,因为该 Dockerfile没有与任何上下文关联。
也可以将git仓库作为构建环境上下文。这种情况下,docker客户端会将Git仓库colone到本地,然后传递给守护进程作为构建环境上下文。
还可以通过stdin输入构建环境的上下文,方法是在需要输入上下文的地方使用 -参数。该输入可以是一个归档文件,支持 tar.gz / xz / bzip2 格式。
从构建环境的上下文中排除不必要的文件,可以使用.dockerignore文件,该文件类似 .gitignore。
镜像
Dockerfile 中的每个指令执行后都会生成一个镜像层,这个镜像层可以用来启动容器。一个新的镜像层的建立,使用上一个镜像层启动容器,然后执行dockerfile中的指令,再把它保存为一个新镜像。
当dockerfile 执行成功后,中间的那些容器会被删掉,除非提供 --rm=false 参数。
由于每个指令的最终结果都只是个静态的镜像,本质上是一个文件系统以及一些元数据,因此即使指令中的持久进程,最终都会被停掉。比如你在一条指令中开启一个数据库服务的进程,但到了下一条指令,或启动容器的时候,它就已经不存在了。
如果你需要在启动容器的时候同事运行一个进程或服务,他必须从ENTRYPOINT 或 CMD 指令中启动。
Docker 为了加快镜像构建的速度,会将每一个镜像层缓存下来。 Docker的缓存特性能大大提高工作效率。
基础镜像
基于镜像分层的特点,当我们需要一个环境时,无需重头开始去构建一个镜像。最理想的做法是完全不用创建镜像,直接使用某个现有的镜像,然后把配置文件和数据挂在上去即可。对于常用软件,比如数据库、web服务器,这是非常可行的。一般情况下使用官方镜像比自己创建一个镜像好得多,因为其他人已经找到使得该软件以最佳方式运行在容器中的方法。
如果你需要使用一个基础镜像以运行应用程序,那么应该先检查一下,应用程序所使用的编程语言或框架是否已提供了官方的镜像。如果只是需要一个小而完整的Linux 发行版本,可以选择 alpine,他的大小仅仅5MB多一点,但仍提供了一个包管理器,可以轻松安装大量应用和工具。
Dockerfile
Exec 与 Shell 的对比
一些指令(RUN、CMD、ENTRYPOINT)能够接受 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 常用命令
- docker build 从dockerfile构建镜像。
- docker images 列出所有本地镜像。
- docker run 这是一个相对复杂的命令,支持非常多参数。
- docker attach 查看容器内主进程,并与之交互
- docker create 创建容器但不启动运行
- docker exec 在同期中运行一个命令
- docker rm 删除一个或多个容器
其实经常用到的命令还有很多,可以在 http://docs.docker.com 查阅完整的释义,也可以在命令行通过 --help参数查看具体使用说明。
写在后面
本文地址:https://www.cnblogs.com/kelsen/p/9608578.html
如果您有任何建议或疑问请在下面留言交流。
Docker 基础 - Docker 与前端(二)的更多相关文章
- [Docker基础]Docker安装教程
Install Docker Docker支持几乎所有的Linux发行版,也支持Mac和Windows. 各操作系统的安装方法可参考Docker官网. 安装环境 ubuntu 16.04 Docker ...
- Docker基础-Docker数据管理
1.数据卷 数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作. 数据卷可以提供很多有用的特性: 1.数据卷可以在容器之间共享和重用,容器间传递 ...
- Linux - docker基础
目录 Linux - docker基础 docker的概念 docker安装流程 docker基本命令学习 docker 的 hello docker 运行一个ubuntu容器 Docker与Cent ...
- 二、Docker基础操作
原文:二.Docker基础操作 一.下载镜像 命令:docker pull xxxxxx(镜像名) docker pull training/weapp 二.运行镜像 docker run -d -P ...
- docker 基础命令二
开启/停止/重启 查看当前正在运行容器docker ps 查看包括已经停止的所有容器docker ps -a 显示最新启动的一个容器docker ps -l 新建一个容器运行docker run 启动 ...
- Docker 基础 (二)
网络管理 容器网络模式 Docker支持5种网络模式 bridge 默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中 host 容器不会获得一个独立的n ...
- Docker系列(二):Docker基础命令
docker的部署安装(Linux kernel至少3.8以上): yum install docker docker1.8安装:(下面 是两个命令) # cat >/etc/yum.repos ...
- Docker基础入门及示例
Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环 ...
- 从零开始构建docker基础镜像
段子 今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我 ...
随机推荐
- 手机调试 --- 通过chrome测试手机网站
移动端有时候我们要调试手机网站. Chrome怎么调试手机页面呢? 毕竟有时候手机支持的JS度跟PC不一样.最开始就遇见了.手机端浏览器不支持执行string.includes. PC端支持该函数, ...
- MVC初级知识之——View与Controller的讲解
Controller是MVC中比较重要的一部分.几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据.在ASP.NET MVC Preview5中,将原来的Controller类一分为二 ...
- 第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; ...
- Java基础——iO(二)
接着上一篇,继续做学习笔记.学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了.添加.修改.删除啥的,几行代码就可以搞定了.这只是我一个初学者的一点小心思,IO ...
- 分机号-2015决赛C语言C组第一题
标题:分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, 766,918,201 就不符合要 ...
- if语句格式及流程
if语句是条件判断功能 1. if 条件: if语句块 执行流程:判断条件是否为真. 如果真. 执行if语句块 2. if 条件: if语句块 else: else语句块 执行流程:判断条件是否为真. ...
- CSS3实现的几个小loading效果
昨晚上闲的没事突然想做几个小loading效果,下面是昨晚上做的几个小案例,分享给大家 1.水波loading:这个loading是我觉得非常简单,但是看上去的效果却非常不错的一个小loading 这 ...
- OSGI企业应用开发(十)整合Spring和Mybatis框架(三)
上篇文章中,我们已经完成了OSGI应用中Spring和Mybatis框架的整合,本文就来介绍一下,如何在其他Bundle中,使用Mybatis框架来操作数据库. 为了方便演示,我们新建一个新的Plug ...
- 用sparkR, 分析上亿条订单数据的脚本。
上周我们这个10人的小团队开发的推荐拉新系统, 日拉新人数已接近4万人.过去几个月这个系统从无到有, 拉新从日增几千稳步增长到日增几万, 同事们几个月来,每天工作13个小时以上,洗澡时间都没有, 有时 ...
- tomcat上传内容报错
公司项目报错: o.s.boot.web.support.ErrorPageFilter : Forwarding to error page from request ...