欢迎光临
我们一直在努力

Docker套装的简介、安装、超级详细教程

Docker 入门完整指南:容器化部署、镜像管理与 20+ 实用命令,一篇搞定!

摘要

本文是 Docker 入门的完整指南,涵盖容器化技术核心概念、Docker 安装配置、镜像与容器管理、网络存储机制、Dockerfile 编写规范以及 20+ 条高频实用命令。通过大量代码示例和对比表格,帮助开发者快速掌握 Docker 的核心操作,实现应用的快速部署与环境一致性保障。无论你是刚接触容器化的新手,还是需要系统梳理 Docker 知识体系的开发者,这篇文章都能为你提供清晰的学习路径。

Docker 是现代应用部署的基石,让"在我机器上能跑"成为历史,实现一次构建、到处运行的容器化革命!

在传统的应用部署中,开发环境、测试环境、生产环境的差异常常导致"在我机器上明明可以运行"的尴尬局面。Docker 通过容器化技术彻底解决了这个问题,它将应用及其依赖环境打包成标准化的容器镜像,确保在任何支持 Docker 的平台上都能以完全相同的方式运行。本文将带你从零开始,系统学习 Docker 的核心概念和实战技能。

一、Docker 基础概念

1.1 什么是 Docker

Docker 是一个开源的容器化平台,它通过操作系统级别的虚拟化技术,将应用程序及其依赖项打包到一个轻量级、可移植的容器中。与传统虚拟机相比,Docker 容器共享宿主机的操作系统内核,启动速度快、资源占用少、部署效率高。

Docker 的三大核心组件:

  • 镜像 (Image):只读的模板,包含运行应用所需的代码、运行时环境、库文件和配置
  • 容器 (Container):镜像的运行实例,是应用的实际运行环境
  • 仓库 (Registry):集中存储和分发镜像的服务,如 Docker Hub

1.2 Docker 与虚拟机的对比

特性Docker 容器传统虚拟机
启动速度 秒级 分钟级
性能损耗 接近原生 5%-20%
资源占用 MB 级别 GB 级别
隔离级别 进程级别 操作系统级别
可移植性 极高 一般
部署密度 单机可运行上千容器 单机几十个虚拟机

1.3 Docker 的核心优势

环境一致性:开发、测试、生产环境完全一致,消除环境差异导致的问题。

快速部署:镜像构建一次,可在任意环境快速启动,大幅缩短部署时间。

资源高效:共享宿主机内核,相比虚拟机节省大量内存和磁盘空间。

版本管理:镜像支持版本标签,便于回滚和灰度发布。

微服务支持:天然适配微服务架构,每个服务独立容器化部署。

二、Docker 安装与配置

2.1 Windows 安装 Docker Desktop

访问 Docker 官网下载 Docker Desktop for Windows,安装过程中会自动启用 WSL 2 后端支持。

安装完成后验证:

docker –version
# Docker version 24.0.6, build ed223bc

docker run hello-world
# Hello from Docker!
# This message shows that your installation appears to be working correctly.

2.2 Linux 安装 Docker Engine

在 Ubuntu/Debian 系统上安装:

# 更新包索引
sudo apt-get update

# 安装依赖
sudo apt-get install ca-certificates curl gnupg

# 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg

# 添加 Docker 仓库
echo "deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 验证安装
sudo docker run hello-world
# Hello from Docker!

2.3 配置镜像加速器

由于 Docker Hub 国内访问速度较慢,推荐配置国内镜像源:

# 编辑 Docker 配置文件
sudo nano /etc/docker/daemon.json

# 添加镜像加速地址
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com"
]
}

# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -A 5 "Registry Mirrors"
# Registry Mirrors:
# https://mirror.ccs.tencentyun.com/

2.4 非 root 用户运行 Docker

默认情况下 Docker 命令需要 sudo 权限,可将当前用户添加到 docker 用户组:

sudo usermod -aG docker $USER

# 退出并重新登录生效
newgrp docker

