いまさらながらDockerの使い方を勉強中です。この記事では、Dockerを使うための環境構築方法と、誰かが作成したDocker ImageをもとにDocker Containerを作成して動かす方法についてまとめます。
環境構築
以下ではUbuntu 18.04にDocker Community Editionをインストールする場合について説明します。
Docker Community Editionのインストール
- Get Docker CE for Ubuntu | Docker Documentation に従い、UbuntuにDocker CEを入れます。CEとは、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にあるubuntuのlatest
タグがついた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
- A Docker Tutorial for Beginners
- コンパクトで最初に読むのにおすすめです。
- Play with Docker Classroom
- ブラウザで実際にコマンドを打ち込みながら試せます。