[NOT SOLVED]M1 Mac で Docker の Amazon Linux 2 Image に vagrant ssh できる環境を作りたい
Vagrant は既定の仮想マシンが VirtualBox になっているが、VirtualBox は M1 Mac に対応していない。
そのため仮想マシン(Providerという)に Docker を使用する。
その上で、EC2 を模した環境をローカルに作りたい。
具体的には Amazon Linux 2 の Docker Image から作ったコンテナを Vagrant から起動して、vagrant ssh
でログインできるようにした。
まずは vagrant 関係なしに、Amazon Linux 2 の Docker Image をビルド&起動して、ssh で入れることを確認したいが、いきなりつまづいた。
先人たちの知恵↓
- SSH 接続できる Amazon Linux 2 の Docker イメージを作成してシステム構築してみる - Qiita
- amazon linuxのイメージを使用してsshできるコンテナを作る - Qiita
- Amazon linux 2 docker image を ec2 で使われているものと似た感じにする - o296.com
をトレースしてみたが、私の M1 Mac では、ssh ec2-user@localhost -p 2222 -i id_rsa_for_docker
を実行すると、
sshamazonlinux2 % ssh ec2-user@localhost -p 2222 -i id_rsa
kex_exchange_identification: Connection closed by remote host
というエラーが出てログインできない。
同じ構成で Windows 10 で実行するとログインできる(鍵ファイルもコピーしてきたので権限の過不足があり、 【Windows】SSHの鍵認証で「UNPROTECTED PRIVATE KEY FILE」が発生した場合の解決方法の紹介 – fumidzuki に従って解決した)。
PS C:\dev\sshamazonlinux2> ssh ec2-user@localhost -p 2222 -i .\id_rsa
Last failed login: Sun Dec 26 08:06:09 UTC 2021 from gateway on ssh:notty
There were 3 failed login attempts since the last successful login.
-bash-4.2$ whoami
ec2-user
あ、Win では鍵認証より先に「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」というエラーも出たので
に従い解決した。
Intel Core i7 な MacBook Pro(2016 late) で試してみたら M1 Mac と同じエラーになった。
sshamazonlinux2 % ssh ec2-user@localhost -p 2222 -i id_rsa
kex_exchange_identification: Connection closed by remote host
ここまでのおさらい
手順
Amazon linux 2 docker image を ec2 で使われているものと似た感じにする - o296.com をトレース。
Dockerfile
FROM amazonlinux:2
# `shadow-utils` `procps` には基本的なコマンドが多く含まれています
RUN yum install -y sudo shadow-utils procps wget
RUN yum install -y openssh-server openssh-clients
# easy_install を使うためです
RUN wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
# SSH の設定
RUN systemctl enable sshd.service
RUN echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
COPY ./id_rsa.pub /home/ec2-user/.ssh/id_rsa.pub
RUN cat /home/ec2-user/.ssh/id_rsa.pub >> /home/ec2-user/.ssh/authorized_keys
# no password で sudo を可能にします
RUN useradd ec2-user
RUN echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers
CMD /sbin/init
docker-compose.yml
version: '3'
services:
web:
build: .
tty: true
privileged: true
ports:
- "2222:22"
-
ssh-gen -t rsa -f id_rsa
でid_rsa
とid_rsa.pub
を生成 docker-compose up --build -d
ssh ec2-usert@localhost -p 2222 -i id_rsa
結果
- M1 Mac - kex_exchange_identification: Connection closed by remote host
- Intel Mac - kex_exchange_identification: Connection closed by remote host
- Windows10 - 成功
なんなん?
Dockerfile
の FROM amazonlinux:2
を FROM centos:8
に変えると成功するんだよなァ
※ easy_install の wget の行はコメントアウト(ただしここをコメントアウトしても amazonlinux:2 は動かない)
昔の Image なら動くかも、と思って、
で試したけど変わらずエラーだった。
- amazonlinux:2017.03.0.20170812 は docker build で失敗した
vagrant-virtualbox が M1 Mac で使えない(Windows なら動く)から docker にしようとしているのに、そっちも windows でしか動かないんじゃ意味がないんよ。
なぜ Amazon Linux 2 の Docker Image にこだわるのかと言うと、既存 proj の環境構築スクリプトが Amazon Linux 2 に依存しているから。
具体的に判っていることの一つは amazon-linux-extras を使っているということ。
centos イメージで amazon-linux-extras を使う方法があればそれでも良さそうだけど見つからない。
「じゃあスクリプト直せば」と言われたら、それだったら vagrant 使わなくても良いじゃんまである。
環境構築スクリプトでは postgres とか諸々をインストールしているので、だったらそれぞれの docker イメージを pull して・・・という docker-compose.yml を作ってスクリプトをそれに合わせればよいので。
今は 「Host が Mac の時に Amazon Linux 2 に ssh できないのはなぜ?」への興味が大きい。
とはいえ、そこまで vagrant にも EC2 にも関心はないので、いったん諦めよう。