go to index

Quickly Start Docker

read time 20 min read
Docker

Orientation and setup

本文来源:https://docker-docs.uclv.cu/get-started/

Docker concepts

Docker 是一个为开发者和系统管理员构建、运行和共享容器化应用程序的平台。使用容器部署应用程序的做法被称为容器化。容器并不是新事物,但它们用于轻松部署应用程序的使用是。

容器化之所以越来越受欢迎,是因为容器具有以下特点:

  • 灵活:即使是最复杂的应用程序也可以容器化。
  • 轻量级:容器利用并共享宿主内核,使它们在系统资源方面比虚拟机更加高效。
  • 便携:你可以在本地构建,部署到云端,并且可以在任何地方运行。
  • 松耦合:容器高度自给自足且封装,允许你替换或升级其中一个而不会干扰其他容器。
  • 可扩展:你可以增加容器副本,并自动在数据中心分布。
  • 安全:容器对进程施加严格的限制和隔离,用户无需进行任何配置。

Images and containers

从根本上讲,容器不过是一个运行中的进程,只不过对它应用了一些额外的封装特性,以保持它与宿主机器和其他容器的隔离。容器隔离最重要的方面之一是每个容器都与自己的私有文件系统交互;这个文件系统由 Docker 镜像提供。一个镜像包含了运行应用程序所需的一切——代码或二进制文件、运行时环境、依赖项以及所需的任何其他文件系统对象。

Containers and virtual machines

容器在 Linux 上原生运行,并与其他容器共享宿主机器的内核。它运行一个独立的进程,占用的内存不会超过任何其他可执行文件,这使得它非常轻量级。

相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,并通过 hypervisor 虚拟访问宿主资源。通常情况下,虚拟机会产生很多超出应用程序逻辑消耗的开销。

Set up your Docker environment

Download and install Docker Desktop

Docker Desktop 是一个易于安装的应用程序,适用于你的 Mac 或 Windows 环境,它能让你在几分钟内开始编码和容器化。Docker Desktop 包含了构建、运行和直接从你的机器共享容器化应用程序所需的一切。

以下是根据你的操作系统下载和安装 Docker Desktop 的相应指南:

Test Docker version

在成功安装 Docker Desktop 之后,你可以通过打开终端(在 Mac 上是 Terminal,在 Windows 上是命令提示符或 PowerShell)并运行以下命令来检查安装在你机器上的 Docker 版本:

bash
docker --version

Test Docker installation

要测试你的 Docker 安装是否成功,你可以按照以下步骤操作:

  1. 运行 hello-world 镜像: 打开你的终端(在 Mac 上是 Terminal,在 Windows 上是命令提示符或 PowerShell),然后输入以下命令:

    bash

    bash
    docker run hello-world
    

    这个命令会尝试从 Docker Hub 下载并运行 hello-world 镜像,这是一个很小的测试镜像,用于验证 Docker 是否能够正常工作。

    如果 Docker 运行正常,你将看到类似以下的输出:

    text
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    ca4f61b1923c: Pull complete
    Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    ...
    

    这个输出表明 Docker 已经成功地从 Docker Hub 下载了 hello-world 镜像,并运行了它,显示了欢迎信息。

  2. 列出已下载的镜像: 要查看你下载到机器上的 hello-world 镜像,你可以运行以下命令:

    bash

    bash
    docker image ls
    

    或者使用 docker images 命令:

    bash

    bash
    docker images
    

    这将列出你机器上所有的 Docker 镜像,包括你刚刚下载的 hello-world 镜像。

  3. 列出容器: hello-world 容器在显示完消息后会退出。要列出这个容器(如果它还在运行,你不需要使用 --all 选项),你可以运行以下命令:

    bash

    bash
    docker ps --all
    

    或者使用 docker ps -a

    bash

    bash
    docker ps -a
    

    这将列出所有容器,包括已退出的容器。你将看到你的 hello-world 容器的 ID、使用的镜像、命令、创建时间、状态等信息。

Build and run your image

Introduction

现在你已经设置好了开发环境,可以开始开发容器化应用程序了。一般来说,开发工作流程如下:

  1. 创建和测试容器:首先为你的应用程序的每个组件创建 Docker 镜像,然后创建并测试单独的容器。
  2. 组装容器:将你的容器和支持基础设施组装成一个完整的应用程序。
  3. 测试、共享和部署:测试、共享并部署你的完整容器化应用程序。

在本教程的这个阶段,让我们专注于工作流程的第一步:创建容器将基于的镜像。记住,Docker 镜像捕获了你的容器化进程将运行的私有文件系统;你需要创建一个包含应用程序运行所需内容的镜像。

Set up

让我们下载 node-bulletin-board 示例项目。这是一个用 Node.js 编写的简单的公告板应用程序。

Git

bash
git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app

Define a container with Dockerfile

