灵活运用Docker--部署应用:Nextcloud&Ubuntu
灵活运用Docker–部署应用
简单来说就是为了方便,直接拉取镜像创建容器然后访问就可以用了,相当于是开箱即用。
Docker部署Nextcloud
无聊翻阅宝塔的Docker应用列表的时候发现了NextCloud:
开源免费的私有云存储网盘项目
我觉得他最大的优点就是可以多端协作,在服务端部署后,安卓、windows、Web网页,豆可以操作。
安装与启动
其实没啥要说的,指令流程可以去搜一下,甚至如果你使用宝塔
只需要在docker的应用列表那里搜Nextcloud
就可直接安装了,但是安装好后要多等一会儿,我2c2g的服务器点击启动后需要等大概1分钟左右那个面板状态才显示已启动,才能访问,所以说如果你点了启动发现状态没更新,不要担心,多等一会就OK。访问进去后直接让你注册,你直接输入自己想用的输入用户名和密码,直接输入然后点击确定就可以了。
挂载第三方存储
这个值得一提,如果说你需要挂载第三方存储,例如对象存储,需要在部署好后,在**应用-已安装应用-外部存储支持(可能是英文,自己翻译一下)**启用后,就可以在左侧列表看到外部存储
这个选项,然后根据实际情况配置外部存储即可。
PS:如果你选择S3存储,那么主机名就是存储桶的那个链接,不要带http://
或https://
等协议头,后面结尾不要跟路径和/
直接就写域名,下面端口如果http就写80,https就写443。
更多内容可以查看官方文档配置外部存储(GUI)
Docker部署Ubnutu(乌班图)
因为穷,所以没钱买服务器,或者说只是跑代码,不划算,所以找人花钱在别人服务器上部署一个Docker容器部署乌班图系统。
安装和部署SSH
直接搞个乌班图docker镜像创建容器即可,然后用伪终端在容器内执行代码安装ssh,配置一个端口转发暴露即可使用ssh连接容器。是的,没错,直接使用ssh -p 转发的容器SSH端口 root@宿主机IP
就可以链接了。链接的不是宿主机,就是部署了乌班图系统的Docker容器。
访问容器
推荐使用指令对docker的容器端口进行转发到宿主机端口,转发后即可访问转发后的端口进行工作。当然也可以选择暴露全部端口,但是不安全,而且容易造成端口冲突。
关于systemctl
以下内容由AI总结
在 Docker 容器中使用伪终端来执行 systemctl
或类似的系统服务管理指令时,通常会遇到问题,主要是因为 Docker 容器的设计理念与传统的虚拟机或物理服务器有所不同。以下是一些关键原因:
1. Docker 容器的“最小化”特性
Docker 容器通常被设计为运行单一进程(或一个应用程序)。为了减少镜像体积和提高启动效率,容器内部不包含完整的操作系统服务管理框架(例如 systemd
或 init
系统)。因此,容器内无法使用 systemctl
来启动、停止服务或管理系统状态。
2. 缺少 systemd
systemd
是一种系统和服务管理器,通常用于管理 Linux 系统中的服务。Docker 容器默认并不包含 systemd
,因为容器内只运行一个主进程(通常是某个应用或服务),没有像传统系统中那样的多个后台服务。所以,systemctl
无法在容器内正常工作,因为它依赖于 systemd
来启动和管理服务。
3. 容器的 PID 1 问题
容器的 PID 1 是应用程序本身,而不是一个管理系统(例如 systemd
)。systemd
通常需要在主机的 PID 1 进程中运行才能正确管理服务和处理信号。然而,在 Docker 中,PID 1 只是你启动的应用进程,这意味着无法通过 systemctl
来管理其他进程。
4. systemctl
需要一个运行时环境
systemctl
和类似的服务管理命令通常需要访问一个完整的操作系统环境,包括系统日志、配置文件、进程管理等,而容器通常不具备这些环境。容器的文件系统和网络配置是有限制的,且通常不提供完整的系统环境来支持传统的服务管理。
解决方案:
使用
docker exec
:
如果你希望在已经运行的容器中执行某些操作,可以使用docker exec
来启动命令,而不是使用systemctl
。例如:1
docker exec -it <container_id> bash
然后在容器内运行所需的命令。
使用自定义启动脚本:
你可以为容器编写一个自定义的启动脚本,用于启动多个进程。你可以使用supervisord
或tini
等工具来模拟服务管理。使用 Docker Compose:
如果你需要管理多个服务,可以使用 Docker Compose 来定义多个容器,并且将它们作为服务进行管理。为容器提供
systemd
支持(不推荐):
如果确实需要systemd
,你可以在 Docker 容器中安装和配置它,但这通常不推荐,除非你有特定需求。安装systemd
会使容器变得更加复杂,并且失去了 Docker 的轻量化优势。
总结:
systemctl
等工具依赖于传统的 Linux 系统环境和服务管理,而 Docker 容器设计上并没有提供这种环境。你可以使用其他方式(如 supervisord
)来启动和管理多个进程,但这通常不是 Docker 的推荐做法。
关于我的解决方案:既然不能用那就不用,直接cd
进程序的安装目录./可执行文件 指令
执行命令
写在最后
Docker容器中部署Ubuntu后使用容器内ssh、伪终端
跑代码再部署其他应用属实是无奈之举,这可能不符合docker的设计理念,甚至可能有一些安全隐患,所以请自行甄别是否合理,可行。
完结撒花!