1. 镜像与容器基础概念解析
在Docker的世界里,镜像(Image)和容器(Container)是最核心的两个概念。简单来说,镜像就像是软件安装包,而容器则是运行起来的软件实例。镜像是一个静态的、只读的模板,包含了运行应用所需的所有依赖和配置;而容器则是镜像的运行实例,是一个轻量级的、可执行的隔离环境。
提示:可以把镜像类比为烹饪食谱,容器则是按照食谱做出来的菜肴。食谱可以反复使用,而每次按照食谱做出来的菜肴都是独立的实例。
镜像采用分层存储结构,每一层都是只读的。当我们基于某个镜像创建容器时,Docker会在镜像层之上添加一个可写层(容器层),所有对容器的修改都发生在这个可写层中,不会影响底层的镜像。这种设计使得多个容器可以共享同一个基础镜像,大大节省了存储空间。
2. 镜像核心操作命令详解
2.1 镜像获取与管理
获取镜像最常用的命令是docker pull,它可以从Docker Hub或其他镜像仓库下载镜像:
# 下载官方Ubuntu镜像的最新版本 docker pull ubuntu # 下载指定版本的镜像 docker pull ubuntu:20.04 # 从私有仓库下载镜像 docker pull myregistry.example.com/myimage:1.0查看本地已有的镜像列表可以使用docker images命令:
docker images # 输出示例: # REPOSITORY TAG IMAGE ID CREATED SIZE # ubuntu 20.04 1d622ef86b13 2 weeks ago 72.9MB # nginx latest 2bdc49f2f8d9 3 weeks ago 133MB2.2 镜像构建与定制
虽然可以直接使用公共镜像,但更多时候我们需要定制自己的镜像。这通常通过编写Dockerfile然后使用docker build命令实现:
# 构建镜像 docker build -t myapp:1.0 . # 查看构建历史 docker history myapp:1.0构建镜像时有一些实用技巧:
- 使用
.dockerignore文件排除不需要的文件,类似.gitignore - 多阶段构建可以显著减小最终镜像大小
- 合理利用构建缓存可以加快构建速度
2.3 镜像维护与清理
随着使用时间的增长,系统中可能会积累大量不再需要的镜像,占用大量磁盘空间。以下命令可以帮助管理镜像:
# 删除指定镜像 docker rmi ubuntu:20.04 # 强制删除镜像(即使有容器在使用) docker rmi -f ubuntu:20.04 # 删除所有未被使用的镜像 docker image prune # 删除所有未被容器使用的镜像(包括被其他镜像引用的) docker image prune -a注意:删除镜像前确保没有运行中的容器依赖它,否则可能导致容器异常。使用
docker ps -a可以查看所有容器状态。
3. 容器核心操作命令详解
3.1 容器生命周期管理
容器最基本的操作是创建、启动、停止和删除:
# 创建并启动容器(-d表示后台运行) docker run -d --name mycontainer nginx # 启动已停止的容器 docker start mycontainer # 停止运行中的容器 docker stop mycontainer # 重启容器 docker restart mycontainer # 删除容器(必须先停止) docker rm mycontainer # 强制删除运行中的容器 docker rm -f mycontainerdocker run命令有许多有用的选项:
-p:端口映射,如-p 8080:80-v:数据卷挂载,如-v /host/path:/container/path-e:设置环境变量,如-e MYVAR=value--network:指定网络模式
3.2 容器交互与调试
与运行中的容器交互是日常开发调试的重要部分:
# 进入运行中的容器执行命令(非交互式) docker exec mycontainer ls /app # 以交互模式进入容器(类似SSH) docker exec -it mycontainer /bin/bash # 查看容器日志 docker logs mycontainer # 实时查看日志(类似tail -f) docker logs -f mycontainer # 查看容器内进程 docker top mycontainer # 检查容器详细信息(JSON格式) docker inspect mycontainer3.3 容器资源管理
Docker提供了多种命令来监控和管理容器资源:
# 查看运行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 查看容器资源使用情况 docker stats # 限制容器内存使用 docker run -m 512m --memory-swap=1g myapp # 限制CPU使用 docker run --cpus=1.5 myapp4. 实用技巧与常见问题
4.1 数据持久化策略
容器本身是临时的,默认情况下容器停止后所有修改都会丢失。要实现数据持久化,主要有三种方式:
数据卷(Volumes):Docker管理的持久化存储
docker volume create myvolume docker run -v myvolume:/data myapp绑定挂载(Bind Mounts):直接挂载主机目录
docker run -v /host/path:/container/path myapp临时文件系统(tmpfs):仅保存在内存中
docker run --tmpfs /app/cache myapp
4.2 网络配置技巧
Docker提供了多种网络模式,满足不同场景需求:
# 创建自定义网络 docker network create mynetwork # 查看网络列表 docker network ls # 将容器连接到网络 docker network connect mynetwork mycontainer # 断开网络连接 docker network disconnect mynetwork mycontainer常用的网络模式包括:
bridge:默认的桥接网络host:直接使用主机网络none:无网络连接overlay:用于Swarm集群
4.3 常见问题排查
问题1:端口冲突当容器端口与主机端口冲突时,可以:
- 修改主机端口映射:
-p 8081:80替代-p 8080:80 - 停止占用端口的服务
- 使用
netstat -tulnp | grep 8080查找冲突进程
问题2:容器启动后立即退出可能原因包括:
- 主进程退出(检查应用日志)
- 缺少
-d或-it选项 - 资源不足(内存、CPU限制过小)
问题3:磁盘空间不足解决方法:
- 清理无用镜像:
docker image prune -a - 清理停止的容器:
docker container prune - 清理构建缓存:
docker builder prune
5. 高级操作与最佳实践
5.1 容器编排基础
虽然单个容器管理已经很有用,但在生产环境中通常需要管理多个容器。Docker Compose是一个常用的编排工具:
# docker-compose.yml示例 version: '3' services: web: image: nginx ports: - "8080:80" db: image: postgres environment: POSTGRES_PASSWORD: example常用命令:
# 启动服务 docker-compose up -d # 停止服务 docker-compose down # 查看服务状态 docker-compose ps5.2 容器安全最佳实践
容器安全不容忽视,以下是一些基本建议:
- 使用最小化基础镜像(如Alpine Linux)
- 定期更新镜像和依赖
- 避免以root用户运行容器
- 限制容器资源使用
- 使用只读文件系统(
--read-only) - 扫描镜像中的漏洞(
docker scan)
5.3 性能优化技巧
镜像优化:
- 使用多阶段构建减少最终镜像大小
- 合并RUN指令减少镜像层数
- 清理不必要的缓存和临时文件
容器优化:
- 合理设置CPU和内存限制
- 使用适当的数据持久化策略
- 优化日志配置(大小、轮转)
网络优化:
- 为高吞吐量应用使用
host网络模式 - 使用自定义网络提高容器间通信效率
- 考虑使用网络别名简化服务发现
- 为高吞吐量应用使用
在实际工作中,我发现很多初学者容易忽视容器日志管理。默认情况下,容器日志会不断累积,可能导致磁盘空间耗尽。建议在生产环境中配置日志驱动和日志轮转策略:
# 启动容器时限制日志大小 docker run --log-opt max-size=10m --log-opt max-file=3 myapp另一个常见问题是容器时间不同步。如果容器内时间与主机不一致,可以这样解决:
# 启动时同步主机时间 docker run -v /etc/localtime:/etc/localtime:ro myapp