Docker 入门指南:动手实践容器化
多年来,“在我机器上能跑”这句话一直是软件开发中的痛点。无论你是开发者、系统管理员还是IT专业人士,只要想了解Docker的入门用法,你来对地方了。Docker通过提供一种强大且轻量级的解决方案,将应用打包并在称为容器的隔离环境中运行,从而解决了这个问题,确保应用在任何地方——从你的笔记本电脑到云端——都能一致地运行。
你将学到什么
学完本指南后,你将理解Docker的核心概念,运行你的第一个容器,构建自定义镜像,并使用Docker Compose管理多容器应用。你将掌握一套清晰且可重复的流程来容器化自己的应用,从而简化开发和部署工作流。
什么是Docker,为什么它如此重要?
Docker是一个开放平台,旨在简化构建、交付和运行应用的过程。它通过让你将应用与基础设施分离,将软件及其依赖项视为一个独立的可移植单元来实现这一点。
可以把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引擎。
安装完成后,打开终端或命令提示符,验证安装:
docker --version
2. 运行你的第一个容器
让我们运行一个“Hello World”容器,确保一切正常。这是了解Docker入门用法的传统第一步。
docker run hello-world
此命令执行以下操作:检查本地是否存在hello-world镜像,如果不存在则从Docker Hub下载,然后从该镜像创建并运行一个容器。容器会打印一条欢迎消息然后退出。这个流程——检查本地、从注册中心拉取、然后运行——是使用Docker的核心。
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应用。这将为你提供一个实用的模板,可以适用于许多项目。
- 创建项目文件夹:
mkdir my-node-app && cd my-node-app - 创建一个简单的应用: 创建一个名为
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/'); }); - 创建
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:为后续的RUN、CMD、COPY和ADD指令设置工作目录。如果目录不存在,它会被创建。COPY package.json ./:将本地的package.json文件复制到镜像内的当前工作目录。RUN npm install:在容器内运行npm install命令,安装package.json中定义的所有依赖项。COPY . .:将本地目录中应用的其余源代码复制到镜像内的工作目录。EXPOSE 3000:告知Docker容器在运行时监听端口3000。CMD ["node", "app.js"]:指定从该镜像启动容器时要运行的命令。
构建并运行你的镜像
构建镜像: 在终端中运行
docker build命令:docker build -t my-node-app:1.0 .-t my-node-app:1.0:为镜像打上名称和版本标签。.:告诉Docker在当前目录中查找Dockerfile。
运行容器: 现在,运行你新创建的镜像,将宿主机端口映射到容器端口:
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镜像的指令。它是一份“配方”,定义了基础镜像、设置环境、复制应用代码、安装依赖项以及指定如何运行应用。
来源
- Docker Docs. "Introduction."
- Docker Docs. "Overview of the Docker workshop."
- Docker Docs. "What is Docker?"
- Docker Setup for DevOps Beginners (GitHub)
- KodeKloud. "Docker Tutorial for Beginners in 2026: First Steps."
- Microsoft Learn. "When to use Docker containers."
- freeCodeCamp. "How to Containerize a Node.js Application Using Docker."
- Docker Docs. "Get started."
- Communications of the ACM. "A Decade of Docker Containers."
- Flatcar. "Getting started with Docker."
- Manning Publications. "Learn Docker in a Month of Lunches."
— Editorial Team
暂无评论。