# 无需 sudo 运行
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

三、Docker 镜像管理

3.1 搜索镜像

# 搜索 nginx 相关镜像
docker search nginx
# NAME DESCRIPTION STARS OFFICIAL
# nginx Official build of Nginx. 19000 [OK]
# nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 850

# 限制搜索结果数量
docker search –limit 5 python
# 只显示前 5 个结果

3.2 拉取镜像

# 拉取最新版本 nginx
docker pull nginx
# Using default tag: latest
# latest: Pulling from library/nginx
# Status: Downloaded newer image for nginx:latest

# 拉取指定版本
docker pull nginx:1.25.3
# 1.25.3: Pulling from library/nginx

# 拉取特定平台镜像
docker pull –platform linux/amd64 nginx:alpine
# alpine: Pulling from library/nginx

3.3 查看本地镜像

# 列出所有镜像
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# nginx latest 605c77e624dd 2 weeks ago 141MB
# python 3.11 a5d7930b60cc 3 weeks ago 1.01GB

# 查看镜像详细信息
docker image inspect nginx:latest
# 返回 JSON 格式的详细配置信息

# 查看镜像历史层
docker history nginx:latest
# IMAGE CREATED CREATED BY SIZE
# 605c77e624dd 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon 0B

3.4 删除镜像

# 删除单个镜像
docker rmi nginx:1.25.3
# Untagged: nginx:1.25.3
# Deleted: sha256:abc123…

# 删除多个镜像
docker rmi nginx:latest python:3.11

# 强制删除正在使用的镜像
docker rmi -f nginx:latest

# 删除所有未使用的镜像
docker image prune -a
# WARNING! This will remove all images without at least one container associated to them.
# Total reclaimed space: 2.5GB

3.5 镜像导出与导入

# 将镜像保存为 tar 文件
docker save nginx:latest -o nginx_latest.tar
# 生成 nginx_latest.tar 文件

# 从 tar 文件加载镜像
docker load -i nginx_latest.tar
# Loaded image: nginx:latest

# 导出容器为镜像
docker export my_container > my_container.tar

# 导入容器快照为镜像
docker import my_container.tar my_image:v1.0
# sha256:def456…

3.6 镜像标签管理

# 为镜像添加新标签
docker tag nginx:latest myregistry.com/nginx:v1.0
# 创建新标签引用

# 查看镜像标签
docker images | grep nginx
# nginx latest 605c77e624dd 2 weeks ago 141MB
# myregistry.com/nginx v1.0 605c77e624dd 2 weeks ago 141MB

# 推送镜像到远程仓库
docker push myregistry.com/nginx:v1.0
# The push refers to repository [myregistry.com/nginx]

四、Docker 容器操作

4.1 创建并运行容器

# 运行简单容器
docker run nginx
# 前台运行,占用终端

# 后台运行容器
docker run -d nginx
# a1b2c3d4e5f6… (返回容器 ID)

# 指定容器名称
docker run -d –name my_nginx nginx
# 容器名称为 my_nginx

# 端口映射
docker run -d -p 8080:80 –name web_server nginx
# 将容器 80 端口映射到宿主机 8080 端口

# 交互式运行
docker run -it ubuntu /bin/bash
# root@abc123:/# (进入容器内部 shell)

4.2 查看容器状态

# 查看运行中的容器
docker ps
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# a1b2c3d4e5f6 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp web_server

# 查看所有容器(包括已停止)
docker ps -a
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# a1b2c3d4e5f6 nginx "nginx" 10 minutes ago Up 10 minutes 80/tcp web_server
# b2c3d4e5f6g7 ubuntu "/bin/bash" 20 minutes ago Exited (0) 15 minutes ago test_ubuntu

# 查看容器详细信息
docker inspect web_server
# 返回 JSON 格式配置信息

# 查看容器资源使用情况
docker stats web_server
# CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
# a1b2c3d4e5f6 web_server 0.01% 3.5MiB / 15.6GiB 0.02% 1.2kB / 0B 0B / 0B

