首页 > 解决方案 > 使用 SSH 登录到基于 alpine 的缓存容器

问题描述

我正在实现缓存状态页面服务,并且需要使用 SSH 登录到缓存容器。

Cachet 使用 nginx:1.17.8-alpine 作为基础镜像,我将以下部分添加到现有的Dockerfile以安装和设置 SSH。我替换CMD ["/sbin/entrypoint.sh"]ENTRYPOINT ["/sbin/entrypoint.sh"]适应用于启动 sshd 的 CMD 命令。

RUN apk --update add --no-cache openrc openssh \
  && sed -i s/#PermitRootLogin.*/PermitRootLogin\ yes/ /etc/ssh/sshd_config \
  && echo "root:root" | chpasswd \
  && rm -rf /var/cache/apk/* \
  && sed -ie 's/#Port 22/Port 22/g' /etc/ssh/sshd_config \
  && sed -ri 's/#HostKey \/etc\/ssh\/ssh_host_key/HostKey \/etc\/ssh\/ssh_host_key/g' /etc/ssh/sshd_config \
  && sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_rsa_key/HostKey \/etc\/ssh\/ssh_host_rsa_key/g' /etc/ssh/sshd_config \
  && sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_dsa_key/HostKey \/etc\/ssh\/ssh_host_dsa_key/g' /etc/ssh/sshd_config \
  && sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_ecdsa_key/HostKey \/etc\/ssh\/ssh_host_ecdsa_key/g' /etc/ssh/sshd_config \
  && sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_ed25519_key/HostKey \/etc\/ssh\/ssh_host_ed25519_key/g' /etc/ssh/sshd_config \
  && /usr/bin/ssh-keygen -A \
  && ssh-keygen -t rsa -b 4096 -f  /etc/ssh/ssh_host_key
RUN rc-update add sshd
CMD ["/usr/sbin/sshd","-D"]
EXPOSE 22

还在docker compose 文件的 ports 部分添加了 22,如下所示:

  cachet:
    build:
      context: .
      args:
        - cachet_ver=2.4
    ports:
      - 80:8000
      - 22

在 docker-compose build 和 up 之后,我检查了 docker 信息并且能够看到分配给 22 的端口,如下所示

  "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "e17c53db8acf117d93dcc36d9e35f317433e877ea3ac3962f0d28c3403a9cdb0",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "22/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "32955"
                    }
                ],
                "80/tcp": null,
                "8000/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }

docker inspect 容器的 IP 地址如下:

    "Networks": {
        "cachet-docker_default": {
            "IPAMConfig": null,
            "Links": [
                "cachet-docker_postgres_1:cachet-docker_postgres_1",
                "cachet-docker_postgres_1:postgres",
                "cachet-docker_postgres_1:postgres_1"
            ],
            "Aliases": [
                "e8be9717eb77",
                "cachet"
            ],
            "NetworkID": "44521f9cd8b2d17c46a80487ad20e8b27e377c99193ef21d24c0d1c2f70ff451",
            "EndpointID": "e735db62d60647687f066bb973243d9ddb4ba20dfd097344f8a487ece37256b5",
            "Gateway": "172.18.0.1",
            "IPAddress": "172.18.0.3",

但是当我尝试 SSH 进入容器时,我收到以下错误

cachet-docker$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                                 NAMES
e8be9717eb77        cachet-docker_cachet   "/sbin/entrypoint.sh…"   21 hours ago        Up 21 hours         80/tcp, 0.0.0.0:32955->22/tcp, 0.0.0.0:80->8000/tcp   cachet-docker_cachet_1
c8000b2b64ec        postgres:12-alpine     "docker-entrypoint.s…"   21 hours ago        Up 21 hours         5432/tcp                                              cachet-docker_postgres_1
cachet-docker$ ssh root@172.18.0.3 -p 32955
ssh: connect to host 172.18.0.3 port 32955: Operation timed out
cachet-docker$ ssh root@localhost -p 32955
ssh_exchange_identification: Connection closed by remote host
cachet-docker$ ssh root@localhost 
ssh: connect to host localhost port 22: Connection refused
cachet-docker$ ssh root@172.18.0.3
ssh: connect to host 172.18.0.3 port 22: Operation timed out

在此之前,我尝试生成 ssh 密钥,然后将配置添加到 Dockerfile,以便通过创建 ~/.ssh 文件夹和 authorized_key 文件将公钥复制到容器中,然后将公钥复制到文件中并分配适当的文件权限。但这也是没有用,给了我和上面一样的错误。你能帮我理解我哪里出错了吗?

标签: dockersshcontainersalpinesshd

解决方案


推荐阅读