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,让你的开发和部署更加高效。