初识Docker:从基础概念到实战安装的完全指南

初识Docker:从基础概念到实战安装的完全指南

一、Docker核心概念解析

1.1 镜像(Image):容器的基石

Docker镜像本质上是分层存储的文件系统,采用UnionFS技术将多个只读层叠加形成完整文件系统。每个镜像包含:

  • 基础系统(如Ubuntu、CentOS)
  • 预装软件(如Nginx、MySQL)
  • 配置文件与环境变量

镜像特点

  • 不可变性:创建后无法修改,只能通过新建版本迭代
  • 版本控制:支持标签(tag)管理不同版本(如nginx:latest、nginx:1.25.3)
  • 轻量化:通过共享基础层减少存储占用

典型镜像结构

  1. /var/lib/docker/overlay2/
  2. ├── l/(链接目录)
  3. └── <ID>/(镜像层目录)
  4. ├── diff/(实际文件)
  5. ├── link/(元数据)
  6. └── layer.tar(压缩层)

1.2 容器(Container):镜像的运行实例

容器是镜像的可写运行时环境,通过添加可写层实现:

  • 独立进程空间:每个容器拥有独立PID命名空间
  • 资源隔离:通过cgroups限制CPU、内存使用
  • 网络隔离:默认桥接网络,支持自定义网络

容器生命周期

  1. graph TD
  2. A[创建容器] --> B{运行状态}
  3. B -->|running| C[执行命令]
  4. B -->|paused| D[暂停状态]
  5. B -->|exited| E[停止状态]
  6. C --> F[退出]
  7. F --> B

1.3 仓库(Registry):镜像的存储中心

Docker仓库分为:

  • 官方仓库:Docker Hub(默认),包含200,000+镜像
  • 私有仓库:企业自建的Harbor、Nexus等
  • 第三方仓库:阿里云、腾讯云等提供的镜像服务

仓库操作流程

  1. # 登录仓库
  2. docker login registry.example.com
  3. # 推送镜像
  4. docker tag myapp:v1 registry.example.com/user/myapp:v1
  5. docker push registry.example.com/user/myapp:v1
  6. # 拉取镜像
  7. docker pull registry.example.com/user/myapp:v1

二、Docker安装全攻略

2.1 Linux系统安装(Ubuntu 22.04示例)

步骤1:卸载旧版本

  1. sudo apt-get remove docker docker-engine docker.io containerd runc

步骤2:安装依赖

  1. sudo apt-get update
  2. sudo apt-get install -y \
  3. apt-transport-https \
  4. ca-certificates \
  5. curl \
  6. gnupg \
  7. lsb-release

步骤3:添加GPG密钥

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

步骤4:设置稳定版仓库

  1. echo \
  2. "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  3. $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

步骤5:安装Docker引擎

  1. sudo apt-get update
  2. sudo apt-get install -y docker-ce docker-ce-cli containerd.io

步骤6:验证安装

  1. sudo docker run --rm hello-world

2.2 Windows系统安装(WSL2后端)

前提条件

  • Windows 10/11专业版/企业版
  • 启用WSL2功能
  • 开启虚拟化支持(BIOS设置)

安装步骤

  1. 安装WSL2核心

    1. wsl --install
  2. 更新WSL2内核

    1. Invoke-WebRequest -Uri https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi -OutFile wsl_update_x64.msi -UseBasicParsing
    2. Start-Process msiexec.exe -Wait -ArgumentList "/i wsl_update_x64.msi"
  3. 安装Docker Desktop

  • 下载Docker Desktop for Windows
  • 安装时选择Use WSL 2 instead of Hyper-V
  1. 配置WSL2集成
    1. # 在PowerShell中设置默认WSL版本
    2. wsl --set-default-version 2

2.3 macOS系统安装(Homebrew方式)

安装步骤

  1. 安装Homebrew(如未安装)

    1. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. 通过Homebrew安装Docker

    1. brew install --cask docker
  3. 启动Docker Desktop

    1. open /Applications/Docker.app
  4. 验证安装

    1. docker --version
    2. docker run --rm hello-world

三、Docker基础操作实战

3.1 镜像管理命令

搜索镜像

  1. docker search nginx
  2. # 输出示例:
  3. # NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  4. # nginx Official build 19283 [OK]

拉取镜像

  1. docker pull nginx:alpine # 轻量版
  2. docker pull mysql:8.0.33 # 指定版本

查看本地镜像

  1. docker images
  2. # 输出示例:
  3. # REPOSITORY TAG IMAGE ID CREATED SIZE
  4. # nginx latest 605c77e624dd 2 weeks ago 188MB

删除镜像

  1. docker rmi nginx:latest # 删除指定镜像
  2. docker rmi $(docker images -q) # 删除所有镜像(谨慎使用)

3.2 容器生命周期管理

