在软件开发领域,你一定听过这句话:“这代码在我机器上能跑啊!” 环境不一致,是开发、测试、运维之间永恒的矛盾。而 Docker 的出现,正是为了彻底解决这个问题。
本文将从零开始,带你弄懂 什么是 Docker、能做什么、常用命令有哪些,并手把手完成一次实战部署,最后聊聊 Docker 的部署目标与适用场景。
一、到底什么是 Docker?
Docker 是一个容器化平台,用于开发、打包和运行应用程序。它可以把你的应用,以及应用所需要的所有环境(代码、运行时、系统工具、系统库)打包在一个轻量级、可移植的容器里。
关键理解:容器不是虚拟机
简单说:容器是操作系统层面的虚拟化,而虚拟机是硬件层面的虚拟化。 Docker 容器共享宿主机的操作系统内核,所以极其轻量。
二、Docker 能做什么?
Docker 的作用,早已超越了“解决环境不一致”这件事:
快速搭建一致的开发环境
新成员入职,只需docker-compose up就能启动全套微服务,不用折腾半天环境。简化部署流程
开发环境、测试环境、生产环境保持完全一致,真正实现“一次构建,到处运行”。微服务架构
将一个大型应用拆分为多个容器运行,各自独立部署、升级和扩缩容。持续集成/持续部署 (CI/CD)
测试环境可以秒级生成与销毁,构建、测试、部署全流程自动化。资源隔离与充分利用
在一台机器上安全运行多个应用,避免依赖冲突,且比虚拟机更节省资源。
三、常用 Docker 命令速览
掌握以下命令,基本能覆盖日常 80% 的使用场景。
镜像相关(Image)
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 列出本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 构建镜像(在 Dockerfile 所在目录执行)
docker build -t my-app:1.0 .容器相关(Container)
# 运行一个容器
docker run -d --name my-nginx -p 80:80 nginx:latest
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 停止/启动/重启容器
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
# 进入正在运行的容器
docker exec -it my-nginx /bin/bash
# 查看容器日志
docker logs -f my-nginx
# 删除容器
docker rm my-nginx
# 强制删除正在运行的容器
docker rm -f my-nginx其他常用命令
# 查看 docker 系统占用空间
docker system df
# 清理所有未使用的镜像、容器、网络
docker system prune -a
# 拉取镜像
docker pull nginx:latest
# 列出本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 构建镜像(在 Dockerfile 所在目录执行)
docker build -t my-app:1.0 .四、实战部署:用 Docker 运行一个静态网站
理论再多,不如动手敲一把。这里我们以 Nginx 部署一个静态 HTML 网站为例,走通完整流程。
0. 安装 Docker(已安装可跳过)
在开始部署之前,请确保你的机器上已经安装了 Docker。如果还没有,可以根据你的操作系统参考以下步骤。
Ubuntu / Debian
# 更新软件源并安装 Docker
sudo apt update
sudo apt install docker.io -y
# 启动 Docker 并设置开机自启
sudo systemctl enable --now docker
# 将当前用户加入 docker 组,避免每次都需要 sudo(需重新登录生效)
sudo usermod -aG docker $USERCentOS / RHEL
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USERmacOS
下载并安装 Docker Desktop for Mac,安装后会在状态栏出现 Docker 图标,启动即可。
Windows
下载并安装 Docker Desktop for Windows,推荐启用 WSL 2 后端以获得更好的性能。安装完成后启动 Docker Desktop。
安装完成后,在终端执行以下命令,若正常显示版本信息则说明安装成功:
docker version现在,我们可以正式开始部署了。
部署目标
将本地的网页文件挂载到容器中
映射宿主机的 8080 端口到容器的 80 端口
容器在后台运行,开机自启(除非手动停止)
第 1 步:准备网页文件
在宿主机上新建一个目录,如 ~/my-website,在里面创建一个 index.html:
mkdir my-website
touch index.html<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<head><title>Docker 实战</title></head>
<body>
<h1>Hello, Docker!</h1>
<p>这是运行在容器中的静态网站。</p>
</body>
</html>第 2 步:拉取 Nginx 镜像
docker pull nginx:alpine # 使用 alpine 版本,体积仅约 20MB第 3 步:运行容器
docker run -d \
--name website \
-p 8080:80 \
-v ~/my-website:/usr/share/nginx/html:ro \
--restart unless-stopped \
nginx:alpine参数解释:
-d:后台运行--name website:容器名称-p 8080:80:宿主机的 8080 端口映射到容器内的 80 端口-v:将宿主机~/my-website目录挂载到容器的/usr/share/nginx/html,ro表示只读--restart unless-stopped:容器在退出或宿主机重启后自动启动
第 4 步:验证
浏览器打开 http://你的服务器IP:8080(本地则访问 http://localhost:8080),可以看到 “Hello, Docker!” 的页面。
修改一下 ~/my-website/index.html 的内容,刷新浏览器,内容立即生效——这就是挂载卷的便利,特别适合开发阶段。
五、进阶:编写 Dockerfile 构建自己的应用
如果你的应用不是现成的镜像,可以通过 Dockerfile 来定义。下面是一个简单的 Node.js 应用示例:
项目结构:
my-node-app/
├── server.js
├── package.json
└── Dockerfileserver.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello from Node.js in Docker!\n');
});
server.listen(3000, () => console.log('Server running on port 3000'));Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]构建并运行:
# 构建镜像
docker build -t my-node-app:1.0 .
# 运行容器
docker run -d -p 3000:3000 --name node-server my-node-app:1.0访问 http://localhost:3000 就能看到输出。
六、Docker 的部署目标与适用场景
使用 Docker 部署时,常见的目标环境包括:
本地开发:快速搭建一致的开发环境,避免“我这儿能跑”的问题。
持续集成测试:每次提交代码后,用临时容器运行测试,完毕即销毁。
预发/灰度环境:与生产环境完全相同的镜像,仅配置不同,减少上线风险。
生产环境:结合 Kubernetes 等编排工具,实现自动伸缩、滚动更新和高可用。
边缘计算与物联网:Docker 轻量的特性,使其适用于资源受限的设备。
但也要注意,不是所有场景都适合容器化。例如,需要极致 IO 性能的数据库,或者与内核深度绑定的应用,需要谨慎评估。
七、总结
Docker 让应用的交付从“代码 + 环境说明书”变成了一个标准化、不可变、可移植的镜像。它不仅仅是工具,更是一种改变了我们软件交付和运维的思维方式。
本文从概念到命令,再到实战,帮你迈出了 Docker 的第一步。继续深入,你可以去接触 Docker Compose(管理多容器应用)、Docker Swarm / Kubernetes(容器编排),以及更精细的网络、存储配置。
希望这篇博客对你有帮助!如果觉得有用,欢迎分享给更多的开发者朋友。