Docker ImageからContainerを作るコマンドのまとめ


このエントリーをはてなブックマークに追加

いまさらながらDockerの使い方を勉強中です。この記事では、Dockerを使うための環境構築方法と、誰かが作成したDocker ImageをもとにDocker Containerを作成して動かす方法についてまとめます。

環境構築

以下ではUbuntu 18.04にDocker Community Editionをインストールする場合について説明します。

Docker Community Editionのインストール

現時点でのインストールの流れは以下のとおりです。

  • "Uninstall old versions"の節に従い、既にインストール済のdockerを(もしあれば)削除
  • "SET UP THE REPOSITORY"の節に従い、aptを使ってDocker CEのstableをインストール

動作確認

現時点で以下のバージョンが入りました。

$ docker --version
Docker version 19.03.5, build 633a0ea838

正しくDockerをインストールできていれば、sudo docker run hello-world によりHello from Docker!というメッセージが表示されます。

また、sudo docker image lsで、ローカルに取得されたイメージが表示されるはずです。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        13 months ago       1.84kB

非rootでもdockerを使えるようにする

インストールしただけだとrootしかdockerを使えません。非rootユーザでもdockerを使えるようにするには、 * Post-installation steps for Linux | Docker Documentation の "Manage Docker as a non-root user" に従います。

成功すれば、docker run hello-worldでメッセージが表示されるようになります。以降の説明ではこの設定を行ったものとします。

使い方

Dockerのバージョンを調べる

docker -vで簡易版のバージョン情報を、docker versionで詳細版のバージョン情報を表示できます。以下は私の環境での例です。

$ docker -v                            
Docker version 19.03.5, build 633a0ea838
$ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea838
 Built:             Wed Nov 13 07:29:52 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea838
  Built:            Wed Nov 13 07:28:22 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

Docker Imageの取得

まず、誰かが作成したDocker Imageを取得するところから始めます。Docker Imageには"Base Image"と"Child Image"の2種類があります。

Base Imageは親を持たないImageで、例えばubuntu, debian, busyboxなどのOSが代表的です。 Docker Hub にて大量のBase Imageが提供されています。 以下では、Docker Hubから、Base Imageの一つであるubuntuを取得して使ってみます。

$ docker pull ubuntu

とすると、Docker Hubにあるubuntulatestタグがついたimageが取得できます。

タグを明に指定することで特定のバージョンを取得することも可能です。例えば

$ docker pull ubuntu:20.04

とすると、現時点では開発版であるバージョン20.04のUbuntuが取得できます。

これまでに取得したimageの一覧はdocker image lsまたはdocker imagesで確認できます。

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ccc6e87d482b        3 weeks ago         64.2MB

Docker ImageからDocker Containerを作る

取得したDocker ImageからDocker Containerを作るにはdocker runコマンドを使います。

$ docker run ubuntu

上記コマンドを実行すると一見何も実行されないように見えますが、実際には以下が順番に行われます。

  • ubuntuという名前のDocker Imageがローカルにあるかを探す。もしなければDocker HubからDocker Imageを取得
  • ubuntuというDocker Imageから、Docker Containerを作成
  • Containerの中でコマンドを実行

さきほどの例ではコマンドを与えなかったので、ただコンテナが作成されただけでした。次の例では、コマンドls -alFを与えてみます。コンテナの中にあるルートディレクトリ以下のファイル一覧が表示できます。

