いまさらDocker入門

2021.05.23
2024.03.24
Docker
Go初心者

本ページはAmazonアフィリエイトのリンクを含みます。

はじめに

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

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

インストール

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

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

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

1docker --version
2Docker version 20.10.6, build 370c289

動かしてみる

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

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

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

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

1docker 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を実行するコンテナのイメージが取得できました。 取得したイメージを確認してみます。

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

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

1docker container run -d -p 8080:80 nginx
27e11a9d4c8f15d261fc75c97590f95a3a6b9043a12516bd74ec9b1f87ea62c31

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

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

1docker 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を使って停止させます。

1docker container stop 7e11a9d4c8f1
27e11a9d4c8f1

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

1docker 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

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

1docker 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"]

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

1ls
2Dockerfile  main.go

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

1docker 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

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

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

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

1docker container run -d -p 9000:8080 example/echo:latest
24a081cbfae0a418c12d25da5e5ece4778f3459c0862b846fc8a456edba2988dc

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

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

1docker 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を使うとイメージの構成をテキストベースで管理できる

参照

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee