sshできるdockerコンテナをつくるために最低限必要なこと

3ヶ月ぶりにDockerを触ったのですが、全てを忘れていて愕然としたので最低限必要なことをメモしておきます。 ホストOSは Mac OS X です。

Getting Started

Get Started with Docker for Mac OS X に立ち戻るのが基本です。

以下、Docker Toolbox をインストール済で、OS X のコンソールから docker コマンドを実行できる前提で。

Docker image を build する

Dockerfile を用意します。

パッケージをインストールし、 /var/run/sshd を作成するという簡単なものです。 (きちんとやるなら MAINTAINER 等書く必要あると思いますが、ここでは省いてます)

ubuntu

FROM ubuntu:14.04

RUN apt-get update && apt-get -y upgrade && apt-get install -y build-essential libssl-dev libreadline-dev zlib1g-dev language-pack-ja
RUN apt-get -y install openssh-server ufw curl
RUN mkdir /var/run/sshd

debian

FROM debian:wheezy

RUN apt-get update && apt-get -y upgrade && apt-get install -y build-essential libssl-dev libreadline-dev zlib1g-dev task-japanese sudo
RUN apt-get -y install openssh-server ufw curl
RUN mkdir /var/run/sshd

イメージをビルドします。

$ docker build -t kotaroito/ubuntu .
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
kotaroito/ubuntu    latest              c6ec79983625        18 seconds ago      485.5 MB

作成したイメージからコンテナを起動するには run サブコマンドを使います。また、 ps サブコマンドでコンテナの状態を確認できます。

$ docker run kotaroito/ubuntu

$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                             NAMES
93e06154f722        kotaroito/ubuntu    "/bin/bash"              1 seconds ago       Exited (0) 2 seconds ago                                                        naughty_pare

不要になったイメージは rmi サブコマンドで削除できます。

$ docker rmi -f c6ec79983625

DockerHub

Dockerhub を利用すれば、イメージの共有・再利用がカンタンです。 アカウントを作成したら、ログインしてプッシュすればokです。

$ docker login --username=kotaroito --email=****@****
$ docker push kotaroito/ubuntu

ssh / sudo できるようにする

最初に作成したイメージではコンテナに ssh / sudo できないので、必要な設定をDockerfileに加えていきます。

FROM ubuntu:14.04

RUN apt-get update && apt-get -y upgrade && apt-get install -y build-essential libssl-dev libreadline-dev zlib1g-dev language-pack-ja
RUN apt-get -y install openssh-server ufw curl
RUN mkdir /var/run/sshd

RUN useradd -m kotaroito && echo "kotaroito:kotaroito" | chpasswd && gpasswd -a kotaroito sudo
RUN mkdir -p /home/kotaroito/.ssh; chown kotaroito /home/kotaroito/.ssh; chmod 700 /home/kotaroito/.ssh
 
ADD ./authorized_keys /home/kotaroito/.ssh/authorized_keys
RUN chown kotaroito /home/kotaroito/.ssh/authorized_keys; chmod 600 /home/kotaroito/.ssh/authorized_keys

CMD /usr/sbin/sshd -D && tail -f /dev/null

最後のCMDはコンテナがexitしない工夫です。 あとは、buildして run すれば ok ですが、sudo するために privileged オプションを付けておきます。

$ docker build -t kotaroito/ubuntu .
$ docker run --privileged -d -p 2222:22 kotaroito/ubuntu

コンテナは Mac OS X の上で直接稼働しているわけではなく、VMVirtualBox 等)上で動いてるので、ssh するためには VMIPアドレスを調べる必要があります。

$ docker-machine ip default
192.168.99.100

これで ssh することができます。

$ ssh -v kotaroito@192.168.99.100 -p2222

なお、sshd を docker コンテナで走らせる必要はない、という議論もあります。 production で使うならこれはその通りだと思います。

blog.docker.com

以上。

追記(2017年10月)

Docker Toolbox on Mac OS"Legacy desktop solution." です。 アンインストールするには、公式に提供されているスクリプト toolbox/uninstall.sh at master · docker/toolbox · GitHub を使えばよいです。