$ docker run ubuntu ls -alF
total 72
drwxr-xr-x   1 root root 4096 Feb 11 08:51 ./
drwxr-xr-x   1 root root 4096 Feb 11 08:51 ../
-rwxr-xr-x   1 root root    0 Feb 11 08:51 .dockerenv*
drwxr-xr-x   2 root root 4096 Jan 12 21:10 bin/
drwxr-xr-x   2 root root 4096 Apr 24  2018 boot/
drwxr-xr-x   5 root root  340 Feb 11 08:51 dev/
drwxr-xr-x   1 root root 4096 Feb 11 08:51 etc/
drwxr-xr-x   2 root root 4096 Apr 24  2018 home/
drwxr-xr-x   8 root root 4096 May 23  2017 lib/
drwxr-xr-x   2 root root 4096 Jan 12 21:10 lib64/
drwxr-xr-x   2 root root 4096 Jan 12 21:09 media/
drwxr-xr-x   2 root root 4096 Jan 12 21:09 mnt/
drwxr-xr-x   2 root root 4096 Jan 12 21:09 opt/
dr-xr-xr-x 367 root root    0 Feb 11 08:51 proc/
drwx------   2 root root 4096 Jan 12 21:10 root/
drwxr-xr-x   1 root root 4096 Jan 16 01:20 run/
drwxr-xr-x   1 root root 4096 Jan 16 01:20 sbin/
drwxr-xr-x   2 root root 4096 Jan 12 21:09 srv/
dr-xr-xr-x  13 root root    0 Feb 11 08:51 sys/
drwxrwxrwt   2 root root 4096 Jan 12 21:10 tmp/
drwxr-xr-x   1 root root 4096 Jan 12 21:09 usr/
drwxr-xr-x   1 root root 4096 Jan 12 21:10 var/

コンテナの中に入ってインタラクティブに操作を行うには、-itを使います。exitで終了です。

$ docker run -it ubuntu bash

ここで作られるコンテナは使い捨てです。試しに、上記でコンテナの中に入って適当にファイルを作成してコンテナを終了すると、次にコンテナを作成したときにはそのファイルは存在しないことが分かります。

ここまでの作業で、コンテナを使ったあとの残りカスが出ています。docker psしても何も表示されませんが、

$ docker ps -a

とすると、例えば以下のように、停止状態のコンテナが一覧になって表示されます。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
45f580404989        ubuntu              "bash"              16 minutes ago      Exited (0) 14 minutes ago                       clever_rhodes
8231b2e245c4        ubuntu              "bash"              18 minutes ago      Exited (0) 18 minutes ago                       sharp_moore
1aa25f7fc213        ubuntu              "ls -alF"           20 minutes ago      Exited (0) 20 minutes ago                       awesome_proskuriakova

停止状態のコンテナを完全に削除するには、

$ docker rm (コンテナID)

とします。

停止状態のコンテナをまとめて一斉に削除するには

$ docker container prune

とします。

コンテナを使い終わるたびに削除をするのは面倒です。コンテナを使い終わったあとに自動で削除されるようにするには、runコマンドに--rmをつけて実行します。

$ docker run --rm -it ubuntu bash

例:GitLabを使う

"Child Image"の利用例として、GitLabをローカルマシンで動かすことを試してみます。

GitLab Docker images | GitLab にある手順書を従ってGitLabをインストールすることもできます。 しかし、これから紹介するDockerを使った方法であれば、もっと簡単にGitLabを動かせます。

GitLab Docker images | GitLab にあるコマンドを少し変えて、以下のコマンドを実行します。

$ docker run --detach \
  --publish 10443:443 --publish 10080:80 --publish 10022:22 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest

--detachはコンテナをバックグラウンドで動かすという意味です。少し待った後、ブラウザでlocalhost:10080にアクセスすると、GitLabが立ち上がっていることがわかります。他の引数の意味は以下の通りです。

  • --name: コンテナに付ける名前の指定
  • --publish: コンテナのポートとホストのポートとの対応付けの指定。10443:443は、コンテナのポート443をホストのポート10443に対応付けるという意味
  • --restart always: システムをリブートしたあと、このコンテナを自動でrestartする
  • --volume: GitLabのデータの保存先の指定。この例の場合、すべてのGitLabデータは/srv/gitlab/以下に保存される

コンテナを停止状態にするにはdocker stop gitlabとします。GitLabで遊び終わったら、/srv/gitlab/にGitLabが保存したデータ一式を消しておきましょう。

参考URL