容器概况

+----------------------------------------+
| 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

nvm github

# 保持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即可。

发布配置

6550e5aec63cd.jpg
6550e5b0c15ee.jpg
6550e5b1bd87e.jpg

踩坑 - 群晖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, 这样也不用开多个容器。(未尝试,不清楚是否还有坑)