Docker 入门指南
引入
飞牛OS是一款基于 Debian 12 的 Linux 系统,这意味着我们可以在其上运行任何 Linux 应用程序,包括 Docker。(本质上,它可以理解为一个经过深度定制的 Linux 系统。)
飞牛的大部分拓展功能都是基于 Docker 来部署的。那么,撒子叫个 Docker 呢?
我们来设想这样一个使用场景:假设我们开发了一个项目,需要交付给甲方使用,而该项目依赖于 Python 3.1.12 运行。可是,甲方提供的服务器上只有 Python 3.1.14。
为了保证项目尽快上线,我们当然可以将 Python 版本降级。但随之而来的问题是:项目的运行依赖不仅仅是 Python 版本,整个系统环境也存在差异。好在目前只需部署一台服务器,你可能花了一整天才解决了权限问题,此时已经疲惫不堪,而急催进度的甲方电话又不断打来,你该怎么办?
这仅仅是一台服务器的情况。如果是一个服务器集群呢?聪明的你肯定会想到:“我可以写个自动化脚本,把项目文件打包进一个虚拟机中,然后在所有服务器上运行这个虚拟机,这样就能保证环境一致了!”
虽然无法完全控制服务器的本地环境,但虚拟机内的依赖环境是可控的,并且始终与开发环境保持一致,从而彻底避免依赖问题。
恭喜你!你已经发现了 Docker 所要解决的问题——如何在大量不同的硬件环境中快速上线服务。简单来说,Docker 就是为了解决这一问题而生。
接下来,让我们看看飞牛 OS 中的 Docker 管理面板。
初次使用飞牛OS时,如果直接在应用中心安装 APP 可能会报错。你需要先安装 Docker,需在管理面板中点击“开启 Docker”即可。
在飞牛 OS 的 Docker 管理界面中,共有 6 个选项,我们将逐一介绍。
概览
顾名思义,此页面展示了当前运行的服务数量、镜像数量、容器数量以及宿主机的资源占用情况。
以图中所示的服务为例,共由 5 个容器组成。这 5 个容器协同工作,共同构成了一个完整的服务,其中包括前端、后端和数据库等模块。每个模块由一个独立的容器承担,而这些容器都是基于相应的镜像构建而成的。
举个很香的例子
(清晨七点半,小区门口飘着油香)
"王师傅!老样子加俩蛋!"
"好嘞李姐,您稍等!"
这个热气腾腾的煎饼摊,其实就是个活生生的Docker现场:
-
镜像(菜谱本)
王师傅的围兜口袋里揣着本发黄的《王氏煎饼秘笈》,从面糊配比到刷酱手法都写得明明白白。这本祖传秘籍就像Docker镜像,甭管是今天做还是明年做,保准出来的煎饼都是一个味儿。
-
容器(铛上的煎饼)
铛子上一溜排开五六个煎饼,每个都裹着不同的配料:李姐的无葱版、张大爷的双薄脆、隔壁小学生的番茄酱特制款...这些正在滋滋作响的煎饼就是容器,虽然配料不同,但都按同一本秘籍摊出来的。
-
服务(夫妻档早餐摊)
王师傅负责摊饼,媳妇儿在旁边装袋收钱,两口子配合得行云流水。这就跟Docker服务似的——高峰期学生来扎堆时,王师傅一嗓子"孩儿他妈快来搭把手!",瞬间启动"容器扩展",出餐速度立马翻倍。
-
网络(摊位暗藏玄机)
仔细看,案板底下藏着乾坤:传菜窗直通后方厨房,对讲机连着隔壁豆浆铺,调料车随用随补。这些暗搓搓的通道就像Docker网络,让面糊、鸡蛋、生菜能精准送达每个煎饼,保证前摊后厨配合得天衣无缝。
(八点整,城管巡逻车缓缓驶过……)
王师傅利索地收起遮阳伞,所有家当三分钟打包完毕——在换到二院门口裤衩一声三分钟全部打开,不调地点不调环境,这个就叫优雅。
容器
这里不会教你build容器,知道容器是基于镜像运行的,报错的时候知道如何排查就可以了
比如这里的rag-web-ui就报错了255错误码
报错会有很多种,因此通常会约定一个数字用来表示发生了什么错误,那么如何找到这个255报错是什么意思呢?点击查看日志
这里会就会给出运行日志和报错原因
镜像
镜像是 Docker 的核心概念之一,可以将其理解为一个轻量级、独立且可执行的软件包,其中包含了运行应用程序所需的所有内容,包括代码、依赖项、库、环境变量和配置文件等。当你在飞牛 OS 中使用 Docker 时,所有的容器都是基于这些镜像创建的。
镜像仓库
如果你需要使用某个特定版本的应用程序,可以通过 Docker Hub 或其他镜像仓库来拉取所需的镜像。在飞牛 OS 中,点击“拉取”按钮后,输入镜像名称和标签(如 nginx:latest
)),系统会自动从远程仓库下载该镜像到本地。
这里如果拉不下来镜像报错的话可以看这里
Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个简单的 YAML 文件(通常是 docker-compose.yml
)),你可以定义应用程序的服务、网络和卷。然后,使用一条命令,就可以启动并运行整个应用程序。
我们来举个实例:
version: '3' # Docker Compose 文件的版本,'3' 是常用版本,确保兼容性
services: # 定义多个服务,表示应用的不同部分
web: # 名为 web 的服务(WordPress 网站)
image: wordpress:latest # 使用 WordPress 的最新镜像
ports: # 将主机的端口映射到容器内的端口
- "80:80" # 将主机的 80 端口映射到容器的 80 端口,用于网页访问
volumes: # 将主机目录映射到容器内的目录,持久化数据
- ./wordpress:/var/www/html # 将当前目录下的 wordpress 文件夹映射到容器中的网站根目录
environment: # 设置环境变量,配置 WordPress
WORDPRESS_DB_HOST: db:3306 # 数据库主机地址,"db" 是下面定义的服务名,连接数据库的默认端口是 3306
WORDPRESS_DB_PASSWORD: example # 数据库密码,用于 WordPress 连接数据库
db: # 名为 db 的服务(MySQL 数据库)
image: mysql:5.7 # 使用 MySQL 5.7 版本镜像
ports: # 将主机的端口映射到容器内的端口
- "3306:3306" # 将主机的 3306 端口映射到容器的 3306 端口,用于数据库连接,注意哈前面的是运行在NAS上的端口
后面的是容器的端口
volumes: # 将主机目录映射到容器内的目录,持久化数据库数据
- ./mysql:/var/lib/mysql # 将当前目录下的 mysql 文件夹映射到容器中的 MySQL 数据存储目录
environment: # 设置环境变量,配置 MySQL 数据库
MYSQL_ROOT_PASSWORD: example # 设置 MySQL 的 root 用户密码
Docker 网络
docker的三种网络模式
-
Host 模式:
- 原理:容器直接使用宿主机的网络堆栈,和宿主机共享同一个 IP 地址和端口。
- 优点:消除了网络虚拟化层,能够提供更高的网络性能。
- 缺点:容器与宿主机紧密耦合,安全性较低,不适合需要严格隔离的场景。
- 适用场景:对网络性能要求较高且安全风险可控的场合。
-
Bridge 模式:
- 原理:Docker 为每个容器创建独立的网络命名空间,并通过一个虚拟网桥将多个容器连接在一起。容器之间通过这个网桥进行通信,同时通过 NAT 与外部网络连接。
- 优点:提供了较好的网络隔离性和灵活性,是 Docker 的默认模式。
- 缺点:在某些复杂场景下可能需要额外配置容器间的通信和端口映射。
- 适用场景:大多数应用场景,如 Web 服务、数据库等。你还可以创建自定义桥接网络来更精细地控制网络配置。
-
None 模式:
- 原理:容器不被分配任何网络接口,即不连接到任何网络。
- 优点:提供了完全的网络隔离,可以用于需要自定义网络配置的场景。
- 缺点:容器无法直接进行网络通信,通常需要手动设置网络。
- 适用场景:在极少数情况下使用,例如完全隔离的计算任务或需要自行管理网络的容器。
光字没意思我们来画个图,
欸~这不比光字的清晰多了