返回首页

如何为初学者使用Docker:动手实践指南

这本全面的Docker教程教初学者如何使用Docker容器化应用。涵盖核心概念、安装、运行容器、使用Dockerfile构建自定义镜像,以及使用Docker Compose管理多容器应用。

Docker初学者教程:容器化您的第一个应用
Advertisement 728x90

Docker 入门指南:动手实践容器化

多年来,“在我机器上能跑”这句话一直是软件开发中的痛点。无论你是开发者、系统管理员还是IT专业人士,只要想了解Docker的入门用法,你来对地方了。Docker通过提供一种强大且轻量级的解决方案,将应用打包并在称为容器的隔离环境中运行,从而解决了这个问题,确保应用在任何地方——从你的笔记本电脑到云端——都能一致地运行。

你将学到什么

学完本指南后,你将理解Docker的核心概念,运行你的第一个容器,构建自定义镜像,并使用Docker Compose管理多容器应用。你将掌握一套清晰且可重复的流程来容器化自己的应用,从而简化开发和部署工作流。

什么是Docker,为什么它如此重要?

Docker是一个开放平台,旨在简化构建、交付和运行应用的过程。它通过让你将应用与基础设施分离,将软件及其依赖项视为一个独立的可移植单元来实现这一点。

Google AdInline article slot

可以把Docker想象成软件领域的集装箱系统。就像物理集装箱可以装载任何货物并通过轮船、火车或卡车运输一样,Docker容器可以容纳任何应用及其依赖项,并在任何安装了Docker的系统上一致地运行。这种标准化使Docker成为管理云原生应用的事实标准,其公共注册中心Docker Hub托管着超过1400万个应用镜像,每月镜像拉取量超过110亿次。

使用Docker的主要优势

  • 可移植性和一致性: 容器可在任何安装了Docker的机器(Linux、Windows、macOS)上运行,消除了环境相关的错误。
  • 轻量且快速: 与传统虚拟机不同,容器共享宿主机的操作系统内核,因此体积更小(兆字节对比千兆字节),并且能在毫秒内启动。
  • 隔离性和效率: 容器之间以及容器与宿主机系统相互隔离,提高了安全性,并允许你无冲突地运行多个应用。
  • DevOps和CI/CD: 容器是现代CI/CD管道的基石,支持快速测试和部署。

理解核心概念:镜像和容器

在深入之前,理解镜像和容器之间的关系至关重要。这是Docker中最基本的两个概念。

  • Docker镜像: 镜像是一个轻量级、独立、可执行的软件包,包含运行软件所需的一切——代码、运行时、系统工具、库和设置。它是一个只读模板,类似于快照或蓝图。例如,nginx:alpine 是NGINX Web服务器的预构建镜像。
  • Docker容器: 容器是镜像的可运行实例。你可以使用Docker API或CLI创建、启动、停止、移动或删除容器。它是镜像在系统中的“运行”状态。

Docker入门第一步

1. 安装Docker

要开始使用,你需要安装Docker。在Windows或macOS上,最简单的方法是从Docker官方网站下载并安装Docker Desktop。它包含你所需的一切——Docker引擎、CLI和Compose。对于Linux用户,你可以使用发行版的包管理器安装Docker引擎。

Google AdInline article slot

安装完成后,打开终端或命令提示符,验证安装:

docker --version

2. 运行你的第一个容器

让我们运行一个“Hello World”容器,确保一切正常。这是了解Docker入门用法的传统第一步。

docker run hello-world

此命令执行以下操作:检查本地是否存在hello-world镜像,如果不存在则从Docker Hub下载,然后从该镜像创建并运行一个容器。容器会打印一条欢迎消息然后退出。这个流程——检查本地、从注册中心拉取、然后运行——是使用Docker的核心。

Google AdInline article slot

3. 运行一个真实的Web服务器

让我们通过运行一个实际的Web服务器NGINX(在后台运行)来让事情更有趣。此命令引入了三个关键标志:

docker run -d -p 8080:80 --name mywebserver nginx
  • -d(分离模式):在后台运行容器。
  • -p 8080:80(发布端口):将宿主机上的端口8080映射到容器内的端口80。现在你可以通过http://localhost:8080访问Web服务器。
  • --name mywebserver:为容器指定一个友好的名称,而不是随机ID。

现在,在浏览器中打开http://localhost:8080。你应该会看到NGINX的欢迎页面!这证明一个真实的Web服务器正在容器中隔离运行,并且可以在你的机器上访问。

构建你自己的Docker镜像

虽然运行预构建的镜像很有用,但Docker的真正力量在于打包你自己的应用。你可以通过Dockerfile来实现这一点。

什么是Dockerfile?

Dockerfile是一个简单的文本文件,包含一组关于如何构建Docker镜像的指令或命令。它就像一份创建可移植、自包含应用环境的“配方”。

创建一个简单的Node.js应用

