Docker 容器化技术完全指南:从零掌握安装部署与常见问题解决

目录

Docker 容器化技术完全指南:从零掌握安装部署与常见问题解决

Docker 作为现代软件开发和运维的核心工具,已经成为每位开发者必须掌握的技能。本文从容器化基础讲起,涵盖 Docker 安装、镜像管理、容器操作、Docker Compose 编排,以及在实际使用中最常见的数十个问题的解决方案。

一、容器化基础概念

什么是容器

容器(Container)是一种轻量级的虚拟化技术,它与传统的虚拟机(VM)有本质区别。虚拟机需要完整的操作系统,而容器共享宿主机的内核,只是在进程层面进行隔离。这意味着容器启动更快、占用资源更少、迁移更方便。

Docker 与虚拟机的区别

虚拟机运行完整的操作系统,包括内核,因此占用数 GB 磁盘空间,启动时间通常需要几分钟。而 Docker 容器共享宿主机的 Linux 内核,容器镜像通常只有几十到几百 MB,启动时间以秒计算。

在资源占用上,虚拟机需要为每个 VM 分配固定的 CPU、内存和磁盘,而容器可以更灵活地共享和调度资源。一台 4GB 内存的服务器可能只能运行 2-3 个虚拟机,但可以轻松运行 20-30 个容器。

Docker 的核心组件

Docker Engine 是 Docker 的核心,包括三个关键组件。Docker Daemon(dockerd)是运行在后台的服务进程,负责管理镜像、容器、网络和存储卷。Docker CLI(docker)是命令行客户端,用户通过它与 Docker Daemon 通信。Docker Registry 是存储和分发镜像的仓库,Docker Hub 是官方提供的公共仓库。

二、Docker 安装详解

Ubuntu 系统安装 Docker

最推荐的安装方式是使用官方安装脚本,这种方式会自动检测系统环境并配置所有依赖。首先确保系统具备必要的前置条件:

“`bash

更新软件包索引

sudo apt update

安装基础依赖

sudo apt install -y ca-certificates curl gnupg lsb-release

添加 Docker 的官方 GPG 密钥

sudo mkdir -p /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 Engine

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

将当前用户加入 docker 组(避免每次使用 sudo)

sudo usermod -aG docker $USER
newgrp docker
“`

安装完成后,验证 Docker 是否正常运行:

“`bash

检查 Docker 版本

docker –version

运行测试容器

docker run hello-world

查看 Docker 服务状态

sudo systemctl status docker
“`

CentOS / RHEL 系统安装 Docker

CentOS 系统推荐使用 yum 或 dnf 安装。首先移除可能存在的旧版本 Docker:

“`bash

移除旧版本

sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装依赖包

sudo yum install -y yum-utils

添加 Docker 仓库

sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker

sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动并设置开机自启

sudo systemctl start docker
sudo systemctl enable docker

验证安装

sudo docker run hello-world
“`

Windows 系统安装 Docker Desktop

Windows 用户需要使用 Docker Desktop,这是 Docker 官方提供的 Windows 容器解决方案。系统要求 Windows 10/11 专业版或企业版,并且需要启用 WSL 2(Windows Subsystem for Linux 2)或 Hyper-V。

从 Docker 官网下载 Docker Desktop 安装包,双击运行安装程序。安装过程中会提示启用 WSL 2 或 Hyper-V,这两个功能都是 Docker Desktop 运行所必需的。安装完成后,Docker Desktop 会自动启动,在系统托盘可以看到 Docker 的鲸鱼图标。

打开 PowerShell 或 Windows Terminal,验证 Docker Desktop 是否正常运行:

“`powershell
docker –version
docker run hello-world
“`

如果遇到 “WSL 2 installation is incomplete” 错误,需要手动安装 WSL 2:

“`powershell
wsl –install -d Ubuntu
wsl –set-default-version 2
“`

macOS 系统安装 Docker Desktop

macOS 用户同样使用 Docker Desktop。系统要求 macOS 11 或更高版本。从 Docker 官网下载 Docker Desktop for Mac 的 dmg 文件,挂载后将 Docker 应用拖入应用程序文件夹即可。

安装完成后,在终端中验证:

“`bash
docker –version
docker run hello-world
“`

