<div id="single_top"></div> <p>Docker使用Go语言开发,基于Linux内核的cgroup、namespace以及AUFS等技术对进程进行封装隔离,是一种操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。</p>
讯享网
Docker则使用宿主机内核提供的隔离机制创建沙盒环境,容器内的应用进程直接运行于宿主的内核。 因为容器内没有虚拟硬件和内核,容器在启动时间、执行效率、内存占用以及镜像大小等方面相对于传统虚拟机都拥有很大优势。
Docker容器将程序及其运行环境打包在一起,镜像创建后可以在任何安装了Docker的系统上运行,无需配置运行环境, 加之较小的镜像体积极大方便了协作开发和部署。
使用Dockerfile将镜像构建过程透明化,也便于开发和运维人员理解程序的运行环境。
Docker相对于虚拟机的优势来源于它运行与宿主内核而减少了开销,这使得Docker不能虚拟不同的内核环境。也就是说我们可以很容易地在Windows操作系统上启动一个Linux虚拟机,但是在Windows上启动一个基于Linux的Docker容器则是很困难的事情。
docker官方已经发布了及。目前使用MAC OS内核提供的虚拟化技术代替了docker-toolbox采用的使用Linux虚拟机提供支持的方式。
目录:
- What's Docker
- Get Started
- 镜像
- docker images
- docker search
- docker pull
- docker rmi
- 容器
- docker run
- docker create
- docker ps
- docker start
- docker exec
- docker attach
- docker stop
- docker kill
- docker cp
- docker rm
- docker volume
- 构建镜像
- docker diff
- docker commit
- docker tag
- docker history
- Dockerfile
- 共享镜像
- docker export
- docker save
- docker import
- docker load
- Registry
- docker push
cgroup和namespace是Linux内核提供的两种隔离机制,是Docker虚拟化的技术基础:
- cgroup: 全名Control Groups, Linux内核提供的用于监控和管理进程组占用资源的机制。 这里的资源包括CPU,内存和IO等硬件资源。
- namespace: 为某个进程提供独立的空间,包括独立的:
- 进程树: 进程拥有独立的init进程及其下进程树
- 文件系统: 进程拥有独立的根目录及其下目录树
- 用户: 进程可以定义自己的用户,组和权限系统
- 协议栈: 进程可以拥有独立的ip地址及tcp/udp端口空间
- 其它
在了解隔离机制之后我们可以了解Docker中的两个核心概念:
- 容器:容器的本质是进程,它拥有独立的命名空间。因此容器表现很像一个虚拟操作系统,拥有自己的进程树,文件系统等。
- 镜像:镜像是容器运行依赖的文件系统,就像每个Linux操作系统时都需要挂载root文件系统,镜像就是容器的root文件系统。
Docker采用服务端/客户端架构:
- 守护进程(dockerd): Docker服务端每个dockerd下可以运行多个容器,此外还提供了镜像和容器管理的功能。
- 客户端: 通过API与dockerd通信进行操作,官方提供了命令行客户端以及Go和Python语言的SDK
- 宿主机:用于运行dockerd及其容器的操作系统环境
- Registry:Docker镜像存储中心,用于管理和共享docker镜像。官方存储中心DockerHub中提供了大量官方和第三方镜像。
Docker采用UnionFS技术将镜像设计为分层结构,即一个镜像分为多层,每一层在上一层的基础上构建(即存储增量)。在容器中只能看到所有层叠加后的结果,隐藏了分层的结构。因为镜像层会被其它层依赖,为了保证下层能正常工作, 镜像层在创建后就无法进行修改。
Docker目前分为免费的社区版(CE)和付费的商业版(EE)两种, 这里我们选用社区版。 Docker官网上提供了各种常用操作系统的安装说明:
- MAC
- Ubuntu
- Centos
- Debian
- Windows
下面看一个简单的示例:
在执行命令后发现我们已经从宿主机Mac的终端进入到了Linux终端中。 这个运行中的"Linux"就是容器,启动这个虚拟的Linux环境所需的文件即是镜像。
上面的示例中我们使用docker代替了ubuntu虚拟机,对比之下docker在镜像大小,启动时间和运行内存占用方面都具有巨大的优势。
因为启动docker容器的开销和启动相应进程的开销基本相同, 因此完全可以使用docker代替原生进程, 避免复杂的编译安装配置过程。
这个示例中我们一键安装并启动了redis-server。
在终端中输入命令则会显示所有命令和使用帮助, 在docker命令后添加选项可以查看该命令的帮助信息, 如可以查看run命令的帮助。
本节将简单介绍如何搜索和管理镜像, 为介绍容器做准备。更多关于镜像的构建和共享的内容将在下文中介绍。
命令用于显示本地所有镜像:
和其它软件一样docker镜像也可以演进出不同版本,tag用于标识镜像的版本。
repository代表同一镜像多个版本的集合, 它的值是一个URI用于全局唯一标识一组镜像,如"registry.cn-hangzhou.aliyuncs.com/acs/agent"。
对于DockerHub中的镜像则会省略仓库的地址,诸如和就是DockerHub中的镜像。
由此可见,和可以唯一标识docker镜像。
除此之外每个镜像还拥有一个摘要(DIGEST),可以显示镜像的摘要。
DockerHub是docker官方提供的公有仓库,命令用于根据关键字搜索DockerHub中的镜像:
命令用于从远程下载镜像,可以通过或的格式来指明目标镜像。
当只提供了镜像NAME时,默认下载tag为的镜像。
NAME也可以是私有仓库中一个REPOSITORY的URI。
用于删除镜像,可以使用或来标记一个容器。
命令用于新建一个容器并启动, 是最重要的和最常用的docker命令之一。
命令的标准执行流程包括:
- 检查本地是否包含指定的镜像,若不存在就从公有仓库下载
- 在只读的基础镜像层上挂载一个可读写层,创建容器的文件系统
- 根据文件系统启动容器
- 将容器与宿主机桥接
- 用指定的身份登录容器,并在指定目录下执行参数指定的命令
- 在命令执行完成后关闭容器
docker容器在命令执行完毕后会自动退出, 容器的生存周期仅决定于执行命令所需的时间。 如果在容器中执行等长期运行的命令, 就可以保证容器长期运行。
命令默认会把标准输出流(stdout)重定向到终端,并与容器保持连接状态(attach)。
在attach状态下, 容器退出之前命令不会返回,而是在终端回显容器的输出。 若发出信号(如快捷键)杀死, 那么容器也会提前退出。
容器对文件系统的修改在可读写层,不会对镜像产生影响, 除非使用创建新的镜像层。 容器退出后其文件系统仍将保存在磁盘中,下次启动后会保留所有修改。
打开终端
命令默认将容器的标准输出流重定向到终端, 但是没有将终端的标准输入流(stdin)重定向到容器。 也就是说,容器无法接收我们在终端中输入的命令。
使用或选项会保持容器的输入流(stdin)打开,即使不与容器保持attach状态。
命令可以打开一个ubuntu终端, 该终端也可以接受我们输入的指令。
和标准的Linux系统一样,docker镜像也为用户指定了默认终端。 使用或选项会打开一个虚拟终端(Pseudo-TTY)。
也就是说,命令可以轻松地打开一个可交互ubuntu虚拟环境。
后台运行
命令默认与容器保持连接状态(attach), 或选项可以与容器断开连接。 命令在显示容器ID后立即返回,容器则会在后台运行。
上文redis-server的示例即使用了选项, 立即返回, redis-server在后台继续运行。
端口映射
如上文中redis-server示例, 我们经常使用docker容器提供服务,因此需要docker容器监听宿主机的某个端口。
将对宿主机TCP6379端口的访问映射到容器的TCP6379端口。
则可以映射udp访问(虽然对redis-server来说没有意义)。 多个选项可以映射多个端口.
端口映射是将对宿主机某个端口的访问映射到容器的某个端口上, 容器访问宿主机端口不需要配置端口映射。
挂载数据卷
选项可以将宿主机上某个目录挂载到容器中的某个目录
上述指令将宿主机目录挂载到镜像的目录下,目录下原来的内容会被隐藏而是显示宿主机目录下的内容。
这种方式我们称为在容器上挂载了数据卷,对数据卷的读写独立于容器之外:
- 容器对数据卷的修改将立即存储到数据卷所在的(即宿主机的文件系统)上
- 除非指明删除数据卷,否则容器删除不会对数据卷产生影响
- 其它进程对数据卷的修改将立即生效
若数据卷或挂载点不存在的时候, docker会自动创建空目录。
docker提供了独立于容器的数据卷管理功能,参考docker volume。
为容器命名
每个容器都拥有一个唯一的来标识,但ID不便于记忆和使用。 因此在创建容器时可以使用选项来为容器指定一个名称。
在某个dockerd中容器名称是唯一的, 我们可以使用容器名来唯一指定容器。
示例:
退出时自动删除
选项会在容器退出时自动删除容器。 使用该命令时需谨慎, 容器一旦删除便不可恢复。
自定义工作目录
选项会在启动容器时,使用PATH参数指定的路径作为工作目录。
命令与指令极为相似,区别在于创建容器后自动启动容器, 而不自动启动容器需要使用命令来启动。
命令用于显示容器的信息,默认情况下显示运行中的容器:
选项可以显示包括已停止容器在内的所有容器信息。
命令用于启动一个已停止的容器,默认情况下不与容器连接(attach)也不将输入重定向到容器。
若使用或选项将与容器连接(attach), 终端将回显容器输出。
或选项则会将输入重定向到容器。
用于让一个正在运行的容器执行命令,命令执行完成后将返回容器继续运行。
默认情况下与容器连接,或选项可以不与容器连接而在后台执行命令。
与命令类似, 选项用于将标准输入重定向到容器以便接收用户输入, 选项可以打开终端。
命令用于与容器连接, 即将容器输出流重定向到终端,终端输入流重定向到容器。
当容器没有输出时终端中没有回显,可能令用户误以为卡死。 attach之后再次输入回车, bash将回显命令行提示符。
attach状态下快捷键会发送信号中止容器, 而快捷键会退出attach容器继续运行。
用于终止容器的运行
命令会先发送信号要求容器中的进程执行退出操作,若达到超时时间(默认10s)容器仍未退出则会发送信号强制退出。
或选项可以秒为单位设置强制杀死之前的等待时间:
命令将直接向容器发送命令停止容器:
或选项可以向容器发送指定的信号:
命令负责在运行的容器和宿主机之间复制文件:
用于删除一个镜像,通过镜像ID或镜像名来指定要删除的镜像, 默认情况下只能删除已退出的镜像:
或选项可以强制删除运行中的镜像。
或选项将删除所有挂载的数据卷。
系列指令用于独立的管理数据卷, 请先阅读docker run:挂载数据卷
create
将宿主机上一个目录创建为数据卷:
ls
查看所有数据卷:
inspect
查看某个数据卷的详细信息:
rm
删除某个数据卷:
prune
删除所有未被使用的数据卷:
使用数据卷
和命令可以使用或选项来使用数据卷:
docker会优先寻找数据卷列表中的myvol而不是当前目录下的myvol子目录。
若找不到myvol数据卷且当前目录下也不存在myvol子目录,docker会自动创建myvol数据卷不会再当前目录下创建子目录。
选项虽然语法复杂,但是可以配置更多选项:
上文中已经介绍了如何获取和使用已有镜像,接下来介绍如何构建自己的镜像。
我们可以将自己的程序及其运行环境打包成Docker容器,部署到服务器或者共享给其它开发者免去配置环境的烦恼。
前文已经提到过Docker镜像采用分层结构,容器运行时无法修改镜像的内容,而是在镜像层上挂载了一个可读写层。
命令可以查看容器对镜像的修改:
我们打开一个ubuntu容器在目录中创建了文件, 并在其中写入"Hello, from finley"。
通过可以看出这个操作产生了三个影响:
- 工作目录修改为, C代表变更工作目录
- 命令历史文件改变, A代表文件或目录内容发生改变
- 修改了文件
命令根据容器对镜像的修改创建新的镜像层
或选项可以指定容器的作者, 或可以添加备注信息:
或选项可以添加一系列Dockerfile指令,关于Dockerfile的内容我们将在下文介绍。
命令用于为镜像创建一个别名。
TARGET_IMAGE可以是私有仓库REPOSITORY的URI,tag命令经常被用来协助将镜像推送到私有仓库。
命令用于显示镜像各层的信息,即查看commit历史:
命令虽然可以很方便的创建新的镜像,但是我们在容器内操作(特别是尝试性的操作)可能会在新镜像内产生无关的内容,如命令历史和日志等。
Dockerfile是控制镜像构建过程的脚本,使用Dockerfile可以有效避免镜像中包含无关内容。
Dockerfile中包含多行指令,每个指令会在镜像中创建一层。
上面示例中我们以nginx为基础构建了一个新镜像,并启动它提供服务。
在具体介绍Dockerfile的指令之前,我们先介绍一下命令。
指令用于根据Dockerfile构建镜像,通常该指令需要一个PATH参数来指定某个目录做为构建上下文(context)。
或选项用于在构建上下文指定Dockerfile文件的路径, 默认为。
或选项用于为镜像指定标签,默认情况下名称仍然与基础镜像相同, 而则会指定容器的名称。
除了使用一个目录作为构建上下文之外,也可以使用tar压缩包、git仓库作为上下文, 甚至从标准输入中读取Dockerfile或tar进行构建。
接下来介绍常用的Dockerfile命令:
FROM
指令用于指定构建容器的基础镜像,标记镜像的语法与命令相同。
除了使用已存在的镜像作为基础镜像之外还有一个特殊的镜像, 它是一个空镜像。
我们可以把静态编译的可执行文件放入空白镜像中,由内核直接执行可以极大的降低镜像的体积。
RUN
命令在镜像中创建一个容器并执行指定指令,执行结束后commit修改作为镜像的一层。
上文示例中的Step2展示了指令运行的过程:
- 创建一个中间容器(intermediate container): 2b3c5df09f9c
- 运行命令
- 将修改提交,产生新的容器: ad0f2f
- 删除中间容器:2b3c5df09f9c
命令有两种参数格式:
- 命令行式:
- 函数调用式:
在实际执行过程中命令行式指令会被映射为。
因为每个指令都会生成一层镜像, 因此最好用将多条指令连接而不是写多条指令。
COPY
指令将文件或目录从构建上下文(context)将文件复制到镜像内部。
WORKDIR
命令用于指定容器的默认工作目录。
命令对Dockerfile中的后续命令都有影响, 除非有另一条命令修改了工作目录
上文已经介绍过每条指令都会创建一个临时容器, 因此只对同一条中的后续指令有效。
USER
命令用于指定容器中的当前用户:
和命令一样,指令直到下一条指令之前始终有效。
CMD
命令用于指定启动容器的指令, 和命令一样有两种格式。
EXPOSE
命令用于声明需要暴露哪些接口,注意命令没有建立端口映射, 需要在创建容器时启动端口映射。
ENV
命令用于为容器设置环境变量:
ENTRYPOINT
指令和CMD一样,用于指定启动容器的指令。 当指定了ENTRYPOINT之后,CMD命令的内容将被作为参数传递给ENTRYPOINT指定的指令。
首先创建一个容器:
如果我们试图传递选项给ls以显示更详细的信息:
根据的语法我们试图让镜像执行命令代替默认命令, 这当然行不通。
用ENTRYPOINT代替CMD:
重新创建:
ENTRYPOINT通常用于在执行容器CMD做一些准备工作, 比如官方redis镜像中:
可以用来更改容器的ENTRYPOINT。
现在我们已经了解如何构造自己的镜像,接下来的问题是如何将镜像分享给其它开发者或者部署到服务器。
命令用于导出容器的快照, 默认输出到标准输出流,需要将输出重定向到文件进行保存。
或者使用或选项
命令导出时会新建一个空白镜像然后将容器文件系统的内容写入,不包含容器基础镜像各层和tag等信息。
用于将镜像存储为tar压缩包,默认导出到标准输出流需要重定向以写入文件
或者使用或选项
命令会将镜像各层及其tag信息导出到文件。
命令用于导入tar格式的快照,生成的镜像只有一层不导入各层和tag信息。
该指令与相对用于导入容器镜像,但也可以导入生成的tar文件。
用于导入tar格式的镜像副本,导入时保留各层和tag等元数据, 因此不需要指定镜像名和tag。
默认从标准输入流导入:
或者使用或选项:
命令与命令相对,因为缺少元数据不能导入生成的tar文件。
虽然docker支持以文件的形式导入导出镜像,但这种方式对于共享镜像来说仍十分不便。
Docker官方提供了一个registry镜像,我们可以使用它轻松搭建私有仓库。
选项将目录挂载到了容器中,这个目录将用来实际存储镜像。
docker默认采用HTTPS方式推送和拉取镜像,本文不再介绍如何为私有仓库配置HTTPS证书。
私有仓库可以配置权限认证,仅授权用户才能推送或拉取镜像,这里也不再详细介绍权限认证相关功能。
命令用于将镜像推送到仓库,推送到的仓库由镜像的REPOSITORY属性决定。
首先,使用命令给想要推送的镜像创建一个别名。
在这个URI中, 是Registry的地址,是私有仓库中的一个命名空间, 是私有仓库中的一个REPOSITORY。
访问来查看私有仓库中的镜像。
- 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
[SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...
- Docker网络基础:快速指南
Docker网络基础:快速指南 原文连接:http://blogxinxiucan.sh1.newtouch.com/2017/07/30/Docker网络基础:快速指南/ 了解有关扩展网络功能的默认 ...
- [转载]Docker 完全指南
Docker 完全指南 原作者地址: https://wdxtub.com/2017/05/01/docker-guide/ 发表于 2017-05-01 | 更新于 2017-08-03 | ...
- 【干货合集】Docker快速入门与进阶
收录待用,修改转载已取得腾讯云授权 Docker 在众多技术中,绝对是当红炸子鸡.这年头,如果你不懂一点容器,不学一些Docker,还怎么出去跟人炫耀技术? Docker 也是云计算技术中较为热门的一 ...
- Docker 入门指南
Docker 入门指南 目录 基础概念 安装教程 基本操作 常用安装 构建操作 容器编排 壹.基础概念 什么是Docker? Docker是基于Go开发的应用容器引擎,属于 Linux 容器的一种封装 ...
- [译] MongoDB Java异步驱动快速指南
导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...
- 转:C++ Boost/tr1 Regex(正则表达式)快速指南
C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...
- Docker终极指南:为什么Docker能做这么多事
Docker终极指南:为什么Docker能做这么多事 http://www.aboutyun.com/thread-11499-1-1.html
- Docker 使用指南 (四)—— 数据卷的使用
一.数据卷的使用 有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据.数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用 ...
讯享网 <li>关于 getsockname、getpeername和gethostname、gethostbyname <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">一.gethostname,gethostbyname的用法 这两个函数可以用来获取主机的信息.gethostname:获取主机的名字gethostbyname:通过名字获取其他的信息(比如ip) 1 ...</p> </li> <li>基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持 <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">在我们开发系统界面,包括Web和Winform的都一样,主要的界面就是列表展示主界面,编辑查看界面,以及一些辅助性的如导入界面,选择界面等,其中列表展示主界面是综合性的数据展示界面,一般往往需要对记录 ...</p> </li> <li>自学Zabbix3.1-语言切换 <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">题记: 默认使用的zabbix版本为Zabbix 3.0.8 登陆到zabbix web控制台默认是英文界面,对有些英文不好或者习惯中文的人来说会有不适应. 实际上是切换到中文版本,步骤:点击用户 ...</p> </li> <li>阿里云ECS部署ZooKeeper注意事项 <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">如果ECS为专有网络+弹性IP时,配置集群中,"自己"的ip要写成0.0.0.0,其他服务器可以写成公网ip.否则会包如下错误: java.net.BindException: C ...</p> </li> <li>cs231n --- 1:线性svm与softmax <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">cs231n:线性svm与softmax 参数信息: 权重 W:(D,C) 训练集 X:(N,D),标签 y:(N,1) 偏置量bias b:(C,1) N:训练样本数: D:样本Xi 的特征维度, ...</p> </li> <li>JavaScript--AJAX页面传值 <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">1.首先 闲话不说 直接代码走起,都是我工作闲事的积累干货 //重要 js 运行 $(function (){ 代码 }); 2.ajax 传值 //第一种 输入框 <input type=&q ...</p> </li> <li>【JMeter】获取json响应报文中数组长度 <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Predicate; import net.minidev.json.J ...</p> </li> <li>iOS SVN出现的问题,在mac使用Cornerstone中无法提交提交失败处理。。。 <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">问题一: Description : An error occurred while contacting the repository. Suggestion : The server may be ...</p> </li> <li>【Zookeeper】源码分析之Leader选举(一) <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">一.前言 分析完了Zookeeper中的网络机制后,接着来分析Zookeeper中一个更为核心的模块,Leader选举. 二.总结框架图 对于Leader选举,其总体框架图如下图所示 说明: 选举的父 ...</p> </li> <li>c#$用法 <p style="color: rgba(0, 0, 0, 0.32);margin-bottom: 8px;">为什么会出现$符号,c#6.0才出现的新特性 var s = string.Fromat("{0}+{1}={2}",12,23,12+23) 用起来必须输入string.From ...</p> </li> </ol>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/153562.html