开篇
因为还是很多同学对docker部署云里雾里。本篇文章是一个在nas上部署docker应用的基础教程,不是新人的可以跳过了哈。文章末尾会添加docker基本知识问与答的腾讯文档,我会不定时更新。有docker相关疑问可以先搜索下。
本文尽量从新人角度解说问题,所以文章会很长。如果文章说的有什么不对的,欢迎批评指正,我会在问与答文档中修正。

什么是nas

既然要写,那就要尽量写得全面一点,从nas开始说起。
首先介绍下nas,以及为什么用nas,以及新手适合什么样的nas
nas本质上就是一台小型电脑,相对于普通电脑,nas主要作用是存储,
存储相册、影视、学习资料等等
有些同学之前问飞牛nas的主要功能是什么,我觉得所有的nas主要功能也就是影音、相册、下载、存储、备份,再就是扩展的话一般电脑能做的nas也能做。因为nas的基础功能使用其实很简单,我就不单独讲了,而且越是优秀的nas,应该越要简约化操作。不然除了耗电少点,哪有windows运行着更功能强大。
既然是存储为主,nas的必须要至少双盘位的,以下对比下各品牌双盘位、四盘位nas的功能及价格差别
1、华为家庭存储
对于完全不想折腾,也不需要扩展应用的新人来说,大部分nas本身自带的影视、相册、备份功能就能满足你的需求了
但是nas也还是有个适合性,手机、电脑等是华为生态的同学,推荐使用华为家庭存储
优点:
  • 设计美观,外观现代。
  • 与华为设备无缝集成,华为手机相册影视无感式存储是所有其他nas都无法企及的
  • 易于使用,自带照片AI搜索,适合普通消费者。
缺点:
  • 不支持Docker等高级功能。
  • 缺乏热插拔和定时开关机功能。
  • 初始软件支持有限,尤其是对第三方应用的支持。
  • 无四盘位款
2、群晖
优点:
  • 老牌nas,用户界面友好,易于设置和管理。
  • 强大的软件生态系统,提供丰富的应用程序。
  • 高可靠性和稳定性。
  • 支持多种RAID配置以确保数据安全。
  • 良好的客户服务和技术支持。
  • 文件管理支持格式多,文件分享方便
缺点:
  • 影视自动刮削能力很一般,相册无ai,docker权限低了点(不能自动创建映射文件夹)
  • 对于非技术用户来说,某些高级功能的学习曲线较陡峭。
3、极空间
优点:
  • 提供良好的多媒体处理能力,影视刮削齐全
  • 一个移动app集合所有功能
缺点:
  • 品牌知名度相对较低。
  • 社区和支持可能不如老牌厂商强大。
4、铁威马
优点:
  • 价格相对实惠。
  • 提供多种型号,适应不同需求。
  • 具备基本的文件共享和备份功能。
缺点:
  • 软件界面和用户体验通常被认为不如群晖或威联通。
  • 技术支持和服务可能不及行业领导者。
5、海康威视(Hikvision)
优点:
  • 在安防监控领域有很强的专业背景。
  • NAS产品往往结合了监控视频管理和存储功能。
  • 适用于需要整合存储和监控系统的用户。
  • 价格较低
缺点:
  • 主要针对特定市场,通用NAS功能可能不是最强。
  • 对于非监控用途,可能没有其他品牌那样全面的功能集。
  • 双盘位的mage20pro不支持docker

6、绿联(UGREEN)

优点:
  • 价格经济。
  • 适用于小型企业和个人用户的简单存储解决方案。
  • 易于安装和使用。
缺点:
  • 功能较为基础,缺少高级特性。
  • 可能缺乏企业级的安全特性和性能。

7、威联通(QNAP)

优点:

  • 老牌nas,丰富的硬件选择,从入门级到高端都有覆盖。

  • QTS操作系统提供了广泛的附加功能和应用程序。

  • 支持强大的多媒体服务器和虚拟化技术。

  • 广泛的第三方网盘挂载支持

缺点:

  • 高端型号的价格较高。

8、拾光坞(TimeBox)

优点:

  • 专注于照片和视频存储,特别适合家庭用户。

  • 设计简洁,操作简便。

  • docker、虚拟机等该有的有,甚至还有pdcn。

  • 价格很低

缺点:

  • 品牌影响力较小,社区资源可能不多。

  • 只有1盘位,无法组raid


9、x86闲置电脑自己安装飞牛等nas系统
优点:
硬件配置及价格自己可控,硬件可拓展性、可组合性强
缺点:
折腾,飞牛目前也还不够完善,有不少需要折腾。
10、总结
如果我自己选,如果华为家庭存储支持了docker,我肯定选他。
如果想功能齐全又有软件扩展性,可以选极空间、威联通、群晖、铁威马、海康威视、绿联都行,四盘位价格都差不多。用的不合适7天无理由
如果想便宜又扩展性好,咸鱼x86电脑装飞牛,就是得折腾。

 