Docker 安装脚本(通用方法)

对于快速体验或测试环境,可以使用官方的一键安装脚本。这个脚本会自动检测操作系统并选择最佳的安装方式:

“`bash

下载并执行官方安装脚本

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

对于国内服务器,可以使用阿里云镜像加速

curl -fsSL https://get.docker.com | sh -s — –mirror Aliyun
“`

安装脚本方式简单快捷,但不适合生产环境,因为无法精细控制安装选项。

三、Docker 配置与加速

配置 Docker 镜像加速器

国内访问 Docker Hub 速度较慢,需要配置镜像加速器。阿里云、腾讯云、网易等云服务商都提供免费的 Docker 镜像加速服务。以阿里云为例:

“`bash

创建 Docker 配置目录

sudo mkdir -p /etc/docker

配置镜像加速器(请替换为你的阿里云镜像加速地址)

sudo tee /etc/docker/daemon.json <{
“registry-mirrors”: [
“https://your-id.mirror.aliyuncs.com”,
“https://docker.mirrors.ustc.edu.cn”,
“https://hub-mirror.c.163.com”
],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”,
“max-file”: “3”
},
“storage-driver”: “overlay2”
}
EOF

重启 Docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

验证加速器配置

docker info | grep -A 5 “Registry Mirrors”
“`

Docker Daemon 配置文件

Docker Daemon 的行为可以通过 /etc/docker/daemon.json 进行精细控制。以下是生产环境推荐的配置:

“`json
{
“registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn”],
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”,
“max-file”: “3”
},
“storage-driver”: “overlay2”,
“storage-opts”: [“overlay2.override_kernel_check=true”],
“live-restore”: true,
“default-ulimits”: {
“nofile”: {
“Name”: “nofile”,
“Hard”: 64000,
“Soft”: 64000
}
},
“dns”: [“8.8.8.8”, “8.8.4.4”],
“mtu”: 1450
}
“`

live-restore 参数确保在 Docker 守护进程重启时,容器继续保持运行。default-ulimits 设置了默认的文件描述符限制,避免容器内出现 “Too many open files” 错误。

配置 Docker Hub 镜像代理

如果你的服务器在企业内网,无法直接访问 Docker Hub,可以配置镜像代理:

“`json
{
“registry-mirrors”: [],
“registry-proxy”: {
“enabled”: true,
“host”: “127.0.0.1”,
“port”: 3128
}
}
“`

四、Docker 核心概念与命令

镜像、容器、仓库的关系

理解 Docker 需要掌握三个核心概念。镜像(Image)是容器的模板,类似面向对象编程中的类,它包含运行应用程序所需的所有文件系统、内容和参数。镜像是只读的,分层存储,每一层代表 Dockerfile 中的一行指令。

容器(Container)是镜像的运行实例,类似面向对象编程中的对象。我们可以从同一个镜像启动多个容器,每个容器都是相互隔离的。容器可以被创建、启动、停止、删除和暂停。

仓库(Repository)是存储和分发镜像的地方,类似 Git 的远程仓库。Docker Hub 是官方公共仓库,包含数十万个镜像。私有仓库如 Harbor、GitLab Container Registry 用于存储企业内部的镜像。

常用镜像管理命令

“`bash

搜索镜像

docker search nginx

拉取镜像(不指定标签则默认 latest)

docker pull nginx:latest
docker pull ubuntu:22.04
docker pull mysql:8.0

查看本地镜像列表

docker images
docker image ls

查看镜像详细信息

docker image inspect nginx:latest

删除镜像(如果容器正在使用则无法删除)

docker rmi nginx:latest
docker image prune -a # 删除所有未使用的镜像

标记镜像(用于推送到私有仓库)

docker tag nginx:latest myregistry.com/nginx:latest

推送镜像到仓库

docker push myregistry.com/nginx:latest
“`

常用容器管理命令

