いまさら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

クラウド上のレジストリサービスです。
リポジトリにイメージを保管できるため、公式やコミュニティ、プライベートのリポジトリからイメージの取得が可能です。

インストール

MacにDocker Desktopをインストールします。

Docker Hubからダウンロードしてインストールしてください。

インストールが完了したら、バージョンを確認してみます。

❯ docker --version
Docker version 20.10.6, build 370c289

動かしてみる

言葉だけではイメージつかないので、実際にイメージからコンテナを作成して実行してみたいと思います。

Docker Hubからイメージを取得してコンテナを実行するパターンとDockerfileからイメージを作成してコンテナを実行するパターンをやってみます。

Docker Hubイメージ取得してコンテナ実行

nginxのイメージをDocker Hubの公式リポジトリから取得します。

❯ docker image pull nginx
Using default tag: latest
latest: Pulling from library/nginx
69692152171a: Pull complete
49f7d34d62c1: Pull complete
5f97dc5d71ab: Pull complete
cfcd0711b93a: Pull complete
be6172d7651b: Pull complete
de9813870342: Pull complete
Digest: sha256:df13abe416e37eb3db4722840dd479b00ba193ac6606e7902331dcea50f4f1f2
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latestt

これだけでnginxを実行するコンテナのイメージが取得できました。
取得したイメージを確認してみます。

❯ docker image ls
REPOSITORY                           TAG               IMAGE ID       CREATED         SIZE
nginx                                latest            f0b8a9a54136   10 days ago     133MB

イメージからコンテナ作成して実行してみます。

❯ docker container run -d -p 8080:80 nginx
7e11a9d4c8f15d261fc75c97590f95a3a6b9043a12516bd74ec9b1f87ea62c31

これでコンテナが実行されている状態になりました。
nginxが動作しているので、
http://localhost:8080
にブラウザからアクセスしてみます。

実行しているコンテナを確認してみます。

❯ docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
7e11a9d4c8f1   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   sad_mccarthy

実行したコンテナをコンテナIDを使って停止させます。

❯ docker container stop 7e11a9d4c8f1
7e11a9d4c8f1

確認すると停止したコンテナは残っています。

❯ docker container ls -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS                          PORTS     NAMES
7e11a9d4c8f1   nginx                    "/docker-entrypoint.…"   7 minutes ago   Exited (0) 3 minutes ago                  sad_mccarthy

必要なければ停止したコンテナを破棄してしまいましょう。

❯ docker container rm 7e11a9d4c8f1
7e11a9d4c8f1

Dockerfileからコンテナ実行

まずはコンテナ上で動作させるアプリケーションを準備します。

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        log.Println("received request")
        fmt.Fprintf(w, "Hello Docker!!")
    })

    log.Println("start server")
    server := &http.Server{Addr: ":8080"}
    if err := server.ListenAndServe(); err != nil {
        log.Println(err)
    }
}

次にDockerfileを準備します。
Dockerfileは、イメージの構成を定義するファイルになります。
Dockerfileの記述を基にイメージが作成されます。

FROM golang:1.13

RUN mkdir /echo
COPY main.go /echo

CMD ["go", "run", "/echo/main.go"]

カレントディレクトリのファイルは以下のようになります。

❯ ls
Dockerfile  main.go

Dockerfileからイメージを作成します。
これでGoで書かれたアプリケーションを含むイメージが作成されます。

❯ docker image build -t example/echo:latest .
[+] Building 2.6s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                 0.0s
 => => transferring dockerfile: 131B                                                                                                                                 0.0s
 => [internal] load .dockerignore                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/golang:1.13                                                                                                       2.5s
 => [auth] library/golang:pull token for registry-1.docker.io                                                                                                        0.0s
 => [1/3] FROM docker.io/library/golang:[email protected]:8ebb6d5a48deef738381b56b1d4cd33d99a5d608e0d03c5fe8dfa3f68d41a1f8                                                 0.0s
 => [internal] load build context                                                                                                                                    0.0s
 => => transferring context: 29B                                                                                                                                     0.0s
 => CACHED [2/3] RUN mkdir /echo                                                                                                                                     0.0s
 => CACHED [3/3] COPY main.go /echo                                                                                                                                  0.0s
 => exporting to image                                                                                                                                               0.0s
 => => exporting layers                                                                                                                                              0.0s
 => => writing image sha256:49cd46721f74e37eeaba67c29f32aec3bb1aaea84d2006c9357238b8e713711e                                                                         0.0s
 => => naming to docker.io/example/echo:latest

作成したイメージを確認します。

❯ docker image ls
REPOSITORY                           TAG               IMAGE ID       CREATED         SIZE
example/echo                         latest            49cd46721f74   2 weeks ago     803MB

作成したイメージからコンテナを実行します。

❯ docker container run -d -p 9000:8080 example/echo:latest
4a081cbfae0a418c12d25da5e5ece4778f3459c0862b846fc8a456edba2988dc

ブラウザから
http://localhost:9000
にアクセスしてみます。

最後に実行されているコンテナを確認してみます。

❯ docker container ls
CONTAINER ID   IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                       NAMES
4a081cbfae0a   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を使うとイメージの構成をテキストベースで管理できる

参照

タイトルとURLをコピーしました