docker:如何在容器之间共享 ssh 密钥?

fly*_*ell 5 ssh openssh docker dockerfile docker-compose

我有 4 个容器,配置如下 ( docker-compose.yml):

version: '3'
networks:
  my-ntwk:
    ipam:
      config:
        - subnet: 172.20.0.0/24
services:
  f-app:
    image: f-app
    tty: true
    container_name: f-app
    hostname: f-app.info.my
    ports:
      - "22:22"
    networks:
      my-ntwk:
        ipv4_address: 172.20.0.5
    extra_hosts:
      - "f-db.info.my:172.20.0.6"
      - "p-app.info.my:172.20.0.7"
      - "p-db.info.my:172.20.0.8"
    depends_on:
      - f-db
      - p-app
      - p-db
  f-db:
    image: f-db
    tty: true
    container_name: f-db
    hostname: f-db.info.my
    networks:
      my-ntwk:
        ipv4_address: 172.20.0.6
  p-app:
    image: p-app
    tty: true
    container_name: p-app
    hostname: p-app.info.my
    networks:
      my-ntwk:
        ipv4_address: 172.20.0.7
  p-db:
    image: p-db
    tty: true
    container_name: prod-db
    hostname: p-db.info.my
    networks:
      my-ntwk:
        ipv4_address: 172.20.0.8
Run Code Online (Sandbox Code Playgroud)

每个图像都是由相同的构建的Dockerfile

FROM openjdk:8

RUN apt-get update && \
    apt-get install -y openssh-server

EXPOSE 22

RUN useradd -s /bin/bash -p $(openssl passwd -1 myuser) -d /home/nf2/ -m myuser

ENTRYPOINT service ssh start && bash
Run Code Online (Sandbox Code Playgroud)

现在我希望能够f-app在运行此行时连接到任何其他计算机而无需输入密码:ssh myuser@f-db.info.my

我知道我需要在服务器之间交换 ssh 密钥(这不是问题)。我的问题是如何使用 docker 容器以及何时(构建或运行时)执行此操作!

Adi*_*iii 1

对于ssh没有密码的情况,您需要创建无密码用户并SSH keys在容器中进行配置,此外您还需要ssh keys在源容器中添加公钥,并且应在目标容器的授权中添加公钥。

这是正在运行的 Dockerfile

FROM openjdk:7

RUN apt-get update && \
    apt-get install -y openssh-server vim 

EXPOSE 22


RUN useradd -rm -d /home/nf2/ -s /bin/bash -g root -G sudo -u 1001 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

RUN mkdir -p /home/nf2/.ssh/ && \
    chmod 0700 /home/nf2/.ssh  && \
    touch /home/nf2/.ssh/authorized_keys && \
    chmod 600 /home/nf2/.ssh/authorized_keys

COPY ssh-keys/ /keys/
RUN cat /keys/ssh_test.pub >> /home/nf2/.ssh/authorized_keys

USER root
ENTRYPOINT service ssh start && bash
Run Code Online (Sandbox Code Playgroud)

docker-compose 将保持不变,这是您可以尝试的测试脚本。

#!/bin/bash
set -e
echo "start docker-compose"
docker-compose up -d
echo "list of containers"
docker-compose ps
echo "starting ssh test from f-db to f-app"
docker exec -it f-db sh -c "ssh -i /keys/ssh_test ubuntu@f-app"
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,您可以尝试上面的工作示例docker-container-ssh

git clone git@github.com:Adiii717/docker-container-ssh.git
cd docker-container-ssh; 
./test.sh
Run Code Online (Sandbox Code Playgroud)

您可以更换密钥,因为这些密钥仅用于测试目的。