创建并启动容器

  1. docker run -d --name mynginx \
  2. -p 8080:80 \
  3. -v /host/path:/usr/share/nginx/html \
  4. nginx:latest

参数说明:

  • -d:后台运行
  • --name:指定容器名
  • -p:端口映射(主机端口:容器端口)
  • -v:卷挂载(主机目录:容器目录)

进入运行中容器

  1. docker exec -it mynginx /bin/bash
  2. # 在容器内执行命令后,退出使用exit

查看容器日志

  1. docker logs -f mynginx # 实时跟踪日志
  2. docker logs --tail=100 mynginx # 查看最后100行

停止/启动容器

  1. docker stop mynginx # 优雅停止
  2. docker kill mynginx # 强制终止
  3. docker start mynginx # 启动已停止容器
  4. docker restart mynginx # 重启容器

3.3 容器网络配置

查看网络列表

  1. docker network ls
  2. # 输出示例:
  3. # NETWORK ID NAME DRIVER SCOPE
  4. # a1b2c3d4e5f6 bridge bridge local

创建自定义网络

  1. docker network create --driver bridge mynet

连接容器到网络

  1. docker run -d --name web1 --network mynet nginx
  2. docker run -d --name web2 --network mynet nginx

测试网络连通性

  1. # 在web1容器内ping web2
  2. docker exec -it web1 ping web2

四、Dockerfile实战:构建自定义镜像

4.1 基础Dockerfile示例

  1. # 使用官方Python镜像作为基础
  2. FROM python:3.9-slim
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制依赖文件并安装
  6. COPY requirements.txt .
  7. RUN pip install --no-cache-dir -r requirements.txt
  8. # 复制应用代码
  9. COPY . .
  10. # 暴露端口
  11. EXPOSE 8000
  12. # 定义启动命令
  13. CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]

4.2 多阶段构建优化

  1. # 构建阶段
  2. FROM golang:1.20 AS builder
  3. WORKDIR /app
  4. COPY . .
  5. RUN go build -o myapp .
  6. # 运行阶段
  7. FROM alpine:latest
  8. WORKDIR /app
  9. COPY --from=builder /app/myapp .
  10. CMD ["./myapp"]

4.3 最佳实践建议

  1. 镜像分层优化

    • 将不常变更的操作(如安装依赖)放在前面
    • 使用.dockerignore文件排除无关文件
  2. 安全加固

    • 避免使用root用户运行应用
    • 定期更新基础镜像
  3. 缓存利用

    • COPY requirements.txt .RUN pip install分开
    • 修改代码时不会重新安装依赖

五、Docker Compose入门

5.1 基础配置示例

  1. version: '3.8'
  2. services:
  3. web:
  4. image: nginx:latest
  5. ports:
  6. - "8080:80"
  7. volumes:
  8. - ./html:/usr/share/nginx/html
  9. db:
  10. image: mysql:8.0
  11. environment:
  12. MYSQL_ROOT_PASSWORD: example
  13. MYSQL_DATABASE: mydb
  14. volumes:
  15. - db_data:/var/lib/mysql
  16. volumes:
  17. db_data:

5.2 常用命令

  1. # 启动服务
  2. docker-compose up -d
  3. # 查看服务状态
  4. docker-compose ps
  5. # 停止服务
  6. docker-compose down
  7. # 重建服务
  8. docker-compose up --build

六、常见问题解决方案

6.1 端口冲突处理

问题现象

  1. Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

解决方案

  1. 查找占用端口的进程

    1. sudo lsof -i :80
  2. 终止冲突进程或修改容器端口映射

6.2 镜像拉取缓慢

优化方法

  1. 配置国内镜像加速器(以阿里云为例)

    1. // /etc/docker/daemon.json
    2. {
    3. "registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]
    4. }
  2. 重启Docker服务

    1. sudo systemctl restart docker

6.3 容器无法访问互联网

排查步骤

  1. 检查容器网络模式

    1. docker inspect <容器ID> | grep NetworkMode
  2. 测试DNS解析

    1. docker exec -it <容器ID> cat /etc/resolv.conf
    2. docker exec -it <容器ID> ping google.com
  3. 解决方案:

    • 使用--dns参数指定DNS服务器
    • 创建自定义网络并配置DNS

七、进阶学习路径

  1. 容器编排:学习Kubernetes或Docker Swarm
  2. 安全实践:研究Docker安全基准(CIS Docker Benchmark)
  3. 性能优化:掌握cgroups资源限制和内核参数调优
  4. CI/CD集成:将Docker与Jenkins、GitLab CI等工具结合

通过本文的系统学习,您已掌握Docker从基础概念到实战操作的核心技能。建议从简单应用容器化开始,逐步实践多容器部署和网络配置,最终实现生产环境的容器化改造。