4.3 容器启动与停止

# 停止容器
docker stop web_server
# web_server

# 启动已停止的容器
docker start web_server
# web_server

# 重启容器
docker restart web_server
# web_server

# 暂停容器
docker pause web_server
# web_server (容器进程被冻结)

# 恢复暂停的容器
docker unpause web_server
# web_server

# 强制杀死容器
docker kill web_server
# web_server (立即终止,不等待优雅关闭)

4.4 进入容器内部

# 使用 exec 进入运行中的容器
docker exec -it web_server /bin/bash
# root@a1b2c3d4e5f6:/# (进入容器 shell)

# 执行单条命令
docker exec web_server ls /etc/nginx
# conf.d
# fastcgi_params
# mime.types
# nginx.conf

# 以 root 用户执行命令
docker exec -u root web_server whoami
# root

4.5 容器日志查看

# 查看容器日志
docker logs web_server
# 显示容器的标准输出日志

# 实时查看日志
docker logs -f web_server
# 类似 tail -f,持续输出新日志

# 查看最近 100 行日志
docker logs –tail 100 web_server

# 显示时间戳
docker logs -t web_server
# 2024-01-15T08:30:00.123456789Z 日志内容

4.6 容器删除

# 删除已停止的容器
docker rm web_server
# web_server

# 强制删除运行中的容器
docker rm -f web_server
# web_server

# 删除所有已停止的容器
docker container prune
# WARNING! This will remove all stopped containers.
# Total reclaimed space: 150MB

# 停止并删除容器(一步到位)
docker stop web_server && docker rm web_server

4.7 容器与宿主机文件交互

# 从容器复制文件到宿主机
docker cp web_server:/etc/nginx/nginx.conf ./nginx.conf
# 将容器内配置文件复制到当前目录

# 从宿主机复制文件到容器
docker cp ./index.html web_server:/usr/share/nginx/html/
# 将本地文件复制到容器

# 挂载宿主机目录(创建容器时)
docker run -d -v /host/data:/container/data nginx
# 双向同步,容器内修改立即反映到宿主机

五、Dockerfile 镜像构建

5.1 Dockerfile 基础指令

Dockerfile 是一个文本文件,包含构建镜像的所有指令:

# 指定基础镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制文件到镜像
COPY requirements.txt .

# 执行命令
RUN pip install –no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 8000

# 设置环境变量
ENV APP_ENV=production

# 容器启动命令
CMD ["python", "app.py"]

5.2 Dockerfile 常用指令对比

指令作用示例
FROM 指定基础镜像 FROM ubuntu:22.04
WORKDIR 设置工作目录 WORKDIR /app
COPY 复制文件到镜像 COPY . /app
ADD 复制文件(支持 URL 和自动解压) ADD app.tar.gz /app
RUN 构建时执行命令 RUN apt-get update
CMD 容器启动默认命令 CMD [“nginx”, “-g”, “daemon off;”]
ENTRYPOINT 容器入口点 ENTRYPOINT [“python”]
ENV 设置环境变量 ENV NODE_ENV=production
EXPOSE 声明端口 EXPOSE 80 443
VOLUME 创建挂载点 VOLUME /data
USER 指定运行用户 USER nginx

5.3 构建镜像

# 基本构建
docker build -t myapp:v1.0 .
# Sending build context to Docker daemon 15.36MB
# Step 1/8 : FROM python:3.11-slim
# Successfully built abc123def456
# Successfully tagged myapp:v1.0

# 指定 Dockerfile 文件
docker build -f Dockerfile.prod -t myapp:prod .

# 不使用缓存构建
docker build –no-cache -t myapp:v1.0 .

# 构建时传递参数
docker build –build-arg APP_VERSION=1.0 -t myapp:v1.0 .

5.4 多阶段构建优化镜像大小

# 第一阶段:编译构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 第二阶段:运行环境
FROM alpine:latest
WORKDIR /app
COPY –from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]

构建对比:

