【Docker的理解和指令 - - -来源于deepseek】
🚀 Docker 是什么?
Docker 是一个开源的容器化平台,用于开发、交付和运行应用程序。它的核心目标是“Build, Ship and Run Any App, Anywhere”—— 即“一次构建,处处运行”。
🤔 为什么需要 Docker?
在传统软件开发和部署中,常常遇到这样的问题:
- 环境不一致:开发人员在 Windows 上开发测试通过的应用,部署到 Linux 服务器时,可能因为操作系统、库版本、依赖软件不同而运行失败。
- 部署繁琐:每次部署都需要手动安装各种运行环境、配置依赖、设置端口等,过程繁琐且容易出错。
- 资源浪费:传统虚拟机虽然能隔离环境,但每个虚拟机都需要运行一整套完整的操作系统,占用大量内存和磁盘空间,启动慢。
Docker 通过容器化技术解决了这些问题。它将应用及其所有依赖打包成一个镜像,在任何支持 Docker 的环境中都能以容器的形式一致运行。
⚖️ Docker vs 传统虚拟机
| 特性 | 传统虚拟机 | Docker 容器 |
|---|---|---|
| 虚拟化层级 | 硬件虚拟化 | 操作系统虚拟化 |
| 操作系统 | 每个 VM 运行完整客户操作系统(含内核) | 所有容器共享宿主机内核 |
| 资源占用 | 高(几百MB几GB内存,几GB几十GB磁盘) | 低(MB级别) |
| 启动速度 | 分钟级 | 秒级 |
| 隔离性 | 强隔离 | 进程级隔离 |
简单来说:虚拟机虚拟的是硬件,Docker 虚拟的是操作系统。容器直接运行在宿主机内核上,因此更轻量、更快速。
🧠 Docker 核心概念
在了解具体指令前,先掌握三个核心概念:
- 镜像(Image):一个只读的模板,包含应用程序及其运行所需的环境、依赖和配置。类似于“类”。
- 容器(Container):镜像的运行实例。类似于“对象”。容器是相互隔离的。
- 仓库(Repository):存放镜像的地方,最著名的是 Docker Hub。
📖 Docker 常用命令详解
Docker 命令按功能可分为镜像管理、容器管理、数据卷管理、网络管理等几大类。
(其他学习资源:https://vuepress.mirror.docker-practice.com/)
一、镜像管理命令
| 命令 | 作用 | 示例 |
|---|---|---|
docker images | 列出本地所有镜像 | docker images -a(显示所有) |
docker pull <镜像名>:<标签> | 从仓库拉取镜像到本地 | docker pull nginx:latest |
docker search <镜像名> | 在 Docker Hub 搜索镜像 | docker search mysql |
docker build -t <镜像名> <路径> | 根据 Dockerfile 构建镜像 | docker build -t myapp . |
docker rmi <镜像名/ID> | 删除本地镜像 | docker rmi nginx(加-f强制删除) |
docker save -o <文件> <镜像名> | 导出镜像为 tar 文件 | docker save -o nginx.tar nginx |
docker load -i <文件> | 从 tar 文件导入镜像 | docker load -i nginx.tar |
docker tag <源镜像> <目标镜像>:<标签> | 给镜像打标签 | docker tag myapp myrepo/myapp:v1 |
docker history <镜像名> | 查看镜像构建历史 | docker history myapp |
docker inspect <镜像名/容器名> | 查看镜像或容器的详细信息 | docker inspect nginx |
二、容器管理命令
| 命令 | 作用 | 示例 |
|---|---|---|
docker ps | 列出正在运行的容器 | docker ps -a(列出所有容器) |
docker run <镜像名> | 从镜像创建并启动容器 | docker run -d -p 8080:80 nginx |
docker start <容器名/ID> | 启动已停止的容器 | docker start mynginx |
docker stop <容器名/ID> | 停止运行中的容器 | docker stop mynginx |
docker restart <容器名/ID> | 重启容器 | docker restart mynginx |
docker kill <容器名/ID> | 强制停止容器 | docker kill mynginx |
docker rm <容器名/ID> | 删除容器(需先停止) | docker rm mynginx |
docker exec -it <容器名> <命令> | 在运行中的容器内执行命令 | docker exec -it mynginx bash |
docker attach <容器名> | 附加到运行中的容器 | docker attach mynginx |
docker logs <容器名> | 查看容器日志 | docker logs -f mynginx(实时跟踪) |
docker cp <源路径> <目标路径> | 在容器和宿主机之间复制文件 | docker cp ./file.txt mynginx:/app/ |
docker stats | 显示容器资源使用情况 | docker stats |
docker top <容器名> | 显示容器内的进程 | docker top mynginx |
docker commit <容器名> <新镜像名> | 将容器保存为新镜像 | docker commit mynginx mynginx:v2 |
docker run常用参数详解
| 参数 | 作用 | 示例 |
|---|---|---|
-d | 后台运行容器(detach) | docker run -d nginx |
-it | 交互式运行,分配伪终端 | docker run -it ubuntu bash |
-p <宿主机端口>:<容器端口> | 端口映射 | docker run -p 8080:80 nginx |
-v <宿主机路径>:<容器路径> | 挂载数据卷 | docker run -v /data:/app/data nginx |
--name <名称> | 给容器指定名称 | docker run --name mynginx nginx |
--restart always | 容器退出时自动重启 | docker run --restart always nginx |
-e <key>=<value> | 设置环境变量 | docker run -e MYSQL_ROOT_PASSWORD=123 mysql |
三、数据卷(Volume)管理命令
数据卷用于持久化容器数据,即使容器被删除,数据依然保留。
| 命令 | 作用 | 示例 |
|---|---|---|
docker volume create <名称> | 创建数据卷 | docker volume create mydata |
docker volume ls | 列出所有数据卷 | docker volume ls |
docker volume rm <名称> | 删除数据卷 | docker volume rm mydata |
docker volume inspect <名称> | 查看数据卷详情 | docker volume inspect mydata |
四、网络管理命令
| 命令 | 作用 |
|---|---|
docker network ls | 列出所有网络 |
docker network create <名称> | 创建网络 |
docker network connect <网络> <容器> | 将容器连接到网络 |
docker network disconnect <网络> <容器> | 断开容器与网络的连接 |
docker network rm <名称> | 删除网络 |
五、系统信息命令
| 命令 | 作用 |
|---|---|
docker version | 显示 Docker 版本信息 |
docker info | 显示 Docker 系统信息 |
docker events | 获取 Docker 实时事件 |
📄 Dockerfile 指令详解
Dockerfile 是一个文本文件,包含构建镜像所需的全部指令。
| 指令 | 作用 | 示例 |
|---|---|---|
FROM | 必须第一条,指定基础镜像 | FROM ubuntu:20.04 |
MAINTAINER | 指定维护者信息 | MAINTAINER user@example.com |
RUN | 在构建镜像时执行命令,并提交为新镜像层 | RUN apt-get update && apt-get install -y nginx |
CMD | 容器启动时执行的命令(可被docker run覆盖) | CMD ["nginx", "-g", "daemon off;"] |
ENTRYPOINT | 容器启动时执行的命令(不可被覆盖) | ENTRYPOINT ["nginx"] |
COPY | 将本地文件复制到镜像中 | COPY ./app /app |
ADD | 类似COPY,但支持 URL 和自动解压 tar | ADD https://example.com/file.tar.gz /tmp/ |
EXPOSE | 声明容器运行时监听的端口 | EXPOSE 80 |
ENV | 设置环境变量 | ENV NODE_ENV production |
WORKDIR | 设置工作目录 | WORKDIR /app |
VOLUME | 创建挂载点,用于持久化数据 | VOLUME ["/data"] |
USER | 指定运行容器时的用户 | USER nginx |
ONBUILD | 当镜像被用作其他镜像的基础时触发的指令 | ONBUILD COPY . /app |
CMD与ENTRYPOINT的区别
- CMD:提供容器启动时的默认命令,可被
docker run后的命令覆盖。 - ENTRYPOINT:容器启动时执行的命令,不可被覆盖,
docker run后的参数会作为ENTRYPOINT的参数追加。
🎯 总结
Docker 通过镜像打包应用与环境,通过容器实现轻量级运行,解决了“环境不一致”和“部署繁琐”两大核心痛点。掌握上述命令,你就能完成从构建镜像(docker build)、拉取/推送镜像(docker pull/push)、运行容器(docker run)到管理容器生命周期(start/stop/restart/rm)的完整操作。