下载项目后,查看公告板应用程序中名为 Dockerfile 的文件。Dockerfile 描述了如何为容器组装私有文件系统,还可以包含一些描述如何基于此镜像运行容器的元数据。

有关示例应用程序中使用的 Dockerfile 的更多信息,请参见示例 Dockerfile

Build and test your image

现在你已经有了源代码和一个 Dockerfile,是时候构建你的第一个镜像,并确保从它启动的容器按预期工作了。

确保你在使用终端或 PowerShell 的 cd 命令处于 node-bulletin-board/bulletin-board-app 目录中。运行以下命令来构建这个示例镜像:

bash
docker build --tag bulletinboard:1.0 .

你将看到 Docker 逐步执行你的 Dockerfile 中的每个指令,构建你的镜像。如果成功,构建过程应该以消息“Successfully tagged bulletinboard:1.0”结束。

对于Windows的用户

这个示例使用的是 Linux 容器。请确保你的环境正在运行 Linux 容器,方法是右键点击系统托盘中的 Docker 图标,然后点击“切换到 Linux 容器”。不用担心 - 本教程中的所有命令对于 Windows 容器来说也是完全相同的。

在运行镜像后,你可能会收到一个标题为“安全警告”的消息,指出添加到你镜像中的文件的读写执行权限被设置。在这个示例中,我们没有处理任何敏感信息,所以在这个示例中,你可以忽略这个警告。

Run your image as a container

要基于你的新镜像启动一个容器,请运行以下命令:

bash
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

这里有几个常用的参数:

  • --publish 要求 Docker 将主机的 8000 端口的流量转发到容器的 8080 端口。容器有自己的私有端口集,所以如果你想从网络中访问它们,你必须以这种方式转发流量。否则,默认的安全策略会阻止所有网络流量到达你的容器。
  • --detach 要求 Docker 在后台运行这个容器。
  • --name 指定一个名称,以便你在后续的命令中引用你的容器,在这个例子中是 bb

在浏览器中访问 localhost:8000 来查看你的应用程序。你应该能看到你的公告板应用程序正在运行。在这一步,你通常会做一切可能的事情来确保你的容器按预期工作;现在就是运行单元测试的时候。

一旦你对公告板容器的工作方式感到满意,你可以删除它:

bash
docker rm --force bb

--force 选项会停止正在运行的容器,以便它可以被移除。如果你先使用 docker stop bb 命令停止容器,那么你就不需要使用 --force 来移除它。

Conclusion

到此为止,你已经成功地构建了一个镜像,对一个应用程序进行了简单的容器化,并确认你的应用程序在容器中成功运行。下一步将是将你的镜像分享到 Docker Hub,这样它们就可以被轻松下载并在任何目标机器上运行。

Sample Dockerfile

编写 Dockerfile 是容器化应用程序的第一步。你可以将这些 Dockerfile 命令视为构建镜像的逐步指南。示例应用程序中的 Dockerfile 看起来像这样:

dockerfile
# Use the official image as a parent image.
FROM node:current-slim

# Set the working directory.
WORKDIR /usr/src/app

# Copy the file from your host to your current location.
COPY package.json .

# Run the command inside your image filesystem.
RUN npm install

# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080

# Run the specified command within the container.
CMD [ "npm", "start" ]

# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .

这个示例中定义的 Dockerfile 执行了以下步骤:

  1. FROM:从预先存在的 node:current-slim 镜像开始。这是一个官方镜像,由 Node.js 供应商构建,并由 Docker 验证为高质量的镜像,包含 Node.js 长期支持(LTS)解释器和基本依赖项。

  2. WORKDIR:指定所有后续操作应该在你的镜像文件系统中的 /usr/src/app 目录中进行(而不是宿主的文件系统)。

  3. COPY:将宿主上的 package.json 文件复制到镜像的当前位置(.)中(在这个例子中,是复制到 /usr/src/app/package.json)。

  4. RUN:在镜像文件系统中运行 npm install 命令(这会读取 package.json 来确定你的应用程序的 Node 依赖项,并安装它们)。

  5. COPY:将应用程序的其余源代码从宿主复制到镜像文件系统。

你可以看到,这些步骤与你在宿主上设置和安装应用程序时可能采取的步骤非常相似。然而,将这些步骤捕获为 Dockerfile 允许你在便携式、隔离的 Docker 镜像内执行相同的操作。

上述步骤构建了我们镜像的文件系统,但你的 Dockerfile 中还有其他行。

  • CMD 指令是你在镜像中指定如何运行基于此镜像的容器的元数据的第一个例子。在这种情况下,它表示这个镜像旨在支持的容器化进程是 npm start

  • EXPOSE 8080 通知 Docker 容器在运行时监听 8080 端口。

以上所展示的是一种组织简单 Dockerfile 的好方法;始终以 FROM 命令开始,接着是构建你的私有文件系统的步骤,并以任何元数据规范结束。Dockerfile 指令远不止你上面看到的这几个。要查看完整列表,请参考 Dockerfile 参考文档