# 单阶段构建
docker build -t myapp:single .
# 镜像大小 800MB (包含完整 Go 编译环境)

# 多阶段构建
docker build -t myapp:multi .
# 镜像大小 15MB (仅包含可执行文件和 Alpine 基础)

5.5 最佳实践示例

# Node.js 应用最佳实践
FROM node:18-alpine AS builder

# 设置工作目录
WORKDIR /app

# 先复制依赖文件(利用缓存)
COPY package*.json ./
RUN npm ci –only=production

# 再复制应用代码
COPY . .

# 构建应用
RUN npm run build

# 生产环境镜像
FROM node:18-alpine
WORKDIR /app

# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001

# 从构建阶段复制文件
COPY –from=builder –chown=nodejs:nodejs /app/dist ./dist
COPY –from=builder –chown=nodejs:nodejs /app/node_modules ./node_modules

# 切换用户
USER nodejs

# 暴露端口
EXPOSE 3000

# 健康检查
HEALTHCHECK –interval=30s –timeout=3s \\
CMD node healthcheck.js || exit 1

# 启动命令
CMD ["node", "dist/main.js"]

六、Docker 网络与存储

6.1 Docker 网络模式对比

网络模式说明使用场景
bridge 默认模式,容器独立网络栈 单机多容器互联
host 容器使用宿主机网络 需要最佳网络性能
none 无网络配置 高安全隔离场景
container 共享其他容器网络 容器间紧密协作
overlay 跨主机容器通信 Docker Swarm 集群

6.2 网络操作命令

# 创建自定义网络
docker network create my_network
# abc123def456… (返回网络 ID)

# 查看所有网络
docker network ls
# NETWORK ID NAME DRIVER SCOPE
# abc123def456 my_network bridge local
# def456ghi789 bridge bridge local

# 查看网络详情
docker network inspect my_network
# 显示网络配置和已连接容器

# 容器连接到网络
docker network connect my_network web_server

# 容器断开网络
docker network disconnect my_network web_server

# 删除网络
docker network rm my_network

# 清理未使用的网络
docker network prune
# WARNING! This will remove all custom networks not used by at least one container.

6.3 容器互联实战

# 创建自定义网络
docker network create app_network

# 启动数据库容器
docker run -d –name mysql_db –network app_network \\
-e MYSQL_ROOT_PASSWORD=secret \\
mysql:8.0
# 容器在 app_network 网络中可通过 mysql_db 主机名访问

# 启动应用容器
docker run -d –name web_app –network app_network \\
-p 8080:8000 \\
-e DB_HOST=mysql_db \\
myapp:v1.0
# 应用容器可直接通过 mysql_db 连接数据库

6.4 数据卷管理

# 创建数据卷
docker volume create my_data
# my_data

# 查看所有数据卷
docker volume ls
# DRIVER VOLUME NAME
# local my_data

# 查看数据卷详情
docker volume inspect my_data
# [
# {
# "CreatedAt": "2024-01-15T08:30:00Z",
# "Driver": "local",
# "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
# "Name": "my_data"
# }
# ]

# 使用数据卷
docker run -d -v my_data:/app/data –name app1 nginx
# 容器删除后数据卷数据依然保留

# 删除数据卷
docker volume rm my_data

# 清理未使用的数据卷
docker volume prune
# WARNING! This will remove all local volumes not used by at least one container.
# Total reclaimed space: 1.2GB

6.5 挂载方式对比

挂载方式语法特点适用场景
数据卷 -v my_vol:/data Docker 管理,持久化 数据库数据、配置文件
绑定挂载 -v /host/path:/container/path 直接挂载宿主机目录 开发环境代码同步
tmpfs –tmpfs /tmp 内存临时存储 敏感临时数据

# 数据卷挂载
docker run -d -v db_data:/var/lib/mysql mysql:8.0

# 绑定挂载
docker run -d -v /home/user/web:/usr/share/nginx/html nginx

# 只读挂载
docker run -d -v /host/config:/etc/config:ro nginx