让我们创建一个简单的Dockerfile来容器化一个Node.js应用。这将为你提供一个实用的模板,可以适用于许多项目。

  1. 创建项目文件夹:
    mkdir my-node-app && cd my-node-app
  2. 创建一个简单的应用: 创建一个名为app.js的文件。
    const http = require('http');
    
    const server = http.createServer((req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.end('Hello, World! My app is running in a container!\n');
    });
    
    server.listen(3000, () => {
      console.log('Server running at http://localhost:3000/');
    });
  3. 创建package.json 创建一个名为package.json的文件,声明应用的依赖项。
    {
      "name": "my-node-app",
      "version": "1.0.0",
      "main": "app.js"
    }

编写Dockerfile

现在,在同一目录下创建一个名为Dockerfile(无扩展名)的文件,内容如下:

FROM node:18-alpine
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

让我们分解每条指令:

  • FROM node:18-alpine:从基础镜像开始构建。我们使用的是基于Alpine Linux的官方Node.js 18镜像,Alpine Linux是一个非常小的Linux发行版,使我们的镜像更轻量。
  • WORKDIR /app:为后续的RUNCMDCOPYADD指令设置工作目录。如果目录不存在,它会被创建。
  • COPY package.json ./:将本地的package.json文件复制到镜像内的当前工作目录。
  • RUN npm install:在容器内运行npm install命令,安装package.json中定义的所有依赖项。
  • COPY . .:将本地目录中应用的其余源代码复制到镜像内的工作目录。
  • EXPOSE 3000:告知Docker容器在运行时监听端口3000。
  • CMD ["node", "app.js"]:指定从该镜像启动容器时要运行的命令。

构建并运行你的镜像

  1. 构建镜像: 在终端中运行docker build命令:

    docker build -t my-node-app:1.0 .
    • -t my-node-app:1.0:为镜像打上名称和版本标签。
    • .:告诉Docker在当前目录中查找Dockerfile。
  2. 运行容器: 现在,运行你新创建的镜像,将宿主机端口映射到容器端口:

    docker run -d -p 3000:3000 --name my-running-app my-node-app:1.0

在浏览器中导航到http://localhost:3000,你应该会看到“Hello, World!”消息。恭喜你,你已经成功构建并运行了自己的自定义Docker镜像!

使用Docker Compose管理多容器应用

现代应用很少只有一个服务;它们通常包含Web前端、数据库、缓存等。使用多个docker run命令来管理这些服务会变得很繁琐。Docker Compose是一个工具,允许你在单个文件compose.yaml(或docker-compose.yml)中定义和运行多容器应用。

示例:带Redis的Web应用

以下是一个compose.yaml文件示例,定义了一个Web服务和一个Redis缓存服务:

services:
  web:
    image: nginx:alpine
    ports:
      - "8082:80"
  cache:
    image: redis:alpine

该文件定义了两个服务:

  • web:使用官方的nginx:alpine镜像,并将宿主机上的端口8082映射到容器内的端口80。
  • cache:使用官方的redis:alpine镜像。

要同时运行这两个服务,只需使用以下命令:

docker compose up -d
docker compose ps

这将在专用网络上同时启动两个容器,使它们能够相互通信。你可以使用docker compose down停止并移除所有内容。

常见问题

Docker容器和虚拟机之间的主要区别是什么?

关键区别在于资源使用。容器共享宿主机的操作系统内核,因此轻量级,能在毫秒内启动并使用最少资源。虚拟机需要为每个实例运行完整的客户操作系统,因此体积更大(千兆字节),启动更慢,且资源消耗更高。

如何持久化Docker容器生成的数据?

容器默认是无状态的——当你删除容器时,其中存储的任何数据都会丢失。要持久化数据,你可以使用Docker。卷是宿主机上的一个特殊目录,被挂载到容器中,确保数据在容器重启和删除后仍然存在。

如何向Docker容器传递配置设置?

你可以使用环境变量在运行时向容器传递配置设置,例如数据库URL或API密钥。使用docker run命令的-e标志(例如,docker run -e MY_VAR=value my-image),或者在docker-compose.yml文件中定义它们。

什么是Docker Hub?

Docker Hub是一个基于云的注册中心服务,你可以在其中查找和共享容器镜像。它托管了数百万个官方和社区创建的镜像。你可以拉取镜像在本地机器上运行,或者推送自己的自定义镜像与他人共享或部署到生产环境。

什么是Dockerfile?

Dockerfile是一个文本文件,包含关于如何构建Docker镜像的指令。它是一份“配方”,定义了基础镜像、设置环境、复制应用代码、安装依赖项以及指定如何运行应用。

来源

  1. Docker Docs. "Introduction."
  2. Docker Docs. "Overview of the Docker workshop."
  3. Docker Docs. "What is Docker?"
  4. Docker Setup for DevOps Beginners (GitHub)
  5. KodeKloud. "Docker Tutorial for Beginners in 2026: First Steps."
  6. Microsoft Learn. "When to use Docker containers."
  7. freeCodeCamp. "How to Containerize a Node.js Application Using Docker."
  8. Docker Docs. "Get started."
  9. Communications of the ACM. "A Decade of Docker Containers."
  10. Flatcar. "Getting started with Docker."
  11. Manning Publications. "Learn Docker in a Month of Lunches."

— Editorial Team

Advertisement 728x90

继续阅读