Dockerでubuntu18.04を動かす

今回は、Dockerubuntu18.04の環境を作るためにDockerイメージを取得します。
Dockerイメージdocker hubにいろいろあるので必要なイメージを探します。
現在、Official Imagesとして150以上のDockerイメージがあります。

イメージを取得する

Docker Hubレジストリからイメージをpull(取得)します。

使い方は

$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]

です。

今回はubuntu 18.04を下記のコマンドで取得します。
NAMEubuntuTAG18.04を指定しています。TAGは未指定時:latestの扱いで最新版を取得します。

$ sudo docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
08a6abff8943: Pull complete
Digest: sha256:982d72c16416b09ffd2f71aa381f761422085eda1379dc66b668653607969e38
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

取得したイメージの確認

取得したイメージを確認します。
イメージを一覧表示するには、imagesコマンドを使用します。

使い方は

$ docker images [OPTIONS] [REPOSITORY[:TAG]]

です。

REPOSITORYは未指定の場合、ローカルとなります。
また、[REPOSITORY[:TAG]]は完全一致の必要があります。

$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        18.04     f5cbed4244ba   2 weeks ago    63.2MB
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

前回取得した、hello-worldの他に、ubuntuがあることが確認できます。

イメージを実行する

取得したイメージを実行してみたいと思います。
実行はrunコマンドを使用します。

使い方は

$ docker run [オプション] イメージ[:タグ|@ダイジェスト値] [コマンド] [引数...]

です。

さまざまなオプションがありますが、今回使用したオプションのみ説明します。

オプション 機能
-d バックグランドで動作するようにします
-it (シェルのように)インタラクティブなプロセスでは、コンテナのプロセスに対して tty を割り当てるために、 -i -t を一緒に使う必要があります
–name コンテナの名前を割り当てます。未指定時はランダムな文字列から名前を生成します

それでは起動します。

$ sudo docker run -d -it --name ubuntu-18.04 ubuntu:18.04
6fe33f37b7cde67a503d8ccd89fcbfcfb98aa7118c68d20d08562019f4f846d7

無事に起動できたのか、コンテナを一覧表示してみます。
コンテナを一覧表示するには、psコマンドを使用します。

使い方は

$ docker ps [OPTIONS]

です。

さまざまなオプションがありますが、今回使用するオプションのみ説明します。

オプション 機能
–all -a 全てのコンテナを表示(未指定時は実行中のコンテナだけ表示)

psコマンドを実行します。

$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS     NAMES
6fe33f37b7cd   ubuntu:18.04   "bash"    20 seconds ago   Up 18 seconds             ubuntu-18.04

無事にコンテナが起動していることができました。

実行中のコンテナ内でコマンドを実行する

前回のhello-worldではフォアグランドで実行し、メッセージを出力してすぐに終了しました。
今回はバッググランドで実行し、実行中にubuntuのコンテナに対してログインします。

実行中のコンテナ内でコマンドを実行するにはexecコマンドを使用します。

使い方は

$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

です。

さまざまなオプションがありますが、今回使用したオプションのみ説明します。

さきほどのpsコマンドでbashが使用できることが確認できましたので、bashを実行します。

$ sudo docker exec -it ubuntu-18.04 bash
root@6fe33f37b7cd:/#

ubuntu18.04rootでログインしたので、バージョンの確認をしてみます。

root@6fe33f37b7cd:/# lsb-release
bash: lsb-release: command not found

あっコマンドがないみたいですね

root@6fe33f37b7cd:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

無事にubuntu18.04.06であることが確認できました。
exit コマンドでbashを終了します。

root@6fe33f37b7cd:/# exit
exit

コンテナを停止する

実行中のコンテナを停止するにはstopコマンドを使用します。

使い方は

$ docker stop [OPTIONS] CONTAINER [CONTAINER...]

です。

先ほどコンテナを起動した際の名前を使用してコンテナを停止します。

$ sudo docker stop ubuntu-18.04
ubuntu-18.04

コンテナを一覧表示して確認してみます。

$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

たしかに停止中かも -a オプションを付加してみます。

$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND    CREATED         STATUS                      PORTS     NAMES
6fe33f37b7cd   ubuntu:18.04   "bash"     4 minutes ago   Exited (0) 19 seconds ago             ubuntu-18.04
35dbecfd6814   hello-world    "/hello"   9 hours ago     Exited (0) 9 hours ago                trusting_jepsen

はい、無事に停止しているようです。

後片付け

不要なコンテナを削除するにはrmコマンドを使用します。

使い方は

$ docker rm [OPTIONS] CONTAINER [CONTAINER...]

です。

先ほどpsコマンドで確認したコンテナIDを使用してコンテナを削除します。

$ sudo docker rm 35dbecfd6814

コンテナが削除されたことを確認します。

$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND    CREATED         STATUS                      PORTS     NAMES
6fe33f37b7cd   ubuntu:18.04   "bash"     4 minutes ago   Exited (0) 19 seconds ago             ubuntu-18.04

次に不要となったイメージを削除するためにrmiコマンドを使用します。

使い方は

$ docker rmi [OPTIONS] IMAGE [IMAGE...]

です。

先ほどimagesコマンドで確認したイメージIDを使用してイメージを削除します。

$ sudo docker rmi feb5d9fea6a5
Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 35dbecfd6814

なぜか怒られたので強制削除

$ sudo docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

削除されたことを確認をします。

$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       18.04     f5cbed4244ba   2 weeks ago   63.2MB

無事に後片付けが終わりました。