2015-09-08 11:07:36
来 源
中存储网
Docker
每个 Docker 容器包含一个或多个运行的进程,Docker 使用一种统一的文件系统,将镜像存储为一系列层。层会在构建过程中缓存,这使衍生镜像的构建既快捷又高效。

一、使用容器、镜像和注册表

本文章共四部分:一、Docker入门基础之使用容器、镜像和注册表;二、Docker入门基础之使用容器维护一致的 IoT开发环境;三、Docker入门基础之将容器部署到 IoT 设备;四、Docker入门基础之集成 IoT 设备与云

每个 Docker 容器包含一个或多个运行的进程。Docker 容器从一个镜像启动,该镜像指定了以下元素:

  • 要在容器内运行的应用程序的配置信息

  • 它的依赖项,比如库和共享二进制文件

Docker 使用一种统一的文件系统,将镜像存储为一系列层。层会在构建过程中缓存,这使衍生镜像的构建既快捷又高效。

这种分层方法还意味着 Docker 镜像较小且可移植,可通过将它们发布到公共或私有注册表来轻松共享它们。Docker Hub 是 Docker 镜像存储库的最大注册表;其中列出了 100,000 多个存储库并承载着众多私有存储库。如果您使用 IBM Bluemix 云平台,它支持从 Docker Hub 拉入公共镜像,还支持提供承载的私有镜像存储库,这使您能够在组织内共享私有镜像。

如果使用一种流行的开源框架或服务,您可能能够在 Docker Hub 中找到一个预先构建的公共镜像,许多镜像由与这些项目相关的开源社区来维护。Docker Hub Web 界面有一个较小的官方存储库列表,这是一个精挑细选的存储库列表,包含由 Docker 团队对已知安全漏洞进行了测试的镜像。

避免使用旧的 Docker 镜像,即使这些镜像的来源可靠,因为许多旧镜像仅用于归档和测试用途。如果旧镜像仍得到维护,它们会在 Docker Hub 中被标记为受支持。公共注册表中的大多数镜像都是社区贡献的,可能没有详细备案或维护。怀疑有问题时,可使用一个官方镜像作为基础来创建自己的镜像。

可完成以下步骤来创建镜像:

  1. 从注册表拉入一个基础镜像

  2. 交互式地运行一系列命令

  3. 提交结果作为新镜像

例如,下面的命令列表从 Docker Hub 获取官方的 Ubuntu version 14.04 镜像,从该镜像启动容器,运行一个命令来将 Git 安装到该容器中,然后列出创建的容器的 ID。

清单 1. 创建一个镜像

$ docker pull ubuntu:14.04
$ docker run ubuntu apt-get install -y git
$ docker ps -l

可发出下面这条命令来将此容器 (cb23e345fde0) 保存为新镜像(名为 demo/git):$ docker commit cb23e345fde0 demo/git。

要使用 IBM Container Extensions 工具在本地运行 Docker 命令,可将 docker 命令更改为 ice --local。例如,使用此命令:$ ice --local pull ubuntu:14.04

如果需要运行不止一两个命令来设置应用程序环境,您需要创建一个 Dockerfile。Dockerfile 是指定用于构建镜像的一组指令的文本文件。下面这个代码清单中的 Dockerfile 创建了一个运行 Nginx Web 服务器的基础镜像。

清单 2. 创建一个运行 Nginx Web 服务器的基础镜像的 Dockerfile

FROM ubuntu:14.04
RUN apt-get -y update && apt-get install -y nginx
RUN mkdir -p /var/www/html
EXPOSE 80
EXPOSE 443
WORKDIR /etc/nginx
CMD ["nginx"]

每个 Dockerfile 中的第一条指令是 FROM 指令,这表明基础镜像。Dockerfile 中的每个后续指令存储为一个层:

  • RUN 指令运行 apt-get 等 Linux 命令。
  • ADD 和 COPY 指令将应用程序文件添加到容器中。
  • EXPOSE 指令打开端口。
  • ENV 指令配置环境变量。

最后,每个 Dockerfile 包含 WORKDIR、ENTRYPOINT 或 CMD 指令,用来指定在该容器启动时,如何和在何处运行该应用程序。

运行 Docker 容器需要极少的开销,所以可将您的应用程序分解为一组在不同的容器中运行的服务,这些容器可在运行时按名称来链接。例如,您可将应用程序拆分为一个运行 Node.js 应用程序的容器,该容器链接到另一个运行 Redis 键值存储的容器。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。