docker笔记
docker官网:https://www.docker.com/安装:笔记:https://www.kuangstudy.com/bbs/1463094587894538242https://blog.csdn.net/weixin_44589991/article/details/121492885?spm=1001.2014.3001.5501https://www.bilibili.com/
Docker 是一个开源的应用容器化平台。
它能帮助开发者将应用程序及其所有依赖项(代码、运行时、系统工具、库等)打包到一个称为 容器 (Container) 的标准化单元中,然后可以在任何环境中快速、可靠地运行这个应用。
简单来说,Docker 解决了软件开发中一个常见的痛点:“在我的机器上能运行,为什么在你的机器上不行?”
Docker 的核心概念
Docker 主要围绕三个核心概念运行:
-
🗄️ 镜像 (Image):
- 一个只读的模板,包含了应用程序运行所需的所有文件系统、代码和依赖项。
- 你可以将它想象成一个用于创建虚拟机的**“安装光盘”或“快照”**。
-
📦 容器 (Container):
- 镜像的运行实例。
- 它是一个轻量级、隔离的运行环境,应用程序就在其中运行。
- 容器之间是相互隔离的,但它们共享宿主机的操作系统内核。
-
🏢 仓库 (Registry):
- 集中存储和分发 Docker 镜像的地方,最著名的是 Docker Hub(公共仓库)。
- 您可以将自己创建的镜像推送到仓库,也可以从仓库拉取(下载)别人的镜像来使用。
容器与虚拟机的区别
理解 Docker,关键在于理解容器与传统虚拟机 (VM) 的区别。
| 特性 | Docker 容器 (Container) | 传统虚拟机 (VM) |
|---|---|---|
| 虚拟化层 | 操作系统 (OS) 层 | 硬件层 |
| 包含内容 | 应用程序 + 依赖项 + 轻量级操作系统 API/服务 | 应用程序 + 依赖项 + 完整的客户操作系统 (Guest OS) |
| 启动速度 | 秒级或毫秒级 (极快) | 分钟级 (较慢) |
| 资源占用 | 轻量级,共享宿主内核,占用资源少 | 重量级,每个 VM 都要占用大量的 CPU、内存和磁盘 |
| 隔离性 | 进程隔离(基于 Linux 内核技术如 cgroups 和 Namespace) | 完整的硬件虚拟化隔离(Hypervisor) |
总结: 容器是一种轻量级的虚拟化方式,更高效、更快速、更便携,非常适合部署现代的微服务和云原生应用。
您已经了解了 Docker 和 Docker Compose,下一步您是想了解 Kubernetes (K8s)(用于大规模容器编排的工具)还是想知道如何编写一个简单的 Dockerfile(用于创建镜像的配置文件)呢?
docker官网:https://www.docker.com/
安装:
笔记:https://www.kuangstudy.com/bbs/1463094587894538242
https://blog.csdn.net/weixin_44589991/article/details/121492885?spm=1001.2014.3001.5501
https://www.bilibili.com/video/BV1og4y1q7M4?p=2&spm_id_from=pageDriver
一. Docker的安装:
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。
Docker CE 的安装请参考官方文档。
安装完成后,运行下面的命令,验证是否安装成功。
docker version
# 或者
docker info
1.1 docker VS 虚拟机
虚拟机模拟整台计算机(包括操作系统),而 Docker 容器共享宿主机的操作系统内核,只隔离应用及其依赖。

