【Docker 新手入门指南】系列文章目录
- 【Docker 新手入门指南】第一章:前言
- 【Docker 新手入门指南】第二章:架构概述
- 【Docker 新手入门指南】第三章:快速安装
- 【Docker 新手入门指南】第四章:镜像加速
- 【Docker 新手入门指南】第五章:Hello Word
- 【Docker 新手入门指南】第六章:容器操作
【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管理多容器应用。