Docker 核心概念

容器化技术

  • Docker 使用容器化技术为应用程序封装独立的运行环境
  • 每个运行环境就是一个容器
  • 运行容器的计算机被称为宿主机

Docker vs 虚拟机

  • Docker 容器:共用同一个系统内核
  • 虚拟机:每个虚拟机都包含操作系统的完整内核
  • 优势:Docker 容器更轻更小,启动速度更快

镜像与容器关系

  • 镜像:容器的母版,类比软件安装包
  • 容器:安装出来的软件
  • 比喻:镜像就像模具,容器就像用模具制作出的糕点

Docker 仓库

  • Docker Hub 是官方仓库,存储共享的镜像
  • 用户可以上传自己的镜像到仓库,其他人可以下载使用

Docker 安装指南

Linux 系统安装

  1. 访问 get.docker.com 获取安装步骤
  2. 执行第一步和第四步的命令
  3. 非 root 用户需要在 Docker 命令前加 sudo

  • docker-ce:Docker Engine 守护进程
  • docker-ce-cli:docker 命令行
  • containerd.io
  • docker-buildx-plugin
  • docker-compose-plugin
  1. sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1) 卸载遗留环境(bash shell下)
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
  1. sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  2. 确认存活sudo systemctl status docker
  3. sudo systemctl start docker手动启动docker
  4. sudo docker run hello-world

卸载

sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
 
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
 
sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc
 

Windows 系统安装

  1. 启用 Windows 功能:

    • WSL 2
    • 虚拟机平台
  2. 重启电脑后安装 WSL:

    wsl --set-default-version 2
    wsl --update
  3. 下载 Docker Desktop 安装包(AMD64 架构)

  4. 安装后保持 Docker Desktop 运行

macOS 系统安装

  • 根据芯片类型下载对应的安装包
  • 直接安装即可

镜像站配置 解决网络问题

  • Linux:修改配置文件 /etc/docker/daemon.json
  • Windows/macOS:在 Docker Desktop 设置中添加镜像站

Docker 镜像管理

镜像命名结构

docker.io/library/nginx:latest
  • docker.io:Registry(仓库地址)
  • library:Namespace(命名空间)
  • nginx:镜像名称
  • latest:Tag(标签/版本号)

简化形式docker pull nginx

  • 官方仓库:Docker Hub

  • 镜像站:提供相同功能

  • docker images:列出所有下载的镜像

  • docker rmi:删除镜像

  • docker pull --platform:拉取特定 CPU 架构的镜像

  • 默认自动选择最适合当前宿主机架构的镜像

  • 树莓派使用 ARM64 架构

  • Mac 电脑使用 QEMU 模拟 x86_64 架构

Docker 容器操作

  • docker run:创建并运行容器

  • docker ps:查看运行中的容器

  • docker stop:停止容器

  • docker start:启动已停止的容器

  • Container ID:唯一标识符

  • Image:基于哪个镜像创建

  • Names:容器名称(自动分配或自定义)

后台运行

docker run -d nginx
  • -d:分离模式,容器在后台运行

端口映射

docker run -p 80:80 nginx
  • -p:端口映射(宿主机端口:容器端口)
  • 顺序:先外后内

目录挂载

docker run -v /host/path:/container/path nginx
  • -v:目录绑定挂载
  • 作用:数据持久化存储

挂载类型

  • 绑定挂载:直接指定宿主机目录
  • 命名卷挂载:Docker 自动创建存储空间

环境变量

docker run -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=password mongo
  • -e:传递环境变量到容器

容器命名

docker run --name my-container nginx
  • --name:自定义容器名称(必须唯一)

交互式容器

docker run -it --rm ubuntu bash
  • -it:交互式终端
  • --rm:容器停止时自动删除

重启策略

docker run --restart=always nginx
  • --restart=always:容器停止时立即重启
  • --restart=unless-stopped:手动停止的容器不重启

容器调试

  • docker exec:在容器内执行命令
  • docker exec -it container_id bash:进入容器交互环境
  • docker logs:查看容器日志
  • docker logs -f:滚动查看日志

容器信息查看

  • docker inspect:查看容器详细信息
  • 可查看端口映射、挂载卷等配置

Docker 网络配置

给docker daemon配置代理

sudo mkdir -p /etc/systemd/system/docker.service.d
 
cat <<'EOF' | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf >/
  dev/null
  [Service]
  Environment="HTTP_PROXY=http://127.0.0.1:7890"
  Environment="HTTPS_PROXY=http://127.0.0.1:7890"
  Environment="ALL_PROXY=socks5://127.0.0.1:7890"
  Environment="NO_PROXY=localhost,127.0.0.1,::1"
  EOF
 
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl show --property=Environment docker
sudo docker pull hello-world

每次修改后重启daemon和docker

  sudo systemctl daemon-reload
  sudo systemctl restart docker

网络模式

Bridge 模式(默认)

  • 所有容器默认连接到 bridge 网络
  • 容器分配内部 IP 地址(172.17.x.x)
  • 容器网络与宿主机网络隔离

创建子网

docker network create network1

优势

  • 同一子网的容器可以互相通信
  • 可以使用容器名称互相访问(DNS 机制)
  • 跨子网不可通信

Host 模式

docker run --network=host nginx
  • 容器直接共享宿主机网络
  • 使用宿主机 IP 地址
  • 无需端口映射

None 模式

  • 容器不连接网络

网络管理命令

  • docker network ls:列出所有网络
  • docker network rm:删除网络

Dockerfile 与镜像构建

Dockerfile 基础

  • Dockerfile 是制作镜像的”图纸”
  • 详细列出镜像的制作步骤

Dockerfile 示例

FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "main.py"]

指令说明

  • FROM:基础镜像
  • WORKDIR:设置工作目录
  • COPY:复制文件到镜像
  • RUN:执行命令
  • EXPOSE:声明服务端口
  • CMD:容器启动命令
  • ENTRYPOINT:入口点(优先级更高)

镜像构建与推送

# 构建镜像
docker build -t username/imagename:tag .
 
# 登录 Docker Hub
docker login
 
# 推送镜像
docker push username/imagename:tag

Docker Compose 编排

多容器应用

最佳实践:每个模块打包成独立容器

  • 避免单点故障
  • 便于精准扩容

Docker Compose 文件

services:
  mongodb:
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=password
    networks:
      - app-network
 
  mongo-express:
    image: mongo-express
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=admin
      - ME_CONFIG_MONGODB_ADMINPASSWORD=password
      - ME_CONFIG_MONGODB_SERVER=mongodb
    ports:
      - "8081:8081"
    networks:
      - app-network
    depends_on:
      - mongodb
 
networks:
  app-network:
    driver: bridge

Compose 命令

  • docker compose up:启动所有服务
  • docker compose up -d:后台启动
  • docker compose down:停止并删除容器
  • docker compose stop:只停止不删除
  • docker compose start:启动已停止的服务

文件命名

  • 标准文件名:docker-compose.yml
  • 非标准文件:docker compose -f filename.yml up