“`bash

创建并启动容器

docker run -it –name myubuntu ubuntu:22.04 /bin/bash

参数说明:

-i: 交互模式

-t: 分配伪终端

-d: 后台运行

–name: 指定容器名称

-p 8080:80: 端口映射(主机端口:容器端口)

-v /host/path:/container/path: 目录挂载

-e VAR=value: 设置环境变量

–network: 指定网络

–restart=always: 开机自启

后台运行容器

docker run -d –name mynginx -p 80:80 nginx:latest

查看运行中的容器

docker ps

查看所有容器(包括已停止的)

docker ps -a

启动已停止的容器

docker start mynginx

停止容器

docker stop mynginx

重启容器

docker restart mynginx

进入运行中的容器

docker exec -it mynginx /bin/bash
docker attach mynginx # 附加到容器的标准输入/输出

查看容器日志

docker logs -f –tail 100 mynginx

查看容器资源使用

docker stats

查看容器详细信息

docker inspect mynginx

删除已停止的容器

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

暂停/恢复容器

docker pause mynginx
docker unpause mynginx

查看容器进程

docker top mynginx

复制文件到/从容器

docker cp hostfile.txt mynginx:/containerpath/
docker cp mynginx:/containerpath/file.txt ./
“`

容器生命周期管理

理解容器的生命周期对于日常运维至关重要。容器的状态流转如下:创建(Created)→ 运行(Running)→ 暂停(Paused)→ 停止(Stopped)→ 删除(Deleted)。

“`bash

创建容器但不启动

docker create –name test ubuntu:22.04

查看容器状态

docker ps -a –format “table {{.Names}}\t{{.Status}}\t{{.Ports}}”

导出容器为镜像tar文件

docker export -o container.tar mynginx

从tar文件导入为镜像

docker import container.tar myubuntu:v1

保存镜像为tar文件(包含所有历史层)

docker save -o nginx.tar nginx:latest

加载镜像tar文件

docker load -i nginx.tar
“`

五、Docker 网络配置

Docker 网络模式

Docker 提供四种网络模式,每种模式适用于不同的场景。bridge(桥接模式)是默认模式,容器连接到一个 docker0 虚拟网桥,与宿主机和其他容器通信。host(主机模式)容器直接使用宿主机的网络命名空间,网络性能最好但隔离性最差。container(容器模式)容器共享另一个容器的网络栈。none 模式则完全禁用网络。

“`bash

查看网络列表

docker network ls

查看网络详细信息

docker network inspect bridge

创建自定义桥接网络

docker network create –driver bridge –subnet 172.20.0.0/16 –gateway 172.20.0.1 mynetwork

创建覆盖网络(支持跨主机容器通信)

docker network create –driver overlay –attachable myoverlay

将容器连接到网络

docker network connect mynetwork mynginx

从网络断开容器

docker network disconnect mynetwork mynginx

删除未使用的网络

docker network prune
“`

端口映射与通信

容器的网络隔离由 Linux 命名空间实现,需要显式映射才能从宿主机访问:

“`bash

随机映射一个主机端口到容器端口

docker run -d -p 80 nginx # 主机端口随机

指定映射

docker run -d -p 8080:80 nginx # 宿主机8080映射到容器80

映射多个端口

docker run -d -p 80:80 -p 443:443 nginx

UDP 端口映射

docker run -d -p 53:53/udp dns-server

查看端口映射

docker port mynginx
“`

DNS 与主机名解析

Docker 提供了内置的 DNS 服务,容器之间可以通过容器名互相解析:

“`bash

创建自定义网络后,容器间可通过名称互相访问

docker network create mynet
docker run -d –name web –network mynet nginx
docker run -d –name db –network mynet mysql:8.0

从 web 容器访问 db 容器

docker exec web ping db # 正常工作

查看容器的 DNS 配置

docker exec web cat /etc/hosts
docker exec web cat /etc/resolv.conf
“`

六、Docker 存储卷管理

数据持久化方案

Docker 容器的文件系统是临时性的,容器删除后数据丢失。Docker 提供三种数据持久化方案。Docker Volume 由 Docker 管理,存储在宿主机的 /var/lib/docker/volumes/ 目录中,是推荐的方式。Bind Mount 将宿主机的目录直接挂载到容器,性能更好但依赖宿主机路径。tmpfs Mount 将数据存储在内存中,速度最快但容器重启后数据丢失。

“`bash

创建数据卷

docker volume create mydata

查看数据卷列表

docker volume ls

查看数据卷详细信息

docker volume inspect mydata

启动容器并使用数据卷

docker run -d –name mysql -v mydata:/var/lib/mysql mysql:8.0

使用绑定挂载

docker run -d –name website -v /www/html:/var/www/html nginx

使用只读挂载

docker run -d -v /www/html:/var/www/html:ro nginx

使用 tmpfs 挂载(内存文件系统)

docker run -d –name cache –tmpfs /tmp:rw,noexec,nosuid,size=100m redis

删除未使用的数据卷

docker volume prune

删除指定数据卷

docker volume rm mydata
“`

数据卷容器

可以使用一个容器作为数据卷容器,让其他容器通过 –volumes-from 共享数据:

“`bash

创建数据卷容器

docker create –name datavolume -v /shared/data busybox

其他容器挂载数据卷容器

docker run -d –name app1 –volumes-from datavolume ubuntu
docker run -d –name app2 –volumes-from datavolume ubuntu
“`

七、Dockerfile 编写与镜像构建

Dockerfile 基础语法

Dockerfile 是构建 Docker 镜像的蓝图,每一行指令都会创建新的镜像层:

“`dockerfile

基础镜像

FROM ubuntu:22.04

维护者信息(已废弃,使用 LABEL 代替)

LABEL maintainer=”yourname@example.com”

设置环境变量

ENV APP_HOME=/app
ENV NODE_VERSION=18.17.0

设置工作目录

WORKDIR /app

复制文件(优先使用 COPY)

COPY package*.json ./

运行命令

RUN npm ci –only=production

复制其余文件

COPY . .

暴露端口

EXPOSE 3000

设置启动命令

CMD [“node”, “server.js”]
“`

常用 Dockerfile 指令详解

FROM 指令指定基础镜像,必须是第一条非注释指令。选择合适的基础镜像很重要,alpine 镜像体积最小但可能缺少某些工具,ubuntu 或 debian 提供完整的 Linux 环境。

RUN 指令在镜像构建过程中执行命令,每条 RUN 指令都会创建新的镜像层。对于多个命令,建议合并以减少镜像层数:

“`dockerfile

不推荐:多个 RUN 指令

RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get clean

推荐:合并为一个 RUN

RUN apt-get update && \
apt-get install -y nginx && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
“`

COPY 和 ADD 指令都用于复制文件,COPY 是首选因为更透明。ADD 支持从 URL 下载和自动解压 tar 文件,但 COPY 就能满足大部分需求。

WORKDIR 设置工作目录,如果目录不存在会自动创建。建议在 COPY 指令之前设置 WORKDIR,避免不必要的层。

ENTRYPOINT 和 CMD 都用于指定容器启动命令,区别在于 CMD 可以被 docker run 的参数覆盖,而 ENTRYPOINT 不可覆盖。两者通常配合使用:

“`dockerfile
ENTRYPOINT [“python”, “app.py”]
CMD [“–port”, “8080”]
“`

多阶段构建

多阶段构建可以显著减小镜像体积,适用于需要编译环境但运行时不需要的场景:

“`dockerfile

第一阶段:构建

FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp

第二阶段:运行

FROM alpine:3.18
RUN apk –no-cache add ca-certificates
WORKDIR /root/
COPY –from=builder /app/myapp .
COPY –from=builder /app/configs ./configs
CMD [“./myapp”]
“`

.dockerignore 文件

.dockerignore 类似于 .gitignore,用于排除不需要复制到镜像中的文件:

“`
.git
.gitignore
node_modules
*.log
.env
.env.*
README.md
docs/
tests/
“`

构建镜像

“`bash

构建镜像(-t 指定标签,. 表示构建上下文)

docker build -t myapp:v1 .

指定 Dockerfile 路径

docker build -t myapp:v1 -f Dockerfile.dev .

带有构建参数

docker build -t myapp:v1 –build-arg NODE_ENV=production .

构建时传递 SSH 密钥(用于访问私有仓库)

docker build –ssh default .

启用构建缓存代理(加速内网构建)

docker build -t myapp:v1 –buildkit.

查看构建历史

docker history myapp:v1
“`

八、Docker Compose 编排

docker-compose.yml 基础

Docker Compose 使用 YAML 文件定义多容器应用的配置,通过一个命令即可启动或停止所有服务:

