在 NAS 系统中,Docker 是一款非常重要的应用程序,它可以极大地拓展 NAS 的应用能力。本指南将带您深入了解 Docker 及其配套工具 Docker Compose,帮助绿联 NAS 新手用户快速掌握这些工具的使用。
Docker 是一个开源的容器引擎,它允许开发者将应用程序及其所有依赖打包到一个便携的容器中。这些容器可以运行在任何流行的 Linux 或 Windows 系统上,甚至支持虚拟化。与虚拟机不同,Docker 容器非常轻量,因此它们非常适合部署微服务以及构建 CI/CD(持续集成/持续交付)工作流。
简单来说:Docker 可以看作是类似虚拟机的工具,但它更轻量。您可以把 Docker 容器类比为一个小型的操作系统环境,比如 CentOS 和 MySQL 。
为了帮助您更好地理解 Docker,以下是一些基本术语:
镜像(Image):Docker 镜像是用于创建容器的只读模板。镜像包含了运行应用程序所需的所有内容:代码、运行时环境、库、环境变量、配置文件等。您可以把它想象成一个 Windows 的 .exe
安装包。
容器(Container):容器是从镜像创建的可执行实体,可以被启动、停止、移动或删除。每个容器都是独立的,拥有自己的文件系统、网络接口和进程空间。可以把它类比为一个已经安装好的程序。
镜像仓库(Repository):Docker Hub 是公共的 Docker 镜像仓库。在 UGOS Pro 系统中,镜像仓库默认仅展示 Docker Hub 官方镜像,若需下载其它仓库的镜像请按镜像名下载,查看 操作指引
高效性:相比虚拟机,Docker 容器更轻量,启动速度更快。
隔离性:每个容器都有自己的文件系统、网络栈和进程空间,确保容器之间相互隔离。
易于维护:更新或回滚应用只需替换镜像,操作非常简单。
Docker Compose 是用于定义和运行多容器应用程序的工具。通过一个 YAML
文件(通常命名为 docker-compose.yml
)配置应用程序的服务,然后使用一个命令即可启动和管理所有服务。
简单来说:Docker Compose 是 Docker 的一个工具,可以实现类似“全自动安装”的效果,帮助您避免每次手动配置。
集中管理:通过一个配置文件管理多个容器和服务。
自动化部署:只需一个命令即可启动、停止或重启所有容器。
可移植性:docker-compose.yaml
文件让您可以轻松地在不同环境中重复相同的配置。
Docker Compose 文件通常命名为 docker-compose.yaml
,它使用 YAML
语法来描述服务、网络和存储空间。
文件扩展名可以是 .yml
或 .yaml
,两者没有任何区别。
在 docker-compose.yml
文件中,您可以定义服务、网络和存储空间的配置,保证应用程序的高效运行。
您可以在【Docker>项目】页面创建或导入 docker-compose.yml
文件。
一个基本的 Compose 文件结构如下:
version: # 指定 Docker Compose 文件格式的版本
services: # 定义服务列表
image: # 使用的镜像
ports: # 指定端口映射
volumes: # 存储空间挂载
environment: # 设置环境变量
以下通过一个简单的 docker-compose.yml
示例来讲解具体配置,展示如何通过 Compose 创建一个由 Nginx 服务器和 MySQL 数据库组成的 Web 应用程序:
services: # 定义服务列表
web: # 服务名称
image: nginx:latest # 使用的镜像和版本
ports: # 端口映射
- "8080:80" # 将NAS的8080端口映射到容器的80端口
volumes: # 存储空间挂载
- ./html:/usr/share/nginx/html # 将当前目录下的 html 文件夹挂载到容器内的 /usr/share/nginx/html
depends_on: # 依赖关系
- db # web 服务依赖于 db 服务
environment: # 设置环境变量
- NGINX_PORT=80 # 设置环境变量 NGINX_PORT 的值为 80
networks: # 网络设置
- bridge # 指定服务所属的网络。
db: # 另一个服务名称
image: mysql:5.7 # 使用的镜像
environment: # 设置环境变量
MYSQL_ROOT_PASSWORD: example # 设置 root 密码
MYSQL_DATABASE: testdb # 创建一个数据库
MYSQL_USER: testuser # 创建一个用户
MYSQL_PASSWORD: testpass # 设置用户密码
volumes:
- db_data:/var/lib/mysql # 将数据卷挂载到容器内的 /var/lib/mysql
networks: # 网络设置
- host # 指定服务所属的网络。
services:
这是整个配置的核心部分,定义了多个服务,每个服务都代表了一个容器。
web 和 db 分别是两个服务的名字,可以根据需要自定义。
web和db等容器名需要和services有个递进关系,一般2个字符就行,容器和容器对应的environment等参数名字之间也需要有2个字符递进,environment参数和他的下级端口映射“- NGINX_PORT=80
”也有2个字符递进。递进可以2个字符以上,但是同级的参数递进的层次要相同。
image:
image
指定了服务使用的 Docker 镜像。镜像可以是从本地或 Docker Hub 仓库中获取,通常镜像名称后会带有版本号(例如 nginx:latest
)。
ports:
指定端口映射,格式为 【NAS端口】:【容器内端口】。nginx在容器内本身是80端口,将80端口映射到了NAS的 8080 端口。通过NAS的8080端口就能访问容器内的80端口。
volumes:
指定存储空间挂载,可以将NAS上的目录挂载到容器中,或者使用命名的数据卷。
对于 Nginx 服务,我们挂载了NAS上的 ./html
目录到容器的 /usr/share/nginx/html
目录。这样可以让容器映射数据都集中在容器项目根目录下。在UGOS Pro中,一般使用“./
”来代表当前 Docker Compose 文件所在的目录。
对于 MySQL 服务,我们使用了命名的数据卷 db_data
来持久化数据。
在 Docker 中,命名的数据卷(named volumes)是 Docker 管理的一种特殊类型的卷,用于持久化存储数据。与前面的路径挂载映射不同,命名的数据卷由 Docker 管理,并且可以独立于容器存在。即使删除了使用该数据卷的所有容器,数据卷本身仍然保留。为了便于清理,一般我们不使用数据卷功能。
depends_on:
指定服务间的依赖关系。在这个例子中,web
服务会在 db
服务启动之后再启动。
environment:
设置环境变量。对于 MySQL 服务,设置了数据库相关的环境变量,如密码、数据库名等。
MYSQL_ROOT_PASSWORD: example
:设置 MySQL 数据库的 root
用户密码为 example
。
MYSQL_DATABASE: testdb
:在数据库中创建一个名为 testdb
的初始数据库。
MYSQL_USER: testuser
:创建一个名为 testuser
的 MySQL 用户。
MYSQL_PASSWORD: testpass
:为 testuser
用户设置密码为 testpass
。这些环境变量帮助在容器启动时自动配置 MySQL 实例。
networks:
指定服务所属的网络。在这个例子中,bridge
网络模式意味着容器将通过虚拟网络桥接到 NAS 的网络中。容器之间可以通过这个桥接网络通信。与 bridge
不同,host
网络模式直接使用 NAS 主机的网络,容器不会有独立的 IP 地址,而是使用主机的网络栈。这意味着 MySQL 服务可以直接通过主机的 IP 进行访问。了解《bridge 和host 网络模式的区别》
点击查看《Docker玩法》了解更多有关Docker的使用教程。