Docker 入门完全指南:容器化技术从入门到实践
·
Docker 入门完全指南:容器化技术从入门到实践
引言
在当今云原生时代,Docker 已经成为开发者必备的技能之一。它不仅简化了应用的部署流程,还解决了"在我机器上能运行"的困境。本文将从零基础开始,带你掌握 Docker 的核心概念、安装配置和实战操作,让你快速上手容器化技术。
一、Docker 是什么?
1.1 核心概念
Docker 是一个开源的应用容器引擎,让开发者可以打包应用及其依赖到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上。
| 概念 | 说明 |
|---|---|
| 镜像 (Image) | 只读的模板,包含运行应用所需的所有文件和配置 |
| 容器 (Container) | 镜像的运行实例,可执行、可停止、可删除 |
| 仓库 (Repository) | 存储和管理镜像的地方,如 Docker Hub |
| Dockerfile | 定义如何构建镜像的文本文件 |
1.2 为什么使用 Docker?
- ✅ 环境一致性:开发、测试、生产环境完全一致
- ✅ 轻量级:容器共享宿主机内核,启动速度快
- ✅ 可移植性:一次构建,随处运行
- ✅ 隔离性:应用之间相互隔离,互不影响
- ✅ 易于扩展:支持快速水平扩展
二、Docker 安装与环境配置
2.1 各平台安装方法
Windows 用户:
# 方法一:使用 Chocolatey
choco install docker-desktop
# 方法二:下载官方安装包
# 访问 https://www.docker.com/products/docker-desktop/
Mac 用户:
# 方法一:使用 Homebrew
brew install --cask docker
# 方法二:下载官方安装包
# 访问 https://www.docker.com/products/docker-desktop/
Linux 用户(Ubuntu/Debian):
# 更新软件包索引
sudo apt update
# 安装依赖
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
2.2 基础配置
# 查看 Docker 版本
docker --version
# 运行 Hello World 验证安装
docker run hello-world
# 查看当前运行的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 查看本地镜像
docker images
2.3 配置国内镜像源(加速下载)
编辑 Docker 配置文件:
# Linux/Mac
mkdir -p ~/.docker
cat > ~/.docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://mirror.ccs.tencentyun.com",
"https://hub-mirror.c.163.com"
]
}
EOF
# 重启 Docker 服务
sudo systemctl restart docker
三、Docker 核心操作
3.1 镜像操作
# 拉取镜像(从 Docker Hub)
docker pull nginx:latest
docker pull ubuntu:22.04
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 保存镜像为 tar 文件
docker save -o nginx.tar nginx:latest
# 加载镜像
docker load -i nginx.tar
3.2 容器操作
# 运行容器(交互式)
docker run -it ubuntu:22.04 /bin/bash
# 运行容器(后台模式)
docker run -d --name my-nginx -p 8080:80 nginx:latest
# -d: 后台运行
# --name: 指定容器名称
# -p: 端口映射(宿主机端口:容器端口)
# 查看容器日志
docker logs my-nginx
# 进入运行中的容器
docker exec -it my-nginx /bin/bash
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 删除容器
docker rm my-nginx
# 强制删除运行中的容器
docker rm -f my-nginx
3.3 常用命令速查
| 命令 | 功能 |
|---|---|
docker run | 创建并运行容器 |
docker ps | 查看运行中的容器 |
docker images | 查看本地镜像 |
docker pull | 拉取镜像 |
docker push | 推送镜像到仓库 |
docker build | 构建镜像 |
docker exec | 在运行的容器中执行命令 |
docker logs | 查看容器日志 |
docker inspect | 查看容器/镜像详情 |
四、Dockerfile 实战
4.1 什么是 Dockerfile?
Dockerfile 是一个文本文件,包含一系列指令,用于自动化构建 Docker 镜像。
4.2 编写第一个 Dockerfile
创建一个简单的 Node.js 应用:
# 指定基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["node", "server.js"]
4.3 构建镜像
# 在 Dockerfile 所在目录执行
docker build -t my-node-app:v1 .
# -t: 给镜像打标签(名称:版本)
# .: 指定构建上下文(当前目录)
4.4 Dockerfile 常用指令
| 指令 | 说明 |
|---|---|
FROM | 指定基础镜像 |
WORKDIR | 设置工作目录 |
COPY | 复制文件到容器 |
ADD | 复制文件(支持 URL 和自动解压) |
RUN | 执行命令 |
EXPOSE | 声明暴露的端口 |
CMD | 指定容器启动命令 |
ENTRYPOINT | 设置容器入口点 |
ENV | 设置环境变量 |
USER | 指定运行用户 |
五、Docker Compose 入门
5.1 什么是 Docker Compose?
Docker Compose 是一个工具,用于定义和运行多个 Docker 容器的应用。通过一个 YAML 文件配置应用的服务、网络和卷。
5.2 安装 Docker Compose
# Linux
sudo apt install docker-compose-plugin
# 验证安装
docker compose version
5.3 编写 docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=myapp
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
5.4 使用 Docker Compose
# 启动所有服务
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs web
# 停止服务
docker compose down
# 停止并删除数据卷
docker compose down -v
六、Docker 网络与数据持久化
6.1 网络管理
# 创建自定义网络
docker network create my-network
# 查看网络列表
docker network ls
# 将容器连接到网络
docker network connect my-network my-container
# 断开容器与网络的连接
docker network disconnect my-network my-container
6.2 数据卷(Volumes)
# 创建数据卷
docker volume create my-volume
# 查看数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect my-volume
# 删除数据卷
docker volume rm my-volume
# 运行容器时挂载数据卷
docker run -d -v my-volume:/app/data nginx:latest
6.3 挂载主机目录
# 挂载当前目录到容器
docker run -d -v $(pwd):/app nginx:latest
# 只读挂载
docker run -d -v $(pwd):/app:ro nginx:latest
七、实战案例:部署一个完整的 Web 应用
7.1 项目结构
my-web-app/
├── Dockerfile
├── docker-compose.yml
├── package.json
└── src/
├── server.js
└── public/
└── index.html
7.2 Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "src/server.js"]
7.3 docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "80:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=5432
depends_on:
- db
restart: unless-stopped
db:
image: postgres:15-alpine
environment:
- POSTGRES_DB=appdb
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=secret
volumes:
- postgres-data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
postgres-data:
7.4 启动应用
# 启动应用
docker compose up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f
八、实用技巧与最佳实践
8.1 镜像优化技巧
# 多阶段构建(减少镜像大小)
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]
8.2 .dockerignore 文件
创建 .dockerignore 文件排除不需要的文件:
node_modules/
npm-debug.log
.DS_Store
.git/
.env
8.3 安全最佳实践
- ✅ 使用非 root 用户运行容器
- ✅ 定期更新基础镜像
- ✅ 避免在镜像中存储敏感信息
- ✅ 使用多阶段构建减少攻击面
- ✅ 限制容器的资源使用
九、常见问题与解决方案
Q1:Docker 命令需要 sudo 权限?
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
# 重新登录或重启系统
Q2:容器无法访问外部网络?
# 检查容器网络配置
docker inspect my-container | grep -A 10 "Networks"
# 重启 Docker 网络
sudo systemctl restart docker
Q3:如何清理无用的资源?
# 清理停止的容器
docker container prune
# 清理未使用的镜像
docker image prune
# 清理所有无用资源
docker system prune -a
结语
Docker 已经成为现代软件开发和部署的标准工具。从简单的 docker run 开始,逐步掌握 Dockerfile、Docker Compose 和网络管理,你将能够轻松构建和部署容器化应用。
实践建议:从一个简单的 Hello World 应用开始,尝试用 Docker 容器化它,然后逐步增加复杂度。容器化的世界正在等待你探索!
本文为原创内容,基于作者实际开发经验整理。如需转载,请注明出处。
更多推荐



所有评论(0)