“`yaml
version: “3.8”

services:
web:
image: nginx:alpine
ports:

volumes:

depends_on:

networks:

  • “80:80”
  • ./html:/usr/share/nginx/html:ro
  • api
  • frontend

api:
build: ./api
environment:

depends_on:
db:
condition: service_healthy
redis:
condition: service_started
networks:

  • DB_HOST=db
  • REDIS_HOST=redis
  • backend

db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: myapp
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
volumes:

healthcheck:
test: [“CMD-SHELL”, “pg_isready -U myapp”]
interval: 10s
timeout: 5s
retries: 5
networks:

  • dbdata:/var/lib/postgresql/data
  • backend

redis:
image: redis:7-alpine
networks:

  • backend

volumes:
dbdata:

networks:
frontend:
backend:
“`

Docker Compose 常用命令

“`bash

启动所有服务(-d 后台运行)

docker-compose up -d

带构建镜像启动

docker-compose up -d –build

停止并删除容器、网络

docker-compose down

停止并删除容器、网络、数据卷

docker-compose down -v

查看服务状态

docker-compose ps

查看日志

docker-compose logs -f web

只启动指定服务

docker-compose up -d web db

停止服务

docker-compose stop

重启服务

docker-compose restart

执行一次性命令

docker-compose exec web ls -la

查看服务资源使用

docker-compose top

拉取所有镜像

docker-compose pull

构建镜像

docker-compose build
“`

depends_on 与健康检查

depends_on 可以设置启动顺序,但仅保证容器启动顺序,不保证服务就绪。配合 healthcheck 可以实现真正的依赖等待:

“`yaml
services:
web:
build: .
depends_on:
api:
condition: service_healthy

api:
image: myapi
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost:8080/health”]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
“`

环境变量与配置

“`bash

.env 文件

COMPOSE_PROJECT_NAME=myapp
COMPOSE_FILE=docker-compose.yml:docker-compose.prod.yml
NGINX_PORT=80

docker-compose.yml 中引用

services:
web:
image: ${NGINX_IMAGE:-nginx:alpine}
ports:

  • “${NGINX_PORT}:80”

“`

九、常见问题与解决方案

容器内无法解析域名

这是最常见的问题之一,通常是 DNS 配置错误或网络模式问题:

“`bash

临时解决方案:指定 DNS 服务器

docker run –dns 8.8.8.8 –dns 8.8.4.4 nginx

永久解决方案:配置 Docker Daemon

编辑 /etc/docker/daemon.json

{
“dns”: [“8.8.8.8”, “8.8.4.4”]
}

重启 Docker

sudo systemctl restart docker
“`

容器连接不上数据库

容器间的网络隔离是常见陷阱。确保所有需要互相通信的容器在同一个网络中:

“`bash

检查容器网络

docker inspect myapp | grep Networks -A 10

检查网络连接性

docker exec myapp ping db

如果在不同网络,可以手动连接

docker network connect mynet myapp
“`

数据库连接字符串中的主机名应该使用服务名而不是 localhost 或 127.0.0.1:

“`yaml

错误写法

DATABASE_URL=postgresql://user:pass@localhost:5432/db

正确写法

DATABASE_URL=postgresql://user:pass@db:5432/db
“`

容器不断重启

使用 docker ps 和 docker logs 排查原因:

“`bash

查看重启次数

docker ps -a | grep Restarting

查看详细退出信息

docker inspect mycontainer | grep -A 10 “State”

查看日志

docker logs –tail 200 mycontainer

常见原因:OOM(内存不足)

docker stats # 检查内存使用

常见原因:应用启动失败(端口占用、配置文件错误等)

“`

设置容器自动重启策略:

“`yaml
services:
myapp:
restart: unless-stopped
# always: 总是重启
# on-failure: 仅在退出码非0时重启
# unless-stopped: 除非手动停止,否则总是重启
“`

磁盘空间不足

Docker 的镜像、容器和数据卷会不断占用磁盘空间:

“`bash

查看 Docker 磁盘使用

docker system df

清理未使用的资源

docker system prune # 清理停止的容器、未使用的网络、悬空镜像
docker system prune -a # 加上未使用的镜像
docker system prune -f # 不需要确认

清理镜像

docker image prune # 清理悬空镜像
docker image prune -a # 清理所有未使用的镜像

清理容器

docker container prune # 清理已停止的容器

清理数据卷

docker volume prune # 清理未使用的卷

清理构建缓存

docker builder prune
“`