# tmpfs 挂载
docker run -d –tmpfs /tmp:rw,noexec,nosuid nginx

七、Docker Compose 多容器编排

7.1 Docker Compose 简介

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具,通过 YAML 文件配置应用服务。

安装验证:

docker compose version
# Docker Compose version v2.23.0

7.2 Compose 文件示例

创建 docker-compose.yml:

version: '3.8'

services:
web:
build: .
ports:
"8000:8000"
volumes:
./app:/app
environment:
DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
depends_on:
db
redis
networks:
app_network

db:
image: postgres:15alpine
volumes:
db_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD=secret
POSTGRES_DB=myapp
networks:
app_network

redis:
image: redis:7alpine
networks:
app_network

volumes:
db_data:

networks:
app_network:
driver: bridge

7.3 Compose 常用命令

# 启动所有服务
docker compose up -d
# Creating network "app_network"
# Creating volume "db_data"
# Creating app_db_1 … done
# Creating app_redis_1 … done
# Creating app_web_1 … done

# 查看服务状态
docker compose ps
# NAME IMAGE STATUS PORTS
# app_web_1 app_web:latest Up 0.0.0.0:8000->8000/tcp
# app_db_1 postgres:15 Up 5432/tcp
# app_redis_1 redis:7 Up 6379/tcp

# 查看服务日志
docker compose logs web
# 显示 web 服务日志

# 实时跟踪日志
docker compose logs -f –tail=50

# 停止所有服务
docker compose stop

# 停止并删除容器
docker compose down
# Stopping app_web_1 … done
# Removing app_web_1 … done
# Removing network app_network

# 停止并删除容器、网络、数据卷
docker compose down -v
# 清理所有资源

# 重启服务
docker compose restart web

# 执行命令
docker compose exec web python manage.py migrate
# 在 web 容器中执行数据库迁移

# 扩展服务实例
docker compose up -d –scale web=3
# 启动 3 个 web 服务实例

八、Docker 实用命令速查表

8.1 系统信息命令

# 查看 Docker 版本
docker version
# Client: Docker Engine – Community
# Version: 24.0.6

# 查看 Docker 系统信息
docker info
# Containers: 5
# Images: 20
# Storage Driver: overlay2

# 查看磁盘占用
docker system df
# TYPE TOTAL ACTIVE SIZE RECLAIMABLE
# Images 20 5 4.5GB 2.3GB (51%)
# Containers 5 2 150MB 100MB (66%)
# Local Volumes 8 3 1.2GB 800MB (66%)

8.2 清理命令

# 清理所有未使用的资源
docker system prune -a
# WARNING! This will remove:
# – all stopped containers
# – all networks not used by at least one container
# – all images without at least one container associated to them
# – all build cache
# Total reclaimed space: 5.2GB

# 仅清理构建缓存
docker builder prune
# Total reclaimed space: 1.5GB

# 清理指定时间前的资源
docker system prune -a –filter "until=24h"
# 清理 24 小时前的未使用资源

# 查看将被清理的内容
docker system prune –dry-run
# 预览清理结果,不实际删除

8.3 容器批量操作命令

# 停止所有运行中的容器
docker stop $(docker ps -q)
# 返回所有容器 ID 并逐个停止

# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)
# 筛选已退出容器并删除

# 删除所有容器
docker rm -f $(docker ps -aq)
# 强制删除所有容器

# 删除所有镜像
docker rmi $(docker images -q)
# 删除本地所有镜像

# 删除悬空镜像
docker rmi $(docker images -f "dangling=true" -q)
# 删除 tag 为 none 的镜像

8.4 监控与调试命令

# 实时查看容器资源使用
docker stats
# CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O
# a1b2c3d4e5f6 web 0.5% 50MiB / 2GiB 2.5% 1.2MB / 800kB

# 查看容器进程
docker top web_server
# PID USER TIME COMMAND
# 12345 root 0:00 nginx: master process
# 12346 nginx 0:01 nginx: worker process