什么是docker,什么又是compose

这里介绍用官方语言和一句话通俗来讲相结合,更适合新手理解。

Docker 是一个开源的应用容器引擎,它允许开发者将他们的应用程序及其依赖打包进一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,甚至可以实现虚拟化。Docker 容器是轻量级的、独立的,并且几乎不消耗额外的系统资源,这使得它们成为部署微服务和构建持续集成/持续交付(CI/CD)工作流的理想选择。句话就是,docker作用同虚拟机,直接类比成windows或者dos的一种小型系统环境也行)

 

以下是 Docker 的一些关键特性和概念:

镜像 (Image): Docker 镜像是只读模板,用于创建 Docker 容器。镜像包含了运行时所需的一切:代码、运行时环境、库、环境变量以及配置文件等。镜像可以通过 Dockerfile 自动构建。(镜像类似于windows的exe程序安装包)

 

容器 (Container): 容器是从镜像创建的

可执行实体。它可以被启动、停止、移动或删除。每个容器都是相互隔离的,提供了自己的文件系统、网络接口和进程空间。(容器类似windows的exe安装包安装好后的程序)

Dockerfile: 这是一个文本文件,其中包含了一系列指令,这些指令告诉 Docker 如何从基础镜像构建一个新的镜像。比如安装软件包、复制文件等操作。(这里新人一般不用涉及,如果涉及到要了解这,也不应该是新人水准了)

仓库 (Repository): 仓库用来存放镜像,可以理解为代码控制中的代码仓库。Docker Hub 是公共的 Docker 仓库,用户也可以搭建私有的 Docker 仓库。(仓库类似于华军软件园等可以下载exe安装包的网站)

 

docker run命令:docker run 是 Docker 中一个非常重要的命令,用于根据给定的镜像启动一个新的容器。这个命令结合了 docker create(创建容器)和 docker start(启动容器)的功能。使用 docker run 时,如果指定的镜像不存在于本地,Docker 会尝试从配置的仓库中拉取该镜像。

docker run命令后面附带了启动容器所需要配置的所有参数,可以实现一键启动容器

例如:docker run -d -p 8080:80 nginx

docker run命令和docker compose可以互相转换,但是docker run的缺点是需要在ssh命令行下运行,命令参数保存和修改不方便,所以才需要使用compose,而且docker run不方便同时运行多个关联容器。

Docker Compose: 这是一个工具,用于定义和运行多容器的 Docker 应用程序。通过一个 YAML 文件来配置应用程序的服务,然后使用单个命令,就可以从配置中创建并启动所有服务。(这个是docker的一个工具,类似于把exe的安装程序固定配置好一些参数,实现一键化安装,exe安装程序时不用每次对一些选项进行选择后再下一步,而是类似360软件管家的一键安装。如果不是使用compose,正常docker镜像安装的时候也是要一步一步地确认配置不是么)

 

Docker Swarm: Docker 提供的一种集群管理和编排工具,可以让你在多个主机上管理一组 Docker 节点作为单一的虚拟系统。

Kubernetes (K8s) 集成: 尽管 Docker 有自己的集群管理解决方案(如 Swarm),但 Kubernetes 已经成为了容器编排的事实标准。Docker 也支持与 Kubernetes 集成,以便更好地进行大规模容器化应用的部署和管理。(swarm和k8s新手不接触)


 

Docker 的主要优点包括但不限于:

一致性: 开发者可以在本地构建和测试容器化的应用,确保其在生产环境中也能正常工作。

效率: 由于共享主机内核,Docker 容器比传统虚拟机更轻量,启动速度更快。

隔离性: 每个容器都有自己的文件系统、网络栈和进程空间,从而保证了容器之间的隔离。

易于维护: 更新或回滚应用变得非常简单,只需替换镜像即可。

总之,Docker 通过提供一种标准化的方式来打包、分发和运行应用,极大地简化了开发运维流程,提高了工作效率。


 

docker compose的配置怎么写

Docker Compose 通过一个 YAML 文件来配置应用程序的服务,这个文件通常命名为 docker-compose.yml,放置在每个容器的项目目录下

从功能和语法上来说,你可能见过2种配置文件,.yml 和 .yaml 没有任何区别。它们只是文件扩展名的不同,不会影响文件内容的解析方式。

通过上传的yml文件,不限制必须取名为docker-compose.yml,所以更适合取名为容器相关名称方便存储yml文件

下面通过一个简单的 docker-compose.yml 示例来讲解具体配置,下面的compose代码我们将创建一个 Web 应用程序,该应用由一个 Nginx 服务器和一个 MySQL 数据库组成:


version: '3.8'  # 指定 Docker Compose 文件格式的版本

services:  # 定义服务列表
  web:  # 服务名称
    image: nginx:latest  # 使用的镜像
    ports:  # 端口映射
      - "8080:80"  # 将宿主机的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:  # 网络设置
      - app-network  # 加入名为 app-network 的网络

  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:  # 网络设置
      - app-network  # 加入名为 app-network 的网络