文件权限问题

容器内的进程通常以 root 或指定用户运行,可能导致挂载目录的权限问题:

“`bash

问题表现:应用无法写入挂载的目录

解决方案1:指定用户运行

docker run -u $(id -u):$(id -g) -v /data:/data myapp

解决方案2:修改目录权限

sudo chown -R $(id -u):$(id -g) /data

解决方案3:在 Dockerfile 中创建用户

RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
“`

端口冲突

多个服务尝试绑定相同端口:

“`bash

检查端口占用

sudo netstat -tlnp | grep 80
sudo ss -tlnp | grep 80

修改 Docker 端口映射

docker run -d -p 8080:80 nginx # 改为8080
“`

构建镜像失败

“`bash

网络问题导致下载包失败

解决方案:配置镜像加速或使用代理

docker build –build-arg HTTP_PROXY=http://proxy:8080 .

缓存导致的问题

docker build –no-cache .

查看构建详细日志

docker build -t myapp . –progress=plain
“`

容器内时间不准

容器默认使用 UTC 时间,需要配置时区:

“`bash

方案1:挂载时区文件

docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro myapp

方案2:在 Dockerfile 中设置

RUN apt-get install -y tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

方案3:环境变量(部分基础镜像支持)

docker run -e TZ=Asia/Shanghai myapp
“`

无法从容器访问外网

某些环境下 Docker 的网络配置可能出现问题:

“`bash

检查 Docker NAT 转发

iptables -t nat -L -n | grep DOCKER

检查 IP 转发

cat /proc/sys/net/ipv4/ip_forward

如果 IP 转发未开启

sudo sysctl -w net.ipv4.ip_forward=1

永久生效:编辑 /etc/sysctl.conf

echo “net.ipv4.ip_forward=1” | sudo tee -a /etc/sysctl.conf
“`

容器内存泄漏或 CPU 占用过高

“`bash

查看资源使用

docker stats

限制容器资源

docker run -m 512m –memory-swap 1g –cpus 1 myapp

查看容器进程

docker top myapp

限制 PIDs 数量(防止fork炸弹)

docker run –pids-limit 100 myapp
“`

Docker 服务无法启动

“`bash

查看详细错误

sudo systemctl status docker
sudo journalctl -xe -u docker

常见原因:docker.sock 权限

sudo chmod 666 /var/run/docker.sock

常见原因:存储驱动问题

编辑 /etc/docker/daemon.json

{
“storage-driver”: “overlay2”
}

常见原因:内核模块未加载

lsmod | grep overlay
sudo modprobe overlay
“`

十、生产环境最佳实践

镜像安全

“`dockerfile

使用特定版本标签,不用 latest

FROM nginx:1.25-alpine

使用非 root 用户

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

移除不必要的工具

RUN apt-get purge -y –auto-remove curl wget

扫描漏洞

docker scan myapp:latest
“`

健康检查配置

“`dockerfile

在 Dockerfile 中定义

FROM nginx:alpine
HEALTHCHECK –interval=30s –timeout=3s –start-period=5s –retries=3 \
CMD curl -f http://localhost/ || exit 1
“`

日志管理

“`json
{
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”,
“max-file”: “3”
}
}
“`

资源限制

“`yaml
services:
web:
deploy:
resources:
limits:
cpus: ‘0.5’
memory: 512M
reservations:
cpus: ‘0.25’
memory: 256M
“`

结语

Docker 容器化技术已经成为现代软件开发和运维的必备技能。本文从基础概念出发,涵盖了安装配置、镜像管理、容器操作、网络存储、Dockerfile 编写和 Docker Compose 编排等核心内容,并详细讲解了 20 多个常见问题的解决方案。掌握这些知识,你已经具备了使用 Docker 构建和管理生产环境应用的能力。

在实际使用中,建议多加练习,尤其是 Docker Compose 的编排能力和问题排查能力。容器化不仅是部署工具的改变,更是一种思维方式和工作流程的革新。开始使用 Docker,让你的开发和部署更加高效。

晓鹏
晓鹏