おふくろさまより愛をこめて

mmmpa ふとしです。誠実なプログラミングを心がけたい。

Amazon linux 2 docker image を ec2 で使われているものと似た感じにする

Amazon linux は AWS で使われている Cent OS をベースとした Amazon 謹製の linux ディストリビューションです。おおむね Cent OS と同じですが、Amazon 専用パッケージがインストールされていたり、Amazon linux 特有のコマンドでしかインストールできないパッケージなどがあり、微妙な差異があります。Ansible や Capistrano などの構成ツールの設定をする際には、その差異が問題になります。

とはいえ、構成ツールの初期調整の段階で EC2 インスタンスを立ち上げるのもおおげさです。そこで Docker の出番となるわけですが、配給されている Amazon linux イメージ amazonlinux:2 は EC2 では使用できる基本的なパッケージも含まれておらず、ものすごくミニマルな構成になっています。(これはおそらく ECS での使用を想定されているせいです)

そこで、EC2 のイメージには入っていると思われるパッケージをインストールし、Ansible でのインフラ構成のテスト環境とします。と言っても、Dockerfile で必要なパッケージをインストールし、普通の SSH でアクセスできるようにするだけなのでむずかしいことはありません。

公開鍵と秘密鍵

公開鍵と秘密鍵は前もって準備しておきます。ローカルでしか使わないので雑でかまわないでしょう。

ssh-keygen -t rsa

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

足りないパッケージがある場合は一つ一つ調べるのではなく、EC2 で立ちあげたインスタンスで yum list installed を行い、出たパッケージをすべてインストールしてしまうという手もあります。

docker-compose.yml

version: '3'
services:
  web:
    build: .
    tty: true
    privileged: true
    ports:
      - "2222:22"

起動と接続

docker-compose up --build -d
ssh ec2-user@localhost -p 2222 -i id_rsa_for_docker