每一轮新技术的兴起,不管对公司仍是我的既是机会也是挑战。docker
我我的的见解是:若是某项新技术将来将成为主流,就应该及早尽快掌握。 由于:ubuntu
一、新技术意味着新的市场和新的需求。
初期掌握这种技术的人不会不少,而市场需求会愈来愈大,于是会造成供不该求的卖方市场,物以稀为贵,这对技术人员将是一个可贵的价值提高机会。vim
二、学习新技术须要时间和精力,早起步早成材。服务器
三、本文主要总结容器核心知识,进阶知识之后有机会在学习网络
What - 什么是容器?
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序能够在几乎任何地方以相同的方式运行。开发人员在本身笔记本上建立并测试好的容器,无需任何修改就可以在生产系统的虚拟机、物理服务器或公有云主机上运行。架构
How-为何须要容器?socket
Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker 能够将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器能够运行在几乎全部的操做系统上学习
容器基本入门测试
Docker 的核心组件包括:ui
Docker 客户端 - Client:经过docker在host上构建和运行容器
Docker 服务器 - Docker daemon:是服务器组件,以 Linux 后台服务的方式运行。
Docker 镜像 - Image:经过它能够建立 Docker 容器。
Registry:存放 Docker 镜像的仓库,Registry 分私有和公有两种。
Docker 容器 - Container
Docker 架构以下图所示:
Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器能够运行在同一个 Host 上,客户端也能够经过 socket 或 REST API 与远程的服务器通讯。
新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增长一层。
问什么 Docker 镜像要采用这种分层结构呢?
最大的一个好处就是 - 共享资源。
好比:有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就能够为全部容器服务了。并且镜像的每一层均可以被共享,咱们将在后面更深刻地讨论这个特性。
dockerfile文件建立镜像
Dockerfile 是一个文本文件,记录了镜像构建的全部步骤。
第一个 Dockerfile
用 Dockerfile 建立上节的 ubuntu-with-vi,其内容则为:
下面咱们运行 docker build 命令构建镜像并详细分析每一个细节。
root@ubuntu:~# pwd ①
/root
root@ubuntu:~# ls ②
Dockerfile
root@ubuntu:~#docker build -t ubuntu-with-vi-dockerfile . ③
Sending build context to Docker daemon 32.26 kB ④
Step 1 : FROM ubuntu ⑤
---> f753707788c5
Step 2 : RUN apt-get update && apt-get install -y vim ⑥
---> Running in 9f4d4166f7e3 ⑦
......
Setting up vim (2:7.4.1689-3ubuntu1.1) ...
---> 35ca89798937 ⑧
Removing intermediate container 9f4d4166f7e3 ⑨
Successfully built 35ca89798937 ⑩
root@ubuntu:~#
① 当前目录为 /root。
② Dockerfile 准备就绪。
③ 运行 docker build 命令,-t 将新镜像命名为 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,咱们也能够经过 -f 参数指定 Dockerfile 的位置。
④ 从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的全部文件发送给 Docker daemon。build context 为镜像构建提供所须要的文件或目录。
Dockerfile 中的 ADD、COPY 等命令能够将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root,该目录下的全部文件和子目录都会被发送给 Docker daemon。
因此,使用 build context 就得当心了,不要将多余文件放到 build context,特别不要把 /、/usr 做为 build context,不然构建过程会至关缓慢甚至失败。
⑤ Step 1:执行 FROM,将 ubuntu 做为 base 镜像。
ubuntu 镜像 ID 为 f753707788c5。
⑥ Step 2:执行 RUN,安装 vim,具体步骤为 ⑦、⑧、⑨。
⑦ 启动 ID 为 9f4d4166f7e3 的临时容器,在容器中经过 apt-get 安装 vim。
⑧ 安装成功后,将容器保存为镜像,其 ID 为 35ca89798937。
这一步底层使用的是相似 docker commit 的命令。
⑨ 删除临时容器 9f4d4166f7e3。
⑩ 镜像构建成功。
经过 docker images 查看镜像信息。
镜像 ID 为 35ca89798937,与构建时的输出一致。
在上面的构建过程当中,咱们要特别注意指令 RUN 的执行过程 ⑦、⑧、⑨。Docker 会在启动的临时容器中执行操做,并经过 commit 保存为新的镜像。
查看镜像分层结构
ubuntu-with-vi-dockerfile 是经过在 base 镜像的顶部添加一个新的镜像层而获得的。
这个新镜像层的内容由 RUN apt-get update && apt-get install -y vim 生成。这一点咱们能够经过 docker history 命令验证。
docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程。
回顾一下经过 Dockerfile 构建镜像的过程:
从 base 镜像运行一个容器。
执行一条指令,对容器作修改。
执行相似 docker commit 的操做,生成一个新的镜像层。
Docker 再基于刚刚提交的镜像运行一个新容器。
重复 2-4 步,直到 Dockerfile 中的全部指令执行完毕。
下面列出了 Dockerfile 中最经常使用的指令,完整列表和说明可参看官方文档。
FROM
指定 base 镜像。
MAINTAINER
设置镜像的做者,能够是任意字符串。
COPY
将文件从 build context 复制到镜像。
COPY 支持两种形式:
COPY src dest
COPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目录。
ADD
与 COPY 相似,从 build context 复制文件到镜像。不一样的是,若是 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。
ENV
设置环境变量,环境变量可被后面的指令使用。例如:
...
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
...
EXPOSE
指定容器中的进程会监听某个端口,Docker 能够将该端口暴露出来。咱们会在容器网络部分详细讨论。
VOLUME
将文件或目录声明为 volume。咱们会在容器存储部分详细讨论。
WORKDIR
为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工做目录。
RUN
在容器中运行指定的命令。
CMD
容器启动时运行指定的命令。
Dockerfile 中能够有多个 CMD 指令,但只有最后一个生效。CMD 能够被 docker run 以后的参数替换。
ENTRYPOINT
设置容器启动时运行的命令。
Dockerfile 中能够有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 以后的参数会被当作参数传递给 ENTRYPOINT。
下面咱们来看一个较为全面的 Dockerfile:
注:Dockerfile 支持以“#”开头的注释。
下面是镜像的经常使用操做子命令:
images 显示镜像列表
history 显示镜像构建历史
commit 从容器建立新镜像
build 从 Dockerfile 构建镜像
tag 给镜像打 tag
pull 从 registry 下载镜像
push 将 镜像 上传到 registry
rmi 删除 Docker host 中的镜像
search 搜索 Docker Hub 中的镜像
除了 rmi 和 search,其余命令都已经用过了。
rmi
rmi 只能删除 host 上的镜像,不会删除 registry 的镜像。
Search:默认在docker hub 中查找镜像:docker search httpd
容器指令
容器的经常使用操做命令:
create 建立容器
run 运行容器
pause 暂停容器
unpause 取消暂停继续运行容器
stop 发送 SIGTERM 中止容器
kill 发送 SIGKILL 快速中止容器
start 启动容器
restart 重启容器
attach attach 到容器启动进程的终端
exec 在容器中启动新进程,一般使用 "-it" 参数
logs 显示容器启动进程的控制台输出,用 "-f" 持续打印
rm 从磁盘中删除容器
如下三者是当前主流的容器编排引擎。
docker swarm 是 Docker 开发的容器编排引擎。
kubernetes 是 Google 领导开发的开源容器编排引擎,同时支持 Docker 和 CoreOS 容器。
mesos 是一个通用的集群资源调度平台,mesos 与 marathon 一块儿提供容器编排引擎功能。