構図

Capistrano Server[Docker] <=> Local[Mac] <=> SSHD Server[Docker]

接続先(ファイル設置先) サーバ

設定ファイル

version: "3"
services:
  ssh:
    build:
      dockerfile: Dockerfile
    command: ["/usr/sbin/sshd", "-D"]
    tty: true
    ports:
      - "10022:22"

Docker 初心者 — ssh で接続できるサーバーを立てる - Qiita

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y \
    openssh-server \
    sudo
RUN mkdir /var/run/sshd
RUN echo 'root:admin' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

# add user
RUN groupadd -g 1000 app && \
    useradd  -g      app -G sudo -m -s /bin/bash app && \
    echo 'app:pass' | chpasswd

RUN echo 'Defaults visiblepw'             >> /etc/sudoers
RUN echo 'app ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
パスワードは、rootは `admin` 、appは `pass` です。

起動

$ docker-compose up

確認

$ ssh app@localhost -p 10022
app@localhost's password: $<= input password

capistrano(in Docker)

ゲートウェイの確認

コンテナIDを確認

$ docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                            NAMES
21efaa7faf20        hoge     "/usr/sbin/sshd -D"      33 minutes ago      Up 33 minutes       0.0.0.0:10022->22/tcp                            hoge_1

コンテナIDよりGatewayを確認

$ docker inspect 21efaa7faf20
[
    {
        "Id": "b28f7fa806b13afb411f1a69baf76d6d122184f1542c79074d3320414ad36596",
        ...
        "NetworkSettings": {
            ...
            "Networks": {
                "hoge-service": {
                    ...
                    "NetworkID": "0cd7d56e94c9134807488f8e0ba82d22eaa49e110b14eb695ed326c02aa7e1b9",
                    "EndpointID": "c46ea719d379e278dadf3a5210ec4239a12aca0ef4aff1cefd3c8478336178d5",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.4",
                    ...
                }
            }
        }
    }
]

capistranoの設定

# -------------------
# Server
# -------------------
set :user, 'app'
server "172.18.0.1",
  port: 10022,
  roles: %w[hoge],
  primary: true
set :ssh_options, {
  auth_methods: %w(password),
  password: 'pass',
  forward_agent: false,
}

実行

$ bundle exec cap development --trace

tips

  • capistranoからの接続ができないと思っていたら、capistranoの接続先をlocalhostにしていた。
  • key認証の Dockerfile も見つけたが、上手く接続できない。