1. Docker 简介
Docker 是一种开源的容器化平台,它使开发者能够自动化地部署、管理和运行应用程序。Docker 使用操作系统级虚拟化技术,使得应用程序和它们的依赖项可以打包成一个轻量级、可移植的容器,并在任何环境中运行。
1.1 Docker 的核心概念
镜像(Image):
- Docker 镜像是一个包含应用程序及其所有依赖项的只读模板。镜像可以用来创建 Docker 容器。
- 镜像通常是基于另一个镜像构建的,并通过分层文件系统来实现。每一层都包含了镜像的一部分,最后一层是应用程序本身。
容器(Container):
- 容器是镜像的运行实例。它们是轻量级的、独立的,运行时与主机系统隔离。
- 容器可以启动、停止、移动,并且可以随时销毁,而不会影响主机系统。
Dockerfile:
- Dockerfile 是一个文本文件,包含了一系列指令,用来告诉 Docker 如何构建镜像。
- 每个指令都对应镜像的一层,并且每次修改 Dockerfile 都会创建新的镜像层。
Docker Hub:
- Docker Hub 是一个云端的镜像存储库,允许用户存储和共享 Docker 镜像。用户可以从 Docker Hub 拉取公共镜像,或推送自己的镜像。
1.2 Docker 的优势
- 一致的运行环境: Docker 提供了一致的开发、测试和生产环境,确保应用程序在不同环境中运行时没有差异。
- 轻量级: Docker 容器与传统的虚拟机相比更加轻量级,占用资源更少,启动速度更快。
- 依赖管理: Docker 容器包含应用程序的所有依赖项,避免了“在我的机器上可以工作”的问题。
- 便捷的版本控制: Docker 镜像是分层构建的,可以很方便地进行版本控制和回滚。
- 快速部署: Docker 镜像可以快速分发和部署,缩短了从开发到生产的时间。
1.3 Docker 工作流程
- 编写 Dockerfile: 开发者编写一个 Dockerfile 来定义应用程序的环境和依赖项。
- 构建镜像: 使用
docker build
命令将 Dockerfile 构建成一个镜像。 - 运行容器: 使用
docker run
命令从镜像创建并启动一个容器。 - 管理容器: 使用各种 Docker 命令(如
docker ps
,docker stop
,docker rm
等)来管理容器的生命周期。 - 发布和分享: 使用
docker push
命令将镜像推送到 Docker Hub,或者从 Docker Hub 拉取其他镜像。
2. 常见命令
最常用的就2、3。
2.1 基本命令
docker version
:查看 Docker 的版本信息。
docker info
:显示有关 Docker 系统的详细信息,包括容器、镜像和存储驱动等信息。
docker help
:显示 Docker 命令的帮助信息。
2.2 镜像操作
docker images
:列出本地存储的所有镜像。
docker pull [镜像名]
:从 Docker Hub 或其他镜像仓库中拉取指定镜像。
- 注意: 从可信的源拉取镜像,以避免安全风险。定期更新镜像以获取最新的安全修复和功能改进。
docker build -t [镜像名]:[标签] [Dockerfile 路径]
:使用 Dockerfile 构建一个新的镜像。
- 注意: Dockerfile 中的命令尽量保持简单和明确,以减少镜像层的数量和大小。使用多阶段构建来减少最终镜像的大小。
docker rmi [镜像名或ID]
:删除指定的镜像。
docker tag [镜像名]:[标签] [新镜像名]:[新标签]
:为现有镜像打标签。
2.3 容器操作
docker ps
:列出当前正在运行的所有容器(可以看到下面的容器名和id)。
docker ps -a
:列出所有容器,包括未运行的(可以看到下面的容器名和id)。
docker run [选项] [镜像名]
:运行一个镜像,生成一个容器。常用选项:
-d
:后台运行容器,并返回容器 ID。注意: 后台运行容器时,确保有日志管理方案以便排查问题。-it
:以交互模式运行容器,并分配一个伪终端。--name [容器名]
:为容器指定一个名称。注意: 使用有意义的名称便于管理和调试。-p [主机端口]:[容器端口]
:端口映射。注意: 映射端口时,注意主机和容器的端口冲突问题。-v [主机目录]:[容器目录]
:挂载主机目录到容器中。注意: 确保正确的读写权限,避免数据丢失或权限问题。
docker stop [容器名或ID]
:停止运行中的容器。
- 注意: 停止容器时,最好先确保容器内的进程已妥善关闭,以防止数据损坏或丢失。
docker start [容器名或ID]
:启动已停止的容器。
docker restart [容器名或ID]
:重启容器。
docker rm [容器名或ID]
:删除容器。
- 注意: 删除容器时,请确保容器中的重要数据已备份或持久化,避免数据丢失。可以结合
docker stop
和docker rm
使用docker rm -f
强制删除正在运行的容器。
docker exec -it [容器名或ID] /bin/bash
:进入正在运行的容器的终端。
2.4 网络操作
docker network ls
:列出所有的网络。
docker network create [网络名]
:创建一个新的网络。
- 注意: 创建自定义网络时,可以选择适当的驱动(如
bridge
,overlay
),以满足不同的应用场景需求。确保网络配置与主机网络环境不冲突。
docker network rm [网络名]
:删除一个网络。
docker network inspect [网络名]
:查看网络的详细信息。
2.5 卷操作
docker volume ls
:列出所有卷。
docker volume create [卷名]
:创建一个新的卷。
- 注意: 创建卷时,可以指定不同的驱动程序和选项,以满足存储需求。注意卷的生命周期管理,避免产生未使用的孤立卷。
docker volume rm [卷名]
:删除一个卷。
- 注意: 删除卷时,请确保卷中的数据已备份或不再需要,避免数据丢失。
docker volume inspect [卷名]
:查看卷的详细信息。
2.6 日志和监控
docker logs [容器名或ID]
:查看容器的日志。
- 注意: 查看日志时,可以使用
--tail
和-f
选项分别查看最近的日志和实时日志,以便于调试。日志文件可能会很大,建议配置日志驱动和日志轮转策略。
docker stats [容器名或ID]
:显示容器的实时资源使用统计信息。
- 注意: 实时监控容器资源使用情况时,可以结合其他监控工具(如 Prometheus, Grafana)进行更全面的监控和告警。
2.7 清理命令
docker system prune
:清理未使用的数据,包括未使用的镜像、挂起的容器、未使用的卷和网络。
- 注意: 使用清理命令时,要特别注意会删除未使用的数据。建议在生产环境中使用前仔细检查,以免误删重要资源。可以使用
--volumes
选项一并删除未使用的卷,但需谨慎操作。
docker image prune
:删除未使用的镜像。
docker container prune
:删除所有停止的容器。
docker volume prune
:删除未使用的卷。
docker network prune
:删除未使用的网络。
3. 注意事项和最佳实践
3.1 镜像操作
- 从可信的源拉取镜像,以避免安全风险。
- 定期更新镜像以获取最新的安全修复和功能改进。
- Dockerfile 中的命令尽量保持简单和明确,以减少镜像层的数量和大小。
- 使用多阶段构建来减少最终镜像的大小。
3.2 容器操作
- 后台运行容器时,确保有日志管理方案以便排查问题。
- 使用有意义的名称便于管理和调试。
- 映射端口时,注意主机和容器的端口冲突问题。
- 挂载卷时,确保正确的读写权限,避免数据丢失或权限问题。
- 停止容器时,最好先确保容器内的进程已妥善关闭,以防止数据损坏或丢失。
- 删除容器时,请确保容器中的重要数据已备份或持久化,避免数据丢失。
- 强制删除正在运行的容器时需谨慎操作。
3.3 网络操作
- 创建自定义网络时,可以选择适当的驱动,以满足不同的应用场景需求。
- 确保网络配置与主机网络环境不冲突。
3.4 卷操作
- 创建卷时,可以指定不同的驱动程序和选项,以满足存储需求。
- 注意卷的生命周期管理,避免产生未使用的孤立卷。
- 删除卷时,请确保卷中的数据已备份或不再需要,避免数据丢失。
3.5 日志和监控
- 查看日志时,可以使用
--tail
和-f
选项分别查看最近的日志和实时日志,以便于调试。 - 日志文件可能会很大,建议配置日志驱动和日志轮转策略。
- 实时监控容器资源使用情况时,可以结合其他监控工具进行更全面的监控和告警。
3.6 清理命令
- 使用清理命令时,要特别注意会删除未使用的数据。
- 在生产环境中使用前仔细检查,以免误删重要资源。
- 使用
--volumes
选项一并删除未使用的卷时需谨慎操作。