macでdockerオリジナルイメージを作ってSSHログインするまで
dockerのコンテナにSSHログインするのは違うやろって話も言われそうですが
手元の開発環境のイメージで、dockerコンテナにSSHで鍵認証ログインするところまでを
つらつらと書きます。
せっかくなので、dockerのオリジナルのイメージを作ってそれを利用するみたいな
イメージで投稿しようと思います。
centos6をベースにsshログイン出来るイメージを作る場合
dockerのようなLXCコンテナは慣れるまで少し癖があるので
ちょっとずつ理解していけばいいと思います。
前提
以下が実現されているコンテナを作ります。
- yum最新化
- 鍵認証でSSHログイン出来る
dockerオリジナルイメージを作る
今回はcentos6をベースに使います。
dockerのベースとなるイメージの取得(5分)
$ docker pull centos:centos6
dockerイメージの確認(1分)
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos 6 1a895dd3954a 9 weeks ago 190.6 MB
dockerイメージの作成(15分)
手元のmacで秘密鍵を作成して、鍵を使ってdeployユーザーにログインする事を想定。
dockerイメージ作るためのフォルダを作成
$ mkdir docker-images/centos6_ssh_enabled
Dockerfile作成
$ cd docker-images/centos6_ssh_enabled
$ vi Dockerfile
FROM centos:centos6
MAINTAINER YOUR_NAME
RUN yum -y update
# Dev tools for all
RUN yum -y install git vim && \
yum clean all
RUN yum -y install automake bison bzip2 gcc gcc-c++ gdbm-devel git libffi-devel libtool libxml2-devel libxslt-devel make openssh openssh-clients openssh-server openssl openssl-devel passwd patch readline readline-devel rsync sqlite-devel sudo tar tcl tcl-devel tk tk-devel vim wget which zlib zlib-devel && \
yum clean all
########################################## sshd ##############################################
# Create user
RUN useradd deploy
RUN passwd -f -u deploy
# Set up SSH
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -C '' -N ''
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -C '' -N ''
RUN mkdir -p /home/deploy/.ssh; chown deploy /home/deploy/.ssh; chmod 700 /home/deploy/.ssh
ADD authorized_keys /home/deploy/.ssh/authorized_keys
RUN chown deploy /home/deploy/.ssh/authorized_keys
RUN chmod 600 /home/deploy/.ssh/authorized_keys
# setup sudoers
RUN echo "deploy ALL=(ALL) ALL" >> /etc/sudoers.d/deploy
# Set up SSHD config
#RUN sed -ri 's/#Port 22/Port 2222/g' /etc/ssh/sshd_config
RUN sed -ri 's/#PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
# Init SSHD
RUN /etc/init.d/sshd start
RUN /etc/init.d/sshd stop
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
########################################## timezone ##############################################
# timezone
RUN cp -p /usr/share/zoneinfo/Japan /etc/localtime
sshの秘密鍵と公開鍵の作成
$ ssh-keygen -t rsa -f develop
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in develop.
Your public key has been saved in develop.pub.
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXX
The key's randomart image is:
+---[RSA 2048]----+
| oo. |
|. |
|*oo.* o o |
|**++.Oo+ |
|+==E* .S |
| +.+++.o |
|. oo+ + |
| =o . |
| .. |
+----[SHA256]-----+
dockerコンテナに追加する公開鍵設置
$ mv develop.pub authorized_keys
最終的なフォルダ構成は
└── centos6_ssh_enabled
├── Dockerfile
├── authorized_keys
└── develop
dockerイメージのビルド
dockerのオリジナルイメージをビルドします。
$ docker build -t centos6_ssh_enabled/20151224 .
dockerイメージの確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos6_ssh_enabled/20151224_v1 latest db43ea1c4db7 58 seconds ago 640.7 MB
centos 6 1a895dd3954a 10 weeks ago 190.6 MB
dockerコンテナの確認(5分)
まずは作成したコンテナを起動してみましょう。
hostnameをssh_enabledに指定して、docker-host1のポート番号2222をコンテナの22にポートマッピングして起動
$ docker run -h ssh_enabled -d -p 2222:22 centos6_ssh_enabled/20151224_v1
dockerコンテナの起動確認
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
414bd82f54f0 centos6_ssh_enabled/20151224_v1 "/usr/sbin/sshd -D" 3 minutes ago Up 3 minutes 0.0.0.0:2222->22/tcp dreamy_swirles
docker hostのIP確認
$ docker-machine ip docker-host1
192.168.99.101
dockerコンテナへのSSH接続確認
$ ssh -p 2222 -i ./develop deploy@192.168.99.101
[deploy@c69d635f18e5 ~]$ ls
[deploy@c69d635f18e5 ~]$ sudo su -
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[root@c69d635f18e5 ~]# exit
logout
[deploy@c69d635f18e5 ~]$ exit
logout
Connection to 192.168.99.101 closed.
まとめ
dockerのコンテナにSSHログインなんてけしからんというような人も多いですが、手元の開発環境向けにvagrant使っていた人がdockerに移行するイメージで投稿してみました。サーバーを複数台使ったインフラのテストなんかはvagrantよりも遥かに軽快に動作するので、dockerおすすめです。本番利用についても、徐々に実績出てきているので検討フェーズになっているかと感じます。