[Dockerfile] Ubuntuのコンテナでユーザー作成とSSHサーバ、nvmもインストールする、あと内容も簡単に解説する

はじめに

本記事ではDockerfileを利用してLinux(Ubuntu)のユーザー作成、そのユーザーへのSSHアクセス、nvmをインストールする方法を説明します。別のことをやりたい場合でもこちらのサンプルをご利用頂くことが可能だと思います。

Dockerファイルでユーザーの切り替えってどうやるの?ディレクトリの移動ってどうするの?作成したユーザーにnvmをインストールしたけど正常に動作しない、というアナタと私向けの記事となります。

Dockerfileを初めて使います、という方もこちらも記事をご参考にして頂けるのではないかと思います。

記事の一部は Docker Desktop for Windowsを前提としている箇所もありますので、気になる方はこちらの記事をご参照下さい。

実施内容

作成したDockerfile

作成したコードはこのような形になりました。作成しているユーザーとそのパスワードは以下としています。

  • ユーザー名:pi
  • パスワード:raspberry

ファイル名:Dockerfile

FROM ubuntu:latest

RUN apt-get update && apt-get install -y ssh
RUN apt-get install -y\
    curl \
    ssh \
    make \
    sudo \
    yarn \
    git \
    vim

RUN useradd -m -s /bin/bash pi && \
echo "pi:raspberry" | chpasswd
RUN gpasswd -a pi sudo

USER pi
WORKDIR /home/pi

RUN mkdir /home/pi/.nvm
ENV NVM_DIR /home/pi/.nvm

RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash && \
. $NVM_DIR/nvm.sh && \
nvm install 12 && \
nvm use 12

USER root
WORKDIR /

RUN sudo apt-get clean

COPY start.sh .
RUN chmod +x /start.sh
CMD  ["/start.sh"]

EXPOSE 22

ファイル名:start.sh

#!/bin/bash
/etc/init.d/ssh start

tail -f /dev/null

Dockerコンテナのビルド方法

基礎から、という意味では上記で記述した2つのコードを適当なフォルダに保存をして下さい。それぞれの名前は”Dockerfile”と”init.sh"である必要があり、同じフォルダに入れてないとビルドの際にエラーとなります。

該当のフォルダを開き、そこでSHIFTキーを押しながら右クリックすることでPowerShellをこのフォルダで開くことが可能です。

PowerShell上で以下のコマンドを実行して下さい。赤字の箇所はDokcerコンテナのイメージ名とタグになりますので、任意の名前で問題ありません。

コマンド

docker build -t myubuntu:1.0 .

このdocker buildというコマンドを実行することで、Dockerfileに記述された通りにDocker Imageを作成してくれるのです。正常にDocker Imageの作成が完了すれば、Power Shell上でdocker image lsのコマンドで確認することが可能です。

docker desktopで確認することも可能です。

これで目的のDocker Imageを作成することが出来ました。もし作成したいものが異なる場合でもこちらのコードをベースとして作成することが可能かと思います。

少しだけ解説

FROMコマンド

DockerfileによるDocker Imageを作成するためのひな型をこちらで選択します。今回は純粋なUbuntuの最新版を利用するため、以下のようにしています。

FROM ubuntu:latest

RUNコマンド

Imageのひな型を作成した後に、実行するコマンドをRUNコマンドによって記述しています。特にコマンドのインストール等はこちらで実施していくのが良いでしょう。

まずはupdateして、その後に必要なコマンドをインストールしていく手順はご経験があるのでは?と思います。

sshのみインストールのコマンドを分離しているのは…私のおまじないで、正しい手順を踏めば不要なはずです。本来であれば対話型のコマンドでインストールする必要のあるsshがこの方法であれば対話無しにインストールが完了するのでこのやり方としています。すみません。。

RUN apt-get update && apt-get install -y ssh
RUN apt-get install -y\
    curl \
    ssh \
    make \
    sudo \
    yarn \
    git \
    vim

USERコマンド

こちらのコマンドではRUNのコマンドを実行するユーザーの切り替えを行うことが可能です。今回はrootユーザーからpiユーザーを作成し、nvmのコマンドをpiユーザー向けにインストールするため、こちらのコマンドでユーザーの切り替えを行っています。

USER pi

WORKDIRコマンド

こちらのコマンドではRUNコマンドやその他のコマンドを行うディレクトリ(フォルダ)を変更するために使用します。特にファイル操作のコマンド等はどのディレクトリを起点として実行されているかを意識する必要があります。指定がなければ全てのコマンドが/のディレクトリで実行されます。

WORKDIR /home/pi

COPYコマンド

こちらのコマンドではそのまんま、ホスト(今回はWindows)のフォルダにあるファイルをDockerコンテナ内にコピーするために使用します。類似のコマンドでADDがありますが、単純にファイルをコピーすることを目的とする場合はCOPYコマンドを利用することが推奨されているようです。

COPY start.sh .

ENVコマンド

環境変数を設定するのに使用することが出来ます。設定した環境変数は$を付けることでその後、利用することが可能です。

ENV NVM_DIR /home/pi/.nvm
. $NVM_DIR/nvm.sh && \

CMDコマンド

コンテナの起動時に実行するコマンドを指定することが可能です。コンテナ起動時のコマンドとして指定することも可能ですが、こちらに指定しておけばコンテナ起動の際にオプションとしての指定が不要となります。

こちらではstart.shのスクリプトを実行するようにしていますが、こちらはコンテナの起動時にsshのサービスを有効にするためのスクリプトとなっています。通常のUbuntuではsystemctlのコマンド等を利用して、起動時のサービスの指定を行うことが出来るのですが、残念ながらコンテナではできません。(出来るやり方もあるようなのですが、ちょっと難しい…)

CMD  ["/start.sh"]

EXPOSEコマンド

こちらのコマンドではこのDocker Imageで利用可能なポート番号を指定します。今回はこのコンテナにSSHでアクセスを行いますので、SSHポート番号である22のみを指定しています。

EXPOSE 22

動作確認

Docker Desktopのイメージ一覧から起動していきます。RUNをクリックします。

Optionの設定としはPortsの項目だけ設定します。こちらの例ではポート番号49555でコンテナのSSH用ポート22にアクセスできる設定となります。これでRUN。

コンテナが無事に起動すると以下のような緑色のアイコンで確認が出来るかと思います。

Teratermでアクセスします。ホストはDocker Desktop for Windowsを使っているならlocalhost、TCPポートは先ほど設定した49555とします。

正常にアクセスが可能であればユーザ名とパスワードの確認が入りますので、Dockerfileで指定したpi/rapsberryを入力し、OKとして下さい。

このような形でアクセスが出来ました。nvmのコマンドも利用が可能なようです。

これで環境構築が完了しました。

さいごに

本記事ではDockerfileによるUbuntuの環境構築を行い、Dockerfileによるコンテナ作成の基礎を説明しました。Dockerコンテナは基本的に最小のサービスを動かすために動作させるものなので、本来はこのようなUbuntu環境を構築するためのものではないのですが、Windows上で簡単にLinuxを動かしたいという方にはピッタリなのではないでしょうか?

ではまた。