docker - 使用 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 文件将公钥复制到容器中,然后将公钥复制到文件中并分配适当的文件权限。但这也是没有用,给了我和上面一样的错误。你能帮我理解我哪里出错了吗?
解决方案
推荐阅读
- python - Paramiko/pysftp 连接因“协商失败/DH 值无效”而失败,但是 GUI 和 sftp 连接
- websocket - Websockets 请求在我的网站上获得 404 - 在 mediawiki 页面上重复尝试
- django - ModuleNotFoundError:没有名为“django”的模块,当我运行测试时
- java - 如何在 vert.x 中执行断开连接的阻塞任务?
- sql - 如何将两条记录与附加列合并为一条
- google-chrome - Browsers showing up cached joomla website despite clearing
- google-bigquery - 使用配置文件为气流创建 bigquery 连接
- c# - Windows Server 2003 R2 目录连接问题
- javascript - 如何使用函数在 JS 中构建 Typescript 代码?
- ios - swift Codable 中的 GMSPath 不符合 swift 协议