容器概况
+----------------------------------------+
| NAS |
| 192.168.0.121 |
| 网站路径: /volume1/docker/nginx1/www |
| |
| +----------------------------------+ |
| |docker | |
| |+-------------------------------+ | |
| || Nginx | | |
| || | | |
| || ports: | | |
| || "7922:22" | | |
| || "...:..." | | |
| || volumes: | | |
| || /volume1/docker/nginx1/www | | |
| || :/www | | |
| |+-------------------------------+ | |
| | | |
| |+-------------------------------+ | |
| || Spug | | |
| || | | |
| || | | |
| || | | |
| |+-------------------------------+ | |
| +----------------------------------+ |
+----------------------------------------v
Spug发布配置
spug安装nvm,使用nvm安装node
# 保持Spug容器运行,进入容器后执行
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
# 添加环境变量
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
# 安装想要的node版本
nvm install 16.20.0
# 安装pnpm (推荐使用,因为pnpm在装包时用的都是软链接)
npm install pnpm -g
打开新的终端将这个容器打包成镜像
# 制作新镜像
# 语法:
# docker commit -m="提交描述信息" -a="作者" 容器id 自定义镜像名:[TAG]
docker commit -m="add node" [容器id] deq/spug:v1.0
# 检查镜像列表是否存在
docker images
接着停掉旧spug服务,使用新spug镜像启动容器。
如果是docker-compose.yml
则将image
选项改成image: deq/spug:v1.0
即可。
发布配置
踩坑 - 群晖root ssh连接无法使用sftp
本来计划Spug里添加发布主机为Nas(宿主机)的,实际操作后,发布会在构建完成,传输目标主机这阶段出现报错
Exception: EOF during negotiation
;
这是因为群晖root ssh
连接无法使用sftp
导致的。
那换用群晖正常用户呢,也不行,添加主机时就会报错
Exception: add public key error: Could not chdir to home directory /var/services/homes/zhangsan: No such file or directory mkdir: cannot create directory '/var/services/homes': File exists
这个报错是因为群晖正常用户只会进入/volume1
目录导致的。
既然这样那只能曲线救国了 +.+ …
如上面「容器分布」所示,将网站路径挂载入nginx容器,然后nginx容器开放ssh连接。Spug主机管理里再添加这个容器主机就好了。
开启docker容器ssh连接
nginx容器本身没有开放ssh连接,因此这里改造一下
先正常运行nginx容器, 然后进去安装openssh-server
# 列出容器列表
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d54de52ebbac nginx "/docker-entrypoint.…" 13 hours ago Up 13 hours 0.0.0.0:7922->22/tcp, 0.0.0.0:7900->80/tcp nginx_web_1
# 进入nginx容器改造,开放ssh连接
docker exec -it nginx_web_1 bash
## 安装ssh服务端
apt update
apt install -y vim
apt install -y openssh-server
## 修改配置 允许root远程登录
vim /etc/ssh/sshd_config
## 在`#PermitRootLogin prohibit-password`这行下添加
PermitRootLogin yes
#---------------------接下来有坑,以下操作无意义
## 开启ssh服务
service ssh star
##或 /etc/init.d/ssh star
##或让sshd保持在前台运行 /usr/sbin/sshd -D
## 查看状态
service ssh status
## 设置SSH服务开机自动启动
systemctl enable ssh.service
## 验证
systemctl is-enabled ssh.service
## 如果输出“enabled”则成功。否则失败会输出“disabled”。
# 在.bashrc文件中添加启动
$ vim /root/.bashrc
# 在.bashrc末尾添加如下代码
service ssh start
坑: 上面说的坑是,加了启动和自动都无效。
加了启动和自启的操作后提交成新的镜像再用新镜像创建容器,发现sshd并未默认运行。
授权秘钥登录
# 授权(不存在authorized_keys文件时,可以手动创建, touch /root/.ssh/authorized_keys)
echo "公钥" >> /root/.ssh/authorized_keys
接着不要退出容器,打开新的终端,将当前容器制作为镜像
docker commit -m="add ssh" d54de52ebbac deq/nginx:v1.0
# 检查镜像列表是否存在
docker images
使用新镜像
接着上面的坑说,我又尝试在command
中启动,但还是有问题
version: "3"
services:
nginx_web:
image: deq/nginx:v1.0 # 这里用新制作的镜像
ports:
- "7922:22"
- 7900:80
volumes:
- /volume1/docker/nginx1/www:/www
- ./conf.d:/etc/nginx/conf.d/
- ./log:/var/log/nginx
environment:
TZ: 'Asia/Shanghai'
command: ["/usr/sbin/sshd", "-D"]
networks:
- "nginx_net"
networks:
nginx_net:
这样子启动的容器,ssh
正常使用,但是nginx的网站全部挂掉,使用curl
测试链接时,报错如下
$ curl http://127.0.0.1
curl: (7) Failed to connect to 127.0.0.1 port 80 after 0 ms: Couldn't connect to server
过了许久…,找不到原因,放弃…
既然直接用不行,那就不折腾了… 直接用此镜像开个容器当ssh服务吧。
附:
docker-compose.yml
version: "3"
services:
nginx_web:
image: deq/nginx:v1.4 # 这里其实已经没用了,可以用回nginx:laster
ports:
- 7900:80
- 7901:7901
volumes:
- /volume1/docker/nginx1/www:/www
- ./conf.d:/etc/nginx/conf.d/
- ./log:/var/log/nginx
environment:
TZ: 'Asia/Shanghai'
networks:
- "nginx_net"
ssh_server:
image: deq/nginx:v1.4 # 这里用新制作的镜像
container_name: ssh-nginx-server
ports:
- "7922:22"
volumes:
- /volume1/docker/nginx1/www:/www
command: ["/usr/sbin/sshd", "-D", "-p", "22"]
#command: ['/etc/init.d/ssh', 'start']
networks:
- "nginx_net"
networks:
nginx_net:
坑坑洼洼,其实本质就是随便拉个Linux容器就好,将要挂载的网站目录放入,再开启ssh就好了。
另外还有一种方法,可以尝试使用Dockerfile
文件,里面使用RUN
命令去执行ssh启动命令/etc/init.d/ssh start
, 这样也不用开多个容器。(未尝试,不清楚是否还有坑)