Edited at

Dockerのコンテナ間でssh接続させる


開発環境

macOS Sierra

docker for mac Version 17.06.1-ce-mac24 (18950)


完成目標

slaveコンテナからmasterコンテナにssh接続でログインする


Dockerfileの準備

FROM centos:7

# yum update
RUN yum -y update && yum clean all

# ssh install
RUN yum -y install openssh-server openssh-client && \
mkdir ~/.ssh && \
touch ~/.ssh/authorized_keys && \
chmod 600 ~/.ssh/authorized_keys


イメージの作成

Dockerfileを置いてあるところでビルドを実行

$ docker build -t hello_centos:latest .


コンテナの作成(master)

$ docker run --privileged -d -it --name master -p 8080:80 -p 2222:22 hello_centos /sbin/init


コンテナの作成(slave)

$ docker run --privileged -d -it --name slave -p 8090:80 -p 2223:22 --link master:mas hello_centos /sbin/init

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94f5c8b21eb0 hello_centos "/sbin/init" 7 seconds ago Up 6 seconds 0.0.0.0:2223->22/tcp, 0.0.0.0:8090->80/tcp slave
8d23ba5bd5d1 hello_centos "/sbin/init" 23 seconds ago Up 21 seconds 0.0.0.0:2222->22/tcp, 0.0.0.0:8080->80/tcp master

$ docker inspect [コンテナ名] でコンテナの情報を取得できる

$ docker inspect slave

$ docker exec -it slave bash

[root@94f5c8b21eb0 /]# set | grep MAS
MAS_ENV_no_proxy='*.local, 169.254/16'
MAS_NAME=/slave/mas
MAS_PORT=tcp://172.17.0.2:22
MAS_PORT_22_TCP=tcp://172.17.0.2:22
MAS_PORT_22_TCP_ADDR=172.17.0.2
MAS_PORT_22_TCP_PORT=22
MAS_PORT_22_TCP_PROTO=tcp
MAS_PORT_80_TCP=tcp://172.17.0.2:80
MAS_PORT_80_TCP_ADDR=172.17.0.2
MAS_PORT_80_TCP_PORT=80
MAS_PORT_80_TCP_PROTO=tcp

$ ping mas

PING mas (172.17.0.2) 56(84) bytes of data.
64 bytes from mas (172.17.0.2): icmp_seq=1 ttl=64 time=0.205 ms
64 bytes from mas (172.17.0.2): icmp_seq=2 ttl=64 time=0.154 ms

ssh-keygenで鍵作成を作成する

[root@94f5c8b21eb0 ~]# cd ~/.ssh

[root@94f5c8b21eb0 .ssh]# ssh-keygen -t rsa

configの設定

[root@94f5c8b21eb0 .ssh]# vi ~/.ssh/config

Host master
HostName 172.17.0.2
User root
Port 2222
IdentityFile ~/.ssh/id_rsa

slaveコンテナの準備完了

masterコンテナに公開鍵を設定

slaveコンテナで作成した公開鍵(id_rsa.pubの中をコピーしておく)をmasterコンテナのauthorized_keysファイルに貼り付ける

$ docker exec -it master bash

[root@8d23ba5bd5d1]# vi ~/.ssh/authorized_keys

slaveコンテナで作成した公開鍵(id_rsa.pub)の中をコピーして貼り付ける

slaveコンテナからsshログインしてみる

[root@94f5c8b21eb0]# ssh master

ssh: connect to host 172.17.0.2 port 2222: Connection refused

ログインできない

masterコンテナのssh専用のportが22(デフォルト)になっているので2222に変更してあげる

masterコンテナのsshd_configのport番号を指定

[root@8d23ba5bd5d1]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org

[root@8d23ba5bd5d1]# vi /etc/ssh/sshd_config
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 2222 ← ここ

sshd -t

エラーが出なければOK

sshdの再起動

systemctl restart sshd.service

これでsshの設定が終わりです。再度、slaveコンテナからmasterコンテナにsshログインできるか試してみましょう

[root@94f5c8b21eb0]# ssh master

The authenticity of host '[172.17.0.2]:2222 ([172.17.0.2]:2222)' can't be established.
ECDSA key fingerprint is 5c:8c:f9:29:cd:5f:0a:1f:08:ab:c6:db:b1:c0:47:0e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[172.17.0.2]:2222' (ECDSA) to the list of known hosts.
[root@8d23ba5bd5d1 ~]#

できました。


参考

DockerをMacにインストールする (更新:2017/5/26)

CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する

MacにDocker - Docker Compose

SSHのポート番号を変更 - SSHサーバーの設定