# 查看容器端口映射
docker port web_server
# 80/tcp -> 0.0.0.0:8080

# 查看容器文件系统变化
docker diff web_server
# C /var
# C /var/log
# A /var/log/nginx/access.log

# 导出容器文件系统
docker export web_server > web_server.tar
# 导出为 tar 归档文件

# 实时监控 Docker 事件
docker events
# 实时显示 Docker 守护进程事件流

九、Docker 高级应用场景

9.1 CI/CD 集成

在 GitLab CI 中使用 Docker:

stages:
build
test
deploy

build_image:
stage: build
script:
docker build t myapp:$CI_COMMIT_SHA .
docker tag myapp:$CI_COMMIT_SHA myapp:latest
docker push myapp:$CI_COMMIT_SHA

run_tests:
stage: test
script:
docker run rm myapp:$CI_COMMIT_SHA npm test

deploy_prod:
stage: deploy
script:
docker pull myapp:$CI_COMMIT_SHA
docker stop myapp_prod || true
docker rm myapp_prod || true
docker run d name myapp_prod p 80:8000 myapp:$CI_COMMIT_SHA
only:
main

9.2 健康检查配置

在 Dockerfile 中添加健康检查:

FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf
COPY html /usr/share/nginx/html

HEALTHCHECK –interval=30s –timeout=3s –start-period=5s –retries=3 \\
CMD wget –quiet –tries=1 –spider http://localhost/ || exit 1

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

运行时配置健康检查:

docker run -d \\
–name web \\
–health-cmd="curl -f http://localhost/ || exit 1" \\
–health-interval=30s \\
–health-timeout=3s \\
–health-retries=3 \\
nginx

# 查看健康状态
docker inspect –format='{{.State.Health.Status}}' web
# healthy

9.3 资源限制

# 限制内存和 CPU
docker run -d \\
–name resource_limited \\
–memory="512m" \\
–memory-swap="1g" \\
–cpus="1.5" \\
nginx

# 限制磁盘 IO
docker run -d \\
–device-read-bps /dev/sda:1mb \\
–device-write-bps /dev/sda:1mb \\
nginx

# 限制网络带宽需要配合 tc 工具
docker run -d –name web nginx
docker exec web tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

# 查看容器资源限制
docker inspect –format='{{.HostConfig.Memory}}' resource_limited
# 536870912 (512MB)

9.4 日志管理

配置日志驱动:

# 使用 json-file 驱动并限制大小
docker run -d \\
–log-driver json-file \\
–log-opt max-size=10m \\
–log-opt max-file=3 \\
nginx

# 使用 syslog 驱动
docker run -d \\
–log-driver syslog \\
–log-opt syslog-address=tcp://192.168.1.100:514 \\
nginx

# 使用 fluentd 驱动
docker run -d \\
–log-driver fluentd \\
–log-opt fluentd-address=localhost:24224 \\
nginx

# 禁用日志
docker run -d –log-driver none nginx

9.5 安全加固

# 以只读模式运行容器
docker run -d –read-only –tmpfs /tmp nginx

# 限制容器权限
docker run -d –cap-drop ALL –cap-add NET_BIND_SERVICE nginx

# 使用非 root 用户
docker run -d –user 1000:1000 nginx

# 禁止特权模式
docker run -d –security-opt no-new-privileges nginx

# 使用 AppArmor 配置
docker run -d –security-opt apparmor=docker-default nginx

# 扫描镜像漏洞
docker scout cves nginx:latest
# 显示镜像中的安全漏洞

十、20+ Docker 实用命令汇总

10.1 镜像管理命令集

# 1. 搜索镜像
docker search nginx –limit 5

# 2. 拉取镜像
docker pull nginx:alpine

# 3. 查看本地镜像
docker images

# 4. 删除镜像
docker rmi nginx:alpine

# 5. 保存镜像到文件
docker save nginx:latest -o nginx.tar

# 6. 从文件加载镜像
docker load -i nginx.tar

