【Docker 新手入门指南】第六章:容器操作
轻量级、可移植、一致性——容器化应用的核心优势,通过以下操作快速掌握容器全生命周期管理。
一、 核心概念速览
概念 | 描述 | 类比 |
镜像(Image) | 只读模板,包含应用环境(代码+依赖+系统库) | 面向对象中的「类」 |
容器(Container) | 镜像的运行实例,动态可读写 | 面向对象中的「对象」 |
核心特性 | 隔离性(Namespace)、资源限制(Cgroups)、轻量性(共享内核) | — |
二、 容器操作全流程
1. 获取镜像
# 拉取指定版本镜像(避免使用latest,推荐固定版本)
docker pull nginx:1.25-alpine
- 技巧:使用 docker search --filter=stars=5 查找高星镜像
2. 启动容器的 3 种模式
- 交互式模式(调试场景)
docker run -it --rm \
-v $(pwd):/app \ # 挂载主机目录到容器/app(代码实时同步)
-w /app \ # 设置容器内工作目录
node:20 bash
关键参数:-it(交互+终端)、--rm(退出自动删除容器)
- 后台服务模式(生产环境)
docker run -d \
--name=web-server \ # 自定义容器名(便于管理)
-p 8080:80 \ # 端口映射(主机端口:容器端口)
-v nginx-logs:/var/log/nginx \ # 命名卷持久化日志
-e TZ=Asia/Shanghai \ # 注入环境变量(时区/配置)
--restart=always \ # 故障自动重启(生产必备)
nginx:alpine
最佳实践:避免使用 --privileged 特权模式,最小化容器权限
- 一次性任务模式(脚本执行)
docker run --rm alpine echo "Hello Docker!"
3. 容器生命周期管理
操作 | 命令 | 示例 | 生产场景用途 |
查看运行中容器 | docker ps | docker ps -q(仅输出ID) | 批量操作前过滤 |
进入容器 | docker exec | docker exec -it web-server bash | 调试日志/临时配置 |
停止容器 | docker stop | docker stop -t 30 web-server(等待30秒优雅关闭) | 版本升级前停机 |
删除容器 | docker rm | docker rm $(docker ps -aq -f status=exited)(删除所有已停止容器) | 释放磁盘空间 |
监控资源 | docker stats | docker stats --no-stream(实时统计) | 性能调优 |
4. 数据持久化方案
- 方案1:绑定挂载(开发场景)
docker run -v $(pwd)/data:/app/data ubuntu
特点:直接映射主机目录,灵活性高但依赖主机路径
- 方案2:命名卷(生产推荐)
docker volume create my-vol
docker run -v my-vol:/app/data ubuntu
优势:Docker 自动管理存储路径,支持跨容器共享
5. 网络配置
- 单主机容器通信(桥接网络)
# 创建自定义网络
docker network create app-net
# 启动容器并加入网络
docker run -d --network=app-net --name=web nginx
docker run -d --network=app-net --name=db mysql
通信方式:容器可通过服务名(如 db)直接访问
- 端口映射规则
docker run -p 80:8080 nginx # 主机80端口 → 容器8080端口
注意:-P(随机映射)用于临时环境,生产环境需显式指定端口
三、 常见问题与解决方案
问题1:权限不足(Permission Denied)
# 错误提示
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
# 解决方法 1:使用 sudo 在 docker 命令前加上 sudo
sudo docker ps
#解决方法 2:将用户添加到 docker 用户组
# 添加 docker 用户组
sudo groupadd docker
# 将当前用户加入到 docker 用户组
sudo gpasswd -a $USER docker
# 更新用户组
newgrp docker
# 测试命令
docker ps
问题2:容器退出后数据丢失
- 原因:未使用数据持久化(容器层是临时的)
- 解决:docker run -v my-vol:/data ubuntu # 使用命名卷
问题3:端口被占用
# 查看端口占用
sudo lsof -i :8080
# 强制停止占用进程
sudo kill $(lsof -t -i :8080)
四、 典型场景实操示例
案例:部署Python Flask应用
- 编写Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
- 构建并运行容器
docker build -t flask-app .
docker run -d -p 5000:5000 flask-app
五、 效率提升工具
工具 | 功能 | 官网/仓库 |
Portainer | Docker图形化管理面板 | portainer.io |
Dive | 镜像分层分析工具 | github.com/wagoid/dive |
ctop | 容器资源监控 | github.com/bcicen/ctop |
通过以上学习,可快速掌握容器从创建到部署的全流程。建议在实践中遵循「最小化镜像体积」和「数据持久化优先」原则,逐步过渡到使用Docker Compose管理多容器应用。