いまさらDocker入門
はじめに
いまさらながらDockerについてまとめてみました。 なるべく動かしながらDockerを理解していきたいと思います。
Dockerとは
Dockerとは、コンテナを活用した開発・運用を可能にするソフトウェアです。 コンテナを使えるツールという理解でいいと思います。 コンテナを使えるツールはDocker以外にもありますが、ほとんどDockerが使われています。
コンテナとは
コンテナとは、ホストOS上で独立したプロセスとして実行されるアプリケーション環境であり、アプリケーションに必要なものをパッケージ化し、分離された空間で実行する技術です。
動かしてみると仮想マシンと同じと感じますが、ホストOSからはプロセスとして見えるので起動や停止などが軽量にできます。
コンテナと仮想マシン
コンテナは、ホストOSのカーネルを他のコンテナと共有しながら、独立したプロセスとして実行されるため軽量になります。
仮想マシンは仮想化ソフトウェアやハイパーバイザーを通してホストのリソースにアクセスし、仮想的なゲストOSを実行します。
Dockerのアーキテクチャ
Dockerはクライアント・サーバ型のアーキテクチャとなっています。 DockerクライアントがDockerデーモンにコンテナの作成や実行を依頼します。
クライアントとデーモンは同じシステム上で動かすこともできます。
公式ドキュメントより
- Dockerデーモン : Dockerオブジェクトを管理
- Dockerクライアント : Dockerデーモンに仕事を依頼
- Dockerレギストリ : イメージの保管
- Dockerオブジェクト : イメージ・コンテナ・ネットワーク・ボリュームなど
イメージとコンテナ
イメージはコンテナを作成するためのテンプレートとなるものです。 コンテナはイメージを基に作成されたアプリケーションなどが実行されているプロセスとなります。
DockerイメージとDockerコンテナと呼んでいる記事が多いが、公式ドキュメントみるとイメージとコンテナという呼び方で良さそうでした。
Docker Engine
Docker Engineは、コンテナ化を実現するアプリケーションです。
クライアントサーバ型アプリケーションで、サーバはDockerデーモンとして、クライアントはDockerクライアントとして動作しています。
Docker Desktop
Docker Desktopは、MacやWindows環境にインストールできるコンテナを構築できるようになるアプリケーションです。 Docker Engineなどが含まれています。
Docker Hub
Docker Hub Container Image Library | App Containerization
Welcome to the world's largest container registry built for developers and open source contributors to find, use, and share their container images. Build, push and pull.
クラウド上のレジストリサービスです。 リポジトリにイメージを保管できるため、公式やコミュニティ、プライベートのリポジトリからイメージの取得が可能です。
インストール
MacにDocker Desktopをインストールします。
Docker Hubからダウンロードしてインストールしてください。
インストールが完了したら、バージョンを確認してみます。
1❯ docker --version
2Docker version 20.10.6, build 370c289
動かしてみる
言葉だけではイメージつかないので、実際にイメージからコンテナを作成して実行してみたいと思います。
Docker Hubからイメージを取得してコンテナを実行するパターンとDockerfileからイメージを作成してコンテナを実行するパターンをやってみます。
Docker Hubイメージ取得してコンテナ実行
nginxのイメージをDocker Hubの公式リポジトリから取得します。
1❯ docker image pull nginx
2Using default tag: latest
3latest: Pulling from library/nginx
469692152171a: Pull complete
549f7d34d62c1: Pull complete
65f97dc5d71ab: Pull complete
7cfcd0711b93a: Pull complete
8be6172d7651b: Pull complete
9de9813870342: Pull complete
10Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
11Status: Downloaded newer image for nginx:latest
12docker.io/library/nginx:latestt
これだけでnginxを実行するコンテナのイメージが取得できました。 取得したイメージを確認してみます。
1❯ docker image ls
2REPOSITORY TAG IMAGE ID CREATED SIZE
3nginx latest f0b8a9a54136 10 days ago 133MB
イメージからコンテナ作成して実行してみます。
1❯ docker container run -d -p 8080:80 nginx
27e11a9d4c8f15d261fc75c97590f95a3a6b9043a12516bd74ec9b1f87ea62c31
これでコンテナが実行されている状態になりました。 nginxが動作しているので、 http://localhost:8080 にブラウザからアクセスしてみます。
実行しているコンテナを確認してみます。
1❯ docker container ls
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37e11a9d4c8f1 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp sad_mccarthy
実行したコンテナをコンテナIDを使って停止させます。
1❯ docker container stop 7e11a9d4c8f1
27e11a9d4c8f1
確認すると停止したコンテナは残っています。
1❯ docker container ls -a
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37e11a9d4c8f1 nginx "/docker-entrypoint.…" 7 minutes ago Exited (0) 3 minutes ago sad_mccarthy
必要なければ停止したコンテナを破棄してしまいましょう。
1❯ docker container rm 7e11a9d4c8f1
27e11a9d4c8f1
Dockerfileからコンテナ実行
まずはコンテナ上で動作させるアプリケーションを準備します。
1package main
2
3import (
4 "fmt"
5 "log"
6 "net/http"
7)
8
9func main() {
10 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
11 log.Println("received request")
12 fmt.Fprintf(w, "Hello Docker!!")
13 })
14
15 log.Println("start server")
16 server := &http.Server{Addr: ":8080"}
17 if err := server.ListenAndServe(); err != nil {
18 log.Println(err)
19 }
20}
次にDockerfileを準備します。 Dockerfileは、イメージの構成を定義するファイルになります。 Dockerfileの記述を基にイメージが作成されます。
1FROM golang:1.13
2
3RUN mkdir /echo
4COPY main.go /echo
5
6CMD ["go", "run", "/echo/main.go"]
カレントディレクトリのファイルは以下のようになります。
1❯ ls
2Dockerfile main.go
Dockerfileからイメージを作成します。 これでGoで書かれたアプリケーションを含むイメージが作成されます。
1❯ docker image build -t example/echo:latest .
2[+] Building 2.6s (9/9) FINISHED
3 => [internal] load build definition from Dockerfile 0.0s
4 => => transferring dockerfile: 131B 0.0s
5 => [internal] load .dockerignore 0.0s
6 => => transferring context: 2B 0.0s
7 => [internal] load metadata for docker.io/library/golang:1.13 2.5s
8 => [auth] library/golang:pull token for registry-1.docker.io 0.0s
9 => [1/3] FROM docker.io/library/golang:1.13@sha256:8ebb6d5a48deef738381b56b1d4cd33d99a5d608e0d03c5fe8dfa3f68d41a1f8 0.0s
10 => [internal] load build context 0.0s
11 => => transferring context: 29B 0.0s
12 => CACHED [2/3] RUN mkdir /echo 0.0s
13 => CACHED [3/3] COPY main.go /echo 0.0s
14 => exporting to image 0.0s
15 => => exporting layers 0.0s
16 => => writing image sha256:49cd46721f74e37eeaba67c29f32aec3bb1aaea84d2006c9357238b8e713711e 0.0s
17 => => naming to docker.io/example/echo:latest
作成したイメージを確認します。
1❯ docker image ls
2REPOSITORY TAG IMAGE ID CREATED SIZE
3example/echo latest 49cd46721f74 2 weeks ago 803MB
作成したイメージからコンテナを実行します。
1❯ docker container run -d -p 9000:8080 example/echo:latest
24a081cbfae0a418c12d25da5e5ece4778f3459c0862b846fc8a456edba2988dc
ブラウザから http://localhost:9000 にアクセスしてみます。
最後に実行されているコンテナを確認してみます。
1❯ docker container ls
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34a081cbfae0a example/echo:latest "go run /echo/main.go" About a minute ago Up About a minute 0.0.0.0:9000->8080/tcp, :::9000->8080/tcp thirsty_faraday
まとめ
- Dockerはコンテナを使えるようになるツール
- イメージからコンテナを実行する
- Dockerfileを使うとイメージの構成をテキストベースで管理できる
参照
- Docker ドキュメント日本語化プロジェクト — Docker-docs-ja 19.03 ドキュメント
- ホスト型とハイパーバイザー型の違いは何?VMware vSphere Hypervisor の概要 | Think IT(シンクイット)