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 容器化它,然后逐步增加复杂度。容器化的世界正在等待你探索!


本文为原创内容,基于作者实际开发经验整理。如需转载,请注明出处。

更多推荐