文章最后更新时间:
Docker是现代软件开发和运维的核心工具,它让”在我机器上能跑”不再是问题。本文用通俗易懂的语言,讲解什么是Docker、为什么要用它,以及如何将一个真实项目容器化部署。
一、为什么需要Docker?
在传统部署方式中,开发人员经常遇到这样的问题:”在我的电脑上明明能运行,部署到服务器上就不行了。”这通常是因为开发环境和生产环境的差异导致的。
传统部署的问题:
- 环境不一致:开发机是Windows,服务器是Linux,依赖版本不同
- 依赖冲突:项目A需要Python 2.7,项目B需要Python 3.9,无法共存
- 部署复杂:新同事入职,光配置环境就要几天
- 资源浪费:一台服务器只能跑一个项目,利用率低
Docker的解决方案:
Docker将应用程序和它的所有依赖打包成一个”容器”,这个容器可以在任何安装了Docker的机器上运行,无论这台机器是Windows、Linux还是Mac。
类比:就像集装箱运输货物——无论是什么货物(服装、电子产品、食品),都用同一个标准的集装箱,在任何码头都能用同样的设备装卸。
二、Docker核心概念
镜像(Image)
镜像相当于应用程序的”模板”或”蓝图”。镜像是一个只读的模板,包含了运行应用程序所需的所有内容:代码、运行时环境、系统工具、库文件等。
类比:就像装好系统的U盘镜像,复制到任何电脑上都能启动。
容器(Container)
容器是镜像的”运行实例”。从镜像创建出来的正在运行的程序就是容器。一个镜像可以创建多个容器,它们相互独立。
类比:镜像是一个菜谱,容器是用这个菜谱做出来的菜。可以同时做多份。
仓库(Registry/Hub)
仓库是存储和分发镜像的地方。最常用的是Docker Hub,类似GitHub,但存储的是Docker镜像。
三、Docker安装
在Windows上安装Docker
Windows 10/11用户推荐安装Docker Desktop:
- 下载Docker Desktop:docker.com/products/docker-desktop
- 运行安装程序(需要开启WSL2或Hyper-V)
- 安装完成后,打开Docker Desktop
- 打开PowerShell或命令行,运行 docker –version 验证
在Linux(Ubuntu)上安装Docker
sudo apt update sudo apt install docker.io -y sudo systemctl start docker sudo systemctl enable docker docker --version
在Mac上安装Docker
下载Docker Desktop for Mac并安装,操作与Windows类似。
四、Docker基本命令
运行第一个容器
docker run hello-world
这行命令会从Docker Hub拉取hello-world镜像并运行,如果看到欢迎信息,说明Docker安装成功。
常用命令速查
docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器(包括已停止的) docker images # 查看本地镜像列表 docker pull nginx # 从Docker Hub拉取nginx镜像 docker stop container_id # 停止容器 docker rm container_id # 删除容器 docker rmi image_name # 删除镜像 docker logs container_id # 查看容器日志
五、将项目容器化(实战)
假设你有一个Node.js项目,需要用Docker容器化部署。
Step 1:创建Dockerfile
在项目根目录创建名为 Dockerfile 的文件:
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install --production COPY . . EXPOSE 3000 CMD ["node", "server.js"]
解释:
- FROM node:18-alpine:基于Node.js 18镜像(alpine是精简版Linux)
- WORKDIR /app:在容器内创建/app工作目录
- COPY package*.json ./:复制依赖文件
- RUN npm install:安装依赖
- COPY . .:复制项目代码
- EXPOSE 3000:声明容器端口
- CMD:容器启动命令
Step 2:创建.dockerignore文件
在项目根目录创建 .dockerignore 文件,排除不需要打包的文件:
node_modules .git .env *.log dist
Step 3:构建镜像
docker build -t my-node-app .
-t my-node-app:给镜像起个名字叫my-node-app
. :当前目录作为构建上下文
Step 4:运行容器
docker run -d -p 3000:3000 --name my-app my-node-app
-d:后台运行
-p 3000:3000:将容器的3000端口映射到主机的3000端口
–name my-app:给容器起个名字
Step 5:验证运行
docker ps curl http://localhost:3000
六、Docker Compose多容器编排
实际项目中,通常有多个服务(如Node.js + MySQL + Redis)。用Docker Compose可以一键启动所有服务。
创建 docker-compose.yml
version: '3'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DB_HOST=db
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
启动所有服务
docker-compose up -d
停止所有服务
docker-compose down
七、Docker最佳实践
- 使用多阶段构建:减少最终镜像体积。构建阶段用完整工具链,运行阶段只复制必要文件。
- 不要用root运行容器:创建专门的用户运行应用,提高安全性。
- 减少镜像层数:合并RUN指令,减少镜像体积。
- 使用.dockerignore:排除不必要的文件,减小构建上下文。
- 设置健康检查:让Docker知道容器是否正常运行。
八、常见问题
Q:Docker和虚拟机有什么区别?
A:虚拟机包含完整的操作系统,体积大(GB级)、启动慢。Docker容器共享宿主机内核,体积小(MB级)、启动快(秒级)。
Q:Docker容器里的数据如何持久化?
A:使用数据卷(Volumes)将容器内的数据目录映射到宿主机,即使容器删除,数据依然保留。
Q:容器内的数据如何备份?
A:使用 docker cp 命令将容器内的文件复制出来,或者使用数据卷的备份功能。
Q:如何查看Docker容器占用了多少资源?
A:使用 docker stats 查看所有容器的CPU、内存、网络使用情况。
总结
Docker是现代开发和运维的必备技能。核心概念:镜像(模板)、容器(运行实例)、仓库(分发平台)。基本流程:写Dockerfile → 构建镜像 → 运行容器。掌握了这些,你就已经入门Docker了。
瀚煜云提供服务器托管及容器化部署技术支持服务。


















暂无评论内容