volumes:  # 定义数据卷
  db_data:  # 数据卷名称

networks:  # 定义网络
  app-network:  # 网络名称

详细讲解,以下宿主机均意为nas

  1. version:

  • 指定了使用的 Docker Compose 文件格式的版本。这里使用的是 3.8 版本。因为compose也是个工具,也有很多版本,但基本不会变太多,飞牛中可以不写这行,写了还会出现如下错误,不用管


  • services:

  • 这是整个配置的核心部分,定义了多个服务,每个服务都代表了一个容器。

  • web 和 db 分别是两个服务的名字,可以根据需要自定义。

  • web和db等容器名需要和services有个递进关系,一般2个字符就行,容器和容器对应的environment等参数名字之间也需要有2个字符递进,environment参数和他的下级端口映射“– NGINX_PORT=80”也有2个字符递进。递进可以2个字符以上,但是同级的参数递进的层次要相同

  • image:

  • 指定构建容器所用的镜像。可以是本地已有的镜像或远程仓库中的镜像。映像名后的:数字是映像的版本号。一些映像名称使用的是完整的网址,如果不是完整网址的就是从dokcerhub仓库拉取。

  • ports:

  • 指定端口映射,格式为 [宿主机端口]:[容器内端口]。nginx在容器内本身是80端口,将80端口映射到了宿主机的 8080 端口。通过nas的8080端口就能访问容器内的80端口了。

  • volumes:

  • 指定卷挂载,可以将宿主机上的目录挂载到容器中,或者使用命名的数据卷。

  • 对于 Nginx 服务,我们挂载了宿主机上的 ./html 目录到容器的 /usr/share/nginx/html 目录。在飞牛中,我一般使用“./”来代表容器项目根目录,而例如“./data”则是容器项目下的data子目录,这样可以让容器映射数据都集中在容器项目根目录下。

  • 对于 MySQL 服务,我们使用了命名的数据卷 db_data 来持久化数据。

  • 在 Docker 中,命名的数据卷(named volumes)是 Docker 管理的一种特殊类型的卷,用于持久化存储数据。与前面的路径挂载映射不同,命名的数据卷由 Docker 管理,并且可以独立于容器存在。即使删除了使用该数据卷的所有容器,数据卷本身仍然保留,直到你显式地删除它。为了便于清理,一般我不使用数据卷功能,你可以在1panel里可视化地清理数据卷

  • depends_on:

  • 指定服务间的依赖关系。在这个例子中,web 服务会在 db 服务启动之后再启动。

  • environment:

  • 设置环境变量。对于 MySQL 服务,设置了数据库相关的环境变量,如密码、数据库名等。

  • networks:

  • 指定服务加入的网络。这里两个服务都加入了同一个名为 app-network 的网络,以便它们能够相互通信。

  • 我一般使用network_mode: bridge,让容器都使用bridge网络,如果是network_mode: host,则容器使用的是宿主机网络,那么就需要映射端口,容器的端口自动映射宿主机同名端口。不是特别的容器应用,建议都使用bridge网络或者自建网络,以免端口混乱,而且一般nas都有自定义网络的数量上限,飞牛是20个。

  • volumes 和 networks:

  • 在文件的末尾定义了全局的数据卷和网络。这些可以在不同的服务之间共享

  10、你有时候还可以看到我通过在容器总目录下配置 .env 文件来管理全局环境变量。

在下面这个例子中,db 服务使用了 .env 文件中的 MYSQL_ROOT_PASSWORD 变量。


db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}  # 使用 .env 文件中的值
      - MYSQL_DATABASE=testdb

 

  •  
  •  
# .env 文件内容MYSQL_ROOT_PASSWORD=example

11、如果你需要从 Dockerfile 构建镜像,可以通过 build 关键字指定构建上下文。在下面这个例子中,web 服务是从当前目录下的 ./web 目录中的 Dockerfile 构建的。

version: '3.8'

services:
  web:
    build:  # 指定构建上下文
      context: ./web  # Dockerfile 所在目录
      dockerfile: Dockerfile  # Dockerfile 文件名
    ports:
      - "8080:80"

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

 

我之前写的compose的教程

compose的一些问题汇总

红薯丸子,公众号:红薯丸子不定期更新的docker镜像源+compose部署基础视频教程等常见问题汇总贴

这个是我之前写的compose文章,里面主要讲了下面几点,作为对本文的补充

1、补充了一个基础的飞牛部署compose的视频教程

2、docker映像拉取不了的解决方案

3、多款nas下如何使用docker compose的教程

4、nas的外网异地访问4种方案

 

docker应用问与答Q&A

【腾讯文档】docker应用问与答
https://docs.qq.com/doc/DYWZXWG1ZVFNncm9W
 
 如果文章对你有帮助,欢迎点赞、关注、分享
公众号内有更多应用文章
有好的建议或者需求也可以底部留言告诉我,知无不言,互助共进