二. Docker镜像:
Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
# 列出本机的所有 image 文件。
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。
为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。此外,出售自己制作的 image 文件也是可以的。
2.1 镜像常用命令:
- 查看本地主机所有的镜像:
docker image ls 或者 docker images
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 11 months ago 13.3kB
#解释:
1.REPOSITORY 镜像的仓库源
2.TAG 镜像的标签
3.IMAGE ID 镜像的id
4.CREATED 镜像的创建时间
5.SIZE 镜像的大小
# 可选参数
-a/--all 列出所有镜像
-q/--quiet 只显示镜像的id
- 下载镜像,默认下载latest版本
docker pull 镜像名[:tag]
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker pull mysql
Using default tag: latest #如果不写tag默认就是latest
latest: Pulling from library/mysql
6ec7b7d162b2: Pull complete #分层下载,docker image的核心-联合文件系统
fedd960d3481: Pull complete
7ab947313861: Pull complete
64f92f19e638: Pull complete
3e80b17bff96: Pull complete
014e976799f9: Pull complete
59ae84fee1b3: Pull complete
ffe10de703ea: Pull complete
657af6d90c83: Pull complete
98bfb480322c: Pull complete
6aa3859c4789: Pull complete
1ed875d851ef: Pull complete
Digest: sha256:78800e6d3f1b230e35275145e657b82c3fb02a27b2d8e76aac2f5e90c1c30873 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #下载来源的真实地址 #docker pull mysql等价于docker pull docker.io/library/mysql:latest
- 删除镜像
docker rmi 镜像id
#1.删除指定的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id
#2.删除多个镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f 镜像id 镜像id 镜像id
#3.删除全部的镜像id
[root@iZwz99sm8v95sckz8bd2c4Z ~]# docker rmi -f $(docker images -aq)
三. Docker容器:
3.1 容器常用命令
说明:有了镜像才可以创建容器
docker pull centos
- 新建容器并启动
docker run [可选参数] image
#参数说明
--name="名字" 指定容器名字 tomcat01 tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
(
-p ip:主机端口:容器端口 配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
)
-P 随机指定端口(大写的P)
#测试,并启动
[root@zecan ~]# docker run -it centos /bin/bash
[root@b3ac7a30eb8a /]# ls #查看容器内地centos,基础版本,很多命令都是不完善的!
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器退回主机
[root@b3ac7a30eb8a /]# exit
exit
[root@zecan /]# ls
bin boot dev etc home lib lib64 lost+found media mnt opt patch proc root run sbin srv sys tmp usr var www
- 列出所有的运行中的容器:
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
下面的命令也可以的,并且下面命令的参数也可以用在上面。
# docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器+带出历史运行过的容器
-n=? # 显示最近创建的容器
-q # 只显示容器的编号
[root@zecan /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@zecan /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b3ac7a30eb8a centos "/bin/bash" 5 minutes ago Exited (0) 4 minutes ago optimistic_heyrovsky
332d452d5337 hello-world "/hello" 31 minutes ago Exited (0) 31 minutes ago sleepy_mendel
72d42c07133b hello-world "/hello" 15 hours ago Exited (0) 15 hours ago pensive_germain
[root@zecan /]#
- 启动和停止容器:
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前运行的容器 或者exit命令
docker kill 容器id #强制停止当前容器
docker start 容器id 是 docker container start 容器id 的缩写,其他同理。
- 删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,强制删除使用 rm -f
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
四. 实例:hello world
下面,我们通过最简单的 image 文件"hello world",感受一下 Docker。
需要说明的是,国内连接 Docker 的官方仓库很慢,还会断线,需要将默认仓库改成国内的镜像网站,具体的修改方法自行百度。
首先,运行下面的命令,将 image 文件从仓库抓取到本地。
$ docker image pull library/hello-world
上面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。
由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。因此,上面的命令可以写成下面这样。
$ docker image pull hello-world
抓取成功以后,就可以在本机看到这个 image 文件了。
$ docker image ls
现在,运行这个 image 文件。
$ docker container run hello-world
docker container run命令会从 image 文件,生成一个正在运行的容器实例。
注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。
如果运行成功,你会在屏幕上读到下面的输出。
$ docker container run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
... ...
输出这段提示以后,hello world就会停止运行,容器自动终止。
有些容器不会自动终止,因为提供的是服务。比如,安装运行 Ubuntu 的 image,就可以在命令行体验 Ubuntu 系统。
$ docker container run -it ubuntu bash
对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止。
$ docker container kill [containID]
五. Dockerfile 文件:
学会使用 image 文件以后,接下来的问题就是,如何可以生成 image 文件?如果你要推广自己的软件,势必要自己制作 image 文件。
这就需要用到 Dockerfile 文件。它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。
下面通过一个实例,演示如何编写 Dockerfile 文件。
下面我以 koa-demos 项目为例,介绍怎么写 Dockerfile 文件,实现让用户在 Docker 容器里面运行 Koa 框架。
作为准备工作,请先下载源码。
$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos
1. 编写 Dockerfile 文件:
首先,在项目的根目录下,新建一个文本文件.dockerignore,写入下面的内容。
.git
node_modules
npm-debug.log
上面代码表示,这三个路径要排除,不要打包进入 image 文件。如果你没有要排除的内容,这个文件可以不新建。
然后,在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容:
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
上面代码一共五行,含义如下。
- FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
- COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
- WORKDIR /app:指定接下来的工作路径为/app。
- RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
- EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
2. 创建 image 文件
有了 Dockerfile 文件以后,就可以使用docker image build命令创建 image 文件了。
$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .
上面代码中,-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
如果运行成功,就可以看到新生成的 image 文件koa-demo了。
$ docker image ls
3. 创建容器:
docker container run命令会从 image 文件生成容器。
$ docker container run -p 8000:3000 -it koa-demo /bin/bash
# 或者
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
上面命令的各个参数含义如下:
- -p参数:容器的 3000 端口映射到本机的 8000 端口。
- -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
- koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
- /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
如果一切正常,运行上面的命令以后,就会返回一个命令行提示符。
root@66d80f4aaf1e:/app#
这表示你已经在容器里面了,返回的提示符就是容器内部的 Shell 提示符。
执行下面的命令:
root@66d80f4aaf1e:/app# node demos/01.js
这时,Koa 框架已经运行起来了。打开本机的浏览器,访问 http://127.0.0.1:8000,网页显示"Not Found",这是因为这个 demo 没有写路由。
4. CMD 命令
上面的例子中,容器启动以后,需要手动输入命令node demos/01.js。我们可以把这个命令写在 Dockerfile 里面,这样容器启动以后,这个命令就已经执行了,不用再手动输入了。
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js
上面的 Dockerfile 里面,多了最后一行CMD node demos/01.js,它表示容器启动后自动执行node demos/01.js。
你可能会问,RUN命令与CMD命令的区别在哪里?简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
注意: 指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。现在,启动容器可以使用下面的命令。
$ docker container run --rm -p 8000:3000 -it koa-demo:0.0.1
5. 发布image镜像:
容器运行成功后,就确认了 image 文件的有效性。这时,我们就可以考虑把 image 文件分享到网上,让其他人使用。
首先,去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。
$ docker login
接着,为本地的 image 标注用户名和版本。
$ docker image tag [imageName] [username]/[repository]:[tag]
# 实例
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
也可以不标注用户名,重新构建一下 image 文件。
$ docker image build -t [username]/[repository]:[tag] .
最后,发布 image 文件。
$ docker image push [username]/[repository]:[tag]
发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。
六、Docker Desktop
Docker Desktop 是 Docker 官方为 Windows 和 macOS 用户提供的桌面应用程序,目的是让开发者能在非 Linux 系统上轻松使用 Docker(容器技术)。
Docker Desktop = 客户端 + 服务端一体化安装包(专为 Windows/macOS 设计)
- Docker CLI(客户端):你通过终端输入 docker 命令的部分
- Docker Engine(服务端):实际管理容器、镜像、网络等的后台服务
为什么需要 Docker Desktop?
因为 Docker 本质上依赖 Linux 内核(如 cgroups、namespaces),而:
- macOS 基于 Darwin 内核(不是 Linux)
- Windows 使用 NT 内核(也不是 Linux)
所以它们无法原生运行 Linux 容器。
→ Docker Desktop 的作用就是“在 Mac/Windows 上悄悄跑一个轻量级 Linux 虚拟机”,然后在这个 VM 里运行 Docker 引擎,让你感觉“像在本地用 Docker”。
Docker Desktop 的核心功能
| 功能 | 说明 |
|---|---|
| 集成 Docker 引擎 | 自动安装 dockerd(Docker 后台服务) |
| 内置轻量 Linux VM | - macOS:使用 Apple 的 Virtualization.framework 或 HyperKit- Windows:默认基于 WSL2(推荐)或 Hyper-V |
| 图形化界面(GUI) | 查看容器、镜像、卷、资源占用,一键启停 |
| 命令行支持 | 终端中可直接使用 docker、docker compose 命令 |
| Kubernetes 集成 | 可一键启用本地 K8s 集群(用于学习/测试) |
| 跨平台镜像兼容 | 在 Apple Silicon(M1/M2/M3)上自动处理 ARM64/x86_64 镜像 |
使用体验(以 Mac 为例)
- 安装 Docker Desktop for Mac
- 启动后,终端即可运行:
docker run hello-world docker compose up -d - 所有容器实际运行在一个后台的 Linux 虚拟机中,但你完全无需感知它。
- 访问
localhost:3000就能打开你在容器中运行的 Web 应用(如 Dify、Nginx 等)。
⚙️ 技术实现简图(Mac / Windows)
┌───────────────────┐
│ Your App (e.g. Dify) │ ← 你在终端运行的容器
└─────────┬─────────┘
↓
┌───────────────────┐
│ Docker Engine │ ← 运行在轻量 Linux VM 中
└─────────┬─────────┘
┌───────────────────┐
│ Linux VM (hidden)│ ← Docker Desktop 自动管理
└─────────┬─────────┘
│ Host OS │ ← macOS 或 Windows
└─────────┬─────────┘
│ Hardware │
└───────────────────┘
💡 对用户来说:就像在 Linux 上用 Docker 一样自然。
❓常见问题
Q:Linux 用户需要 Docker Desktop 吗?
A:不需要! Linux 可直接安装 docker-ce(社区版),更轻量高效。
Q:Docker Desktop 会很占资源吗?
A:默认分配 2GB 内存 + 2 CPU,可在设置中调整。关闭时几乎不耗资源。
Q:能不能不用 Docker Desktop?
A:可以,但要手动配置虚拟机(如用 Vagrant + Ubuntu + Docker),非常麻烦。Docker Desktop 是官方推荐的最简方案。
✅ 总结
Docker Desktop = 让 Mac 和 Windows 用户“无感使用 Docker”的桥梁工具
它隐藏了底层虚拟机的复杂性,让你像在 Linux 一样开发、测试容器应用 —— 比如部署 Dify、MySQL、Redis、Ollama 等。
如果你在 Mac 或 Windows 上做开发,强烈建议安装 Docker Desktop,它是现代开发者的基础工具之一。
七、docker-compose
docker-compose 是 Docker 官方提供的一个用于定义和运行多容器应用的工具。
🧩 一句话理解:
如果你有一个应用由 多个 Docker 容器组成(比如 Web 服务 + 数据库 + 缓存),
docker-compose让你用 一个配置文件 + 一条命令 就能一键启动、停止或管理整个应用栈。
🔧 核心组成部分
1. 配置文件:docker-compose.yml
- 用 YAML 格式 描述你的多容器应用。
- 定义:
- 有哪些服务(如
web、db、redis) - 每个服务用什么镜像
- 端口映射(如
80:80) - 环境变量、数据卷、网络、依赖关系等
- 有哪些服务(如
✅ 示例片段:
version: '3.8'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
2. **命令行工具:docker compose
- 常用命令:
docker compose up -d # 后台启动所有服务 docker compose down # 停止并删除容器、网络 docker compose ps # 查看运行状态 docker compose logs # 查看日志
💡 注意:新版本 Docker(v20.10+)已将 Compose 集成到
docker命令中,推荐使用docker compose(无横杠);旧版是独立命令docker-compose。
✅ 它解决了什么问题?
| 手动方式(不用 Compose) | 使用 Docker Compose |
|---|---|
要写多条 docker run ... 命令 |
只需 docker compose up |
| 容器间网络要手动创建 | 自动创建专用网络 |
| 服务启动顺序难控制 | 用 depends_on 自动排序 |
| 配置分散,难以复用 | 所有配置集中在一个 YAML 文件 |
| 无法版本管理部署流程 | docker-compose.yml 可提交到 Git |
八、一个应用启动多个容器
一个应用完全可以(而且经常)启动多个 Docker 容器**。这不仅是允许的,更是现代云原生架构中的标准做法。
✅ 核心理念:“一个容器 = 一个进程/一个职责”
Docker 的最佳实践建议:
每个容器只运行一个主进程,承担单一职责(Single Responsibility Principle)。
因此,一个完整应用通常由多个容器协同工作组成,例如:
| 应用组件 | 对应容器 |
|---|---|
| Web 前端 | nginx 或 react-app 容器 |
| 后端 API | python/fastapi 容器 |
| 数据库 | postgres 容器 |
| 缓存 | redis 容器 |
| 消息队列 | rabbitmq 容器 |
| 文件存储 | minio 容器 |
→ 这就是一个应用,但用了 6 个容器。
🌰 真实例子:Dify
正如你之前问的,Dify 一个应用就包含 10 个左右容器(Web、API、Worker、DB、Redis、向量库等)ty-reference。
❌ 常见误解
“一个应用 = 一个容器”
这是早期对 Docker 的简化理解。实际上:
- 单容器应用:适合极简工具或演示(如一个静态网站)
- 多容器应用:才是生产级系统的常态
🔧 如何管理多个容器?
靠 编排工具:
| 工具 | 用途 |
|---|---|
| Docker Compose | 在单机上管理多容器应用(开发/测试常用) |
| Kubernetes (K8s) | 在集群中管理大规模多容器应用(生产环境主流) |
例如,用 docker-compose.yml 定义 5 个服务,一条命令 docker compose up 就启动 5 个容器,并自动配置网络互通。
Kubernetes(常缩写为 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。
🧠 一句话理解:
如果把数据中心看作一台“超级计算机”,
Kubernetes 就是它的操作系统——负责调度、监控和维护成百上千个容器应用,让它们高效、稳定地运行。
💡 为什么这样做?
| 优势 | 说明 |
|---|---|
| 解耦 | 数据库升级不影响 Web 服务 |
| 独立扩展 | 只扩容 API 容器,不扩数据库 |
| 技术异构 | Web 用 Node.js,后端用 Python,数据库用 PostgreSQL |
| 故障隔离 | Redis 挂了,Web 还能显示缓存页面 |
| 安全 | 每个容器权限最小化 |
参考链接:https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
更多推荐



所有评论(0)