macでdockerオリジナルイメージを作ってSSHログインするまで

# macでdockerオリジナルイメージを作ってSSHログインするまで
dockerのコンテナにSSHログインするのは違うやろって話も言われそうですが
手元の開発環境のイメージで、dockerコンテナにSSHで鍵認証ログインするところまでを
つらつらと書きます。

せっかくなので、dockerのオリジナルのイメージを作ってそれを利用するみたいな
イメージで投稿しようと思います。

centos6をベースにsshログイン出来るイメージを作る場合
dockerのようなLXCコンテナは慣れるまで少し癖があるので
ちょっとずつ理解していけばいいと思います。

#### 前提
以下が実現されているコンテナを作ります。

1. yum最新化
2. 鍵認証で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
```

```lang: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おすすめです。本番利用についても、徐々に実績出てきているので検討フェーズになっているかと感じます。