Share images on Docker Hub

Introduction

到这一步,你已经在本地开发机器上构建了第二部分中描述的容器化应用程序。

开发容器化应用程序的最后一步是将你的镜像分享到像 Docker Hub 这样的注册中心,这样它们就可以被轻松下载并在任何目标机器上运行。

Set up your Docker Hub account

如果你还没有 Docker ID,请按照以下步骤创建一个。Docker ID 允许你在 Docker Hub 上分享镜像。

  1. 访问 Docker Hub 注册页面: 打开浏览器,访问 Docker Hub 注册页面

  2. 填写表格并提交以创建你的 Docker ID: 在注册页面上填写必要的信息,包括用户名、密码、邮箱等,然后提交表单。

  3. 验证你的电子邮件地址以完成注册过程: 检查你的邮箱,找到 Docker 发送的验证邮件,并按照邮件中的指示完成邮箱验证。

  4. 点击工具栏或系统托盘中的 Docker 图标,并点击登录 / 创建 Docker ID: 在你的计算机上找到 Docker Desktop 的图标,点击它,然后选择“Sign in / Create Docker ID”。

  5. 填写你的新 Docker ID 和密码: 输入你的 Docker ID 和密码进行登录。成功认证后,你的 Docker ID 将出现在 Docker Desktop 菜单中,替换你刚刚使用的“Sign in”选项。

  6. 你也可以通过命令行登录 Docker Hub: 打开命令行工具,输入 docker login 命令。

    • 按照提示输入你的 Docker ID 和密码。
    • 如果你的 Docker 客户端配置了正确的认证信息,你将成功登录 Docker Hub。

登录 Docker Hub 后,你就可以开始推送你的镜像到 Docker Hub,以便其他人可以拉取和使用你的镜像,或者你可以从 Docker Hub 拉取其他人分享的镜像。

Create a Docker Hub repository and push your image

在创建仓库之前,请确保你已经设置了 Docker Hub 账户,并且已经将其连接到你的 Docker Desktop

现在,让我们创建你的第一个仓库,并将你的镜像推送到 Docker Hub

  1. 点击菜单栏中的 Docker 图标: 在你的计算机菜单栏中找到 Docker Desktop 的图标,点击它。

  2. 导航到仓库创建选项: 从下拉菜单中选择“Repositories”然后选择“Create”。

  3. 被重定向到 Docker Hub 的创建仓库页面: 你会被重定向到 Docker Hub 上的“Create Repository”页面。

  4. 输入仓库名称: 在创建仓库的页面上,输入仓库名称为 bulletinboard

  5. 点击页面底部的创建按钮: 在页面底部点击“Create”按钮。目前不需要填写其他任何详细信息。

  6. 现在你已经准备好在 Docker Hub 上分享你的镜像了,但在那之前有一件事你必须做:镜像必须正确地命名空间化以便在 Docker Hub 上分享。具体来说,你必须按照 <Your Docker ID>/<Repository Name>:<tag> 的格式来命名镜像。

    确保你在终端或 PowerShell 中处于 node-bulletin-board/bulletin-board-app 目录下,然后运行以下命令:

    bash
    docker tag bulletinboard:1.0 <Your Docker ID>/bulletinboard:1.0
    

    <Your Docker ID> 替换成你的 Docker Hub 用户名。

    最后,将你的镜像推送到 Docker Hub:

    bash
    docker push <Your Docker ID>/bulletinboard:1.0
    

    访问你的 Docker Hub 仓库,你将在那里看到你的新镜像。记住,默认情况下,Docker Hub 仓库是公开的。

    如果在推送镜像时遇到麻烦,请记住,你必须通过 Docker Desktop 或命令行登录 Docker Hub,并且必须按照上述步骤正确命名你的镜像。如果推送似乎成功了,但在 Docker Hub 上看不到,那么在几分钟后刷新你的浏览器并再次检查。

Conclusion

现在你的镜像已经可以在 Docker Hub 上获取,你将能够在任何地方运行它。如果你尝试在一台还没有该镜像的新机器上使用它,Docker 会自动尝试从 Docker Hub 下载它。通过这种方式移动镜像,你不再需要在想要运行你的软件的机器上安装任何依赖项,除了 Docker。容器化应用程序的依赖项完全被封装和隔离在你的镜像中,你可以通过 Docker Hub 如上所述进行分享。

另外一件需要记住的事情是:目前,你只将你的镜像推送到了 Docker Hub;那你的 Dockerfile 呢?一个关键的最佳实践是将这些文件保存在版本控制中,可能与你应用程序的源代码一起。你可以在 Docker Hub 仓库描述中添加一个链接或注释,指明这些文件在哪里可以找到,这样不仅保存了你的镜像是如何构建的记录,还保存了如何作为一个完整应用程序运行的记录。