# 7. 为镜像打标签
docker tag nginx:latest myregistry.com/nginx:v1

# 8. 推送镜像到仓库
docker push myregistry.com/nginx:v1

10.2 容器操作命令集

# 9. 创建并运行容器
docker run -d –name web -p 8080:80 nginx

# 10. 查看运行中的容器
docker ps

# 11. 查看所有容器
docker ps -a

# 12. 停止容器
docker stop web

# 13. 启动容器
docker start web

# 14. 重启容器
docker restart web

# 15. 删除容器
docker rm -f web

# 16. 进入容器
docker exec -it web /bin/bash

# 17. 查看容器日志
docker logs -f web

# 18. 复制文件
docker cp web:/etc/nginx/nginx.conf ./

10.3 系统管理命令集

# 19. 查看系统信息
docker info

# 20. 查看磁盘占用
docker system df

# 21. 清理未使用资源
docker system prune -a

# 22. 查看实时资源占用
docker stats

# 23. 查看容器详细信息
docker inspect web

# 24. 监控 Docker 事件
docker events –since '2024-01-15T00:00:00'

10.4 网络与存储命令集

# 25. 创建网络
docker network create my_network

# 26. 查看网络列表
docker network ls

# 27. 创建数据卷
docker volume create my_data

# 28. 查看数据卷列表
docker volume ls

# 29. 清理未使用的数据卷
docker volume prune

十一、Docker 最佳实践总结

11.1 镜像构建最佳实践

使用官方基础镜像:优先选择官方认证的基础镜像,如 python:3.11-slim、node:18-alpine。

多阶段构建减小体积:分离编译环境和运行环境,最终镜像仅包含必要的运行时文件。

利用构建缓存:将不常变化的指令放在前面(如依赖安装),将频繁变化的指令放在后面(如代码复制)。

最小化镜像层数:合并多个 RUN 命令,减少镜像层数和体积。

使用 .dockerignore:排除不必要的文件,加快构建速度和减小镜像体积。

11.2 容器运行最佳实践

一个容器一个进程:遵循单一职责原则,每个容器只运行一个主进程。

使用非 root 用户:提高安全性,避免以 root 用户运行应用。

配置资源限制:为容器设置合理的 CPU 和内存限制,防止资源耗尽。

健康检查:为长期运行的服务配置健康检查,确保服务可用性。

日志管理:配置日志驱动和日志轮转,避免日志文件无限增长。

11.3 安全性最佳实践

定期更新基础镜像:及时更新镜像以修复已知安全漏洞。

扫描镜像漏洞:使用 docker scout 或 Trivy 等工具定期扫描镜像。

最小权限原则:仅授予容器必需的权限,使用 –cap-drop 移除不需要的 Linux capabilities。

敏感信息管理:使用 Docker Secrets 或环境变量管理敏感信息,不要硬编码在镜像中。

网络隔离:使用自定义网络隔离不同应用的容器,避免使用默认 bridge 网络。

11.4 性能优化最佳实践

使用 Alpine 基础镜像:体积小、启动快,适合大多数场景。

启用 BuildKit:使用新版构建引擎,支持并行构建和更好的缓存机制。

优化镜像层:删除不必要的临时文件,清理包管理器缓存。

使用数据卷:持久化数据使用数据卷而非容器文件系统,提高 IO 性能。

合理配置重启策略:生产环境使用 –restart=unless-stopped 确保服务高可用。

十二、常见问题与解决方案

12.1 容器无法访问

问题:宿主机无法访问容器服务。

解决方案:

  • 检查端口映射是否正确:docker ps 查看 PORTS 列
  • 确认防火墙规则:sudo ufw allow 8080
  • 检查容器服务是否启动:docker logs container_name
  • 验证容器 IP:docker inspect container_name | grep IPAddress

12.2 镜像拉取失败

问题:docker pull 超时或失败。

解决方案:

  • 配置国内镜像加速器(见 2.3 节)
  • 检查网络连接:ping hub.docker.com
  • 使用代理:docker run –env HTTP_PROXY=http://proxy:port …
  • 手动下载镜像 tar 包后 docker load 导入

12.3 容器磁盘空间不足

问题:提示 no space left on device。

解决方案:

  • 清理未使用资源:docker system prune -a –volumes
  • 查看磁盘占用:docker system df
  • 配置日志轮转:–log-opt max-size=10m –log-opt max-file=3
  • 迁移 Docker 数据目录到更大分区

12.4 容器间无法通信

问题:同一主机上的容器无法互相访问。

解决方案:

  • 确保容器在同一自定义网络:docker network connect my_network container1
  • 使用容器名代替 IP:ping container2_name
  • 检查网络模式:docker inspect container1 | grep NetworkMode
  • 避免使用默认 bridge 网络,创建自定义网络

12.5 容器内时间不准确

问题:容器内时间与宿主机不一致。

解决方案:

  • 挂载宿主机时区:-v /etc/localtime:/etc/localtime:ro
  • 设置时区环境变量:-e TZ=Asia/Shanghai
  • 在 Dockerfile 中配置:ENV TZ=Asia/Shanghai

十三、总结速查表

Docker 核心概念对比

概念说明类比
镜像 只读模板 类的定义
容器 镜像的运行实例 类的实例对象
仓库 镜像存储中心 GitHub 代码仓库
数据卷 持久化存储 外接硬盘
网络 容器通信通道 局域网

常用操作命令速记

操作类型常用命令说明
拉取镜像 docker pull nginx:alpine 从仓库下载镜像
运行容器 docker run -d -p 8080:80 nginx 后台运行并映射端口
查看容器 docker ps -a 查看所有容器
进入容器 docker exec -it web /bin/bash 交互式进入容器
查看日志 docker logs -f web 实时查看容器日志
停止容器 docker stop web 优雅停止容器
删除容器 docker rm -f web 强制删除容器
构建镜像 docker build -t myapp:v1 . 从 Dockerfile 构建
清理资源 docker system prune -a 清理所有未使用资源

Dockerfile 指令速记

指令用途示例
FROM 基础镜像 FROM python:3.11-slim
WORKDIR 工作目录 WORKDIR /app
COPY 复制文件 COPY . /app
RUN 执行命令 RUN pip install -r requirements.txt
EXPOSE 暴露端口 EXPOSE 8000
ENV 环境变量 ENV APP_ENV=production
CMD 启动命令 CMD [“python”, “app.py”]

学习路径建议

第一阶段:掌握基础概念和镜像容器操作(1-3 天)

  • 理解镜像、容器、仓库的关系
  • 学会 pull、run、ps、logs、exec 等基础命令
  • 能够运行官方镜像并进行简单配置

第二阶段:学习 Dockerfile 和镜像构建(3-5 天)

  • 编写简单的 Dockerfile
  • 理解镜像层和构建缓存机制
  • 掌握多阶段构建优化镜像大小

第三阶段:掌握网络和存储管理(5-7 天)

  • 理解不同网络模式的使用场景
  • 掌握数据卷的创建和挂载
  • 能够实现多容器互联

第四阶段:Docker Compose 多容器编排(7-10 天)

  • 编写 docker-compose.yml 配置文件
  • 管理多服务应用栈
  • 实现开发环境快速搭建

第五阶段:生产环境最佳实践(持续学习)

  • 安全加固和权限管理
  • 监控日志和故障排查
  • CI/CD 集成和自动化部署

通过本文的系统学习,你已经掌握了 Docker 从入门到实战的完整知识体系。Docker 作为现代应用部署的标准工具,将大幅提升你的开发效率和部署可靠性。建议在实际项目中多加练习,逐步掌握容器化技术的精髓。

如果这篇文章对你有帮助,欢迎在评论区分享你的 Docker 使用经验或遇到的问题,我们一起交流学习!

赞(0)
未经允许不得转载:171主机测评 » Docker套装的简介、安装、超级详细教程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址