Dockerとは何か?

Dockerは、ミドルウェアのインストールや各種環境設定をコード化して管理するInfrastracture as Code(IaC)で注目されている技術の一つで、Docker社が開発しているコンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。
https://www.docker.com/what-docker

 

Dockerは、Linuxのコンテナ技術を使ったもので、よく仮想マシンと比較されます。

NutanixやHyper-V、VMwareなどで動作する仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。そのため、軽量で高速に起動、停止などが可能です。

 

 

ソフトウェア開発で実施されてきた構成管理や自動化などを、サーバーの各種設定やミドルウェアのインストールなどにも適用したものです。

これらにより、以下のような利点が生まれます。

  1. コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
  2. 作成した環境を配布しやすい。
  3. スクラップ&ビルドが容易にできる。

例えば、開発環境では動いていたけど、開発環境とは若干構成の違う本番環境では動かないといったケースも、開発工程からDockerを活用していくことで防ぎやすくなります。そして、開発工程の中で使っていた環境をそのまま本番環境に持っていくことも可能なため、環境差分が少なく、環境による問題を減らすことができます。

 

作成したDockerイメージを公開し、他の人にも利用してもらうことで、各自の環境のバージョンずれ防止や、開発環境準備の短縮化にもつながります。

 

オーケストレーションツールとしてKubernetes(https://kubernetes.io/)が注目を浴びていて、Dockerでネイティブでサポートされることになり話題にもなりました。

 

GenAI各種サービスでもDockerコンテナとして用意されており、ここではコンテナ技術の基本をおさえておこうと思います。

 

 

Ubuntu に Docker をインストールする

環境

 

1. 古いバージョンのDockerが存在していたら削除しておく

====================================

$ sudo apt-get remove docker docker-engine docker.io containerd runc
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
パッケージ 'docker' はインストールされていないため削除もされません
E: パッケージ docker-engine が見つかりません

====================================

2. Docker リポジトリの設定

Docker のインストールに必要な基礎パッケージをインストールします。

====================================

$ sudo apt update
$ sudo apt install ca-certificates curl gnupg lsb-release

====================================

Docker公式 GPGキーを取得
リポジトリのセキュリティを確保するため、Docker の公式 GPG キーを追加します。

====================================

$ sudo mkdir -p /etc/apt/keyrings

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

====================================

Docker のリポジトリをシステムに登録します。

====================================

$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

====================================

 

 

3. Dockerのインストール

リポジトリの設定が完了したら、Docker をインストールします。

====================================

$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

====================================

 

4. Dockerインストール後の確認

Dockerのバージョンを確認します。

====================================

$ sudo docker -v

Docker version 28.0.1, build 068a01e

====================================

 

5. Dockerサービスの起動

Dockerサービスを起動します。

====================================

$ sudo systemctl start docker

====================================

 

Dockerサービスが起動しているか確認しましょう。

====================================

$ sudo systemctl status docker

====================================

 

以下のコマンドでサービス自動起動設定をしておくと、マシン再起動後も自動でDockerサービスが起動されます。

====================================

$ sudo systemctl enable docker

====================================

 

以下のコマンドでDockerについての情報を見ることができます。

====================================

$ sudo docker info

Client: Docker Engine - Community

 Version:    28.0.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.21.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.33.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

・・・以降省略

====================================

これでDockerを使用する準備が整いました。

 

 

6. Dockerコンテナの基本操作

公開されているDockerイメージを使用し、コンテナの基本的な操作を行ってみましょう。

今回は、公開されているDockerイメージの取得、それをもとにコンテナを起動、起動の確認ができたら、コンテナの停止・削除、Dockerイメージの削除を行い、基本となるDockerイメージ、コンテナのライフサイクルを確認しましょう。

 

Dockerのイメージ一覧を確認します。

====================================

$ sudo docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

====================================

現状ではヘッダーのみで、何も表示されません。
Docker Hub」という、公開されているDockerイメージを管理しているところからダウンロードしたり、自分でDockerイメージを作成したりすることで初めて一覧に表示されます。

 

ローカル環境のDockerコンテナの一覧を確認します。

(Dockerコンテナとは、Dockerイメージをもとに起動させたコンテナのことを指します。)

====================================

$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

====================================

コンテナ起動はまだ行っていないため、この結果も同様にヘッダーのみしか表示されません。

 

hello-worldイメージを使ってコンテナを動かしてみる

====================================

ugajin@ai001:~$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete
Digest: sha256:7e1a4e2d11e2ac7a8c3f768d4166c2defeb09d2a750b010412b6ea13de1efb19
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

====================================

まず最初に「hello-world」イメージがローカル環境にないので、Docker Hubに探しに行き最新の「hello-world」をダウンロードしたことが分かります。

その後「hello-world」イメージがローカル環境で起動されたことが標準出力ログから確認出来ました!!

 

 

Dockerのイメージ一覧を確認します。

====================================

$ sudo docker images
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    74cc54e27dc4   7 weeks ago   10.1kB

====================================

今度は、hello-worldイメージの行がありますね。

 

ローカル環境のDockerコンテナの一覧を確認します。

====================================

$ sudo docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
d2198d0d2b42   hello-world   "/hello"   7 minutes ago   Exited (0) 7 minutes ago             tender_chatelet

====================================

hello-worldコンテナが確認出来ました。

 

 

 

Dockerコンテナ、イメージを削除する

次に作成したDockerコンテナと取得したDockerイメージを削除してみましょう。

以下のコマンドでhello-worldコンテナを削除することができます。

====================================

$ sudo docker rm d2198d0d2b42   ※sudo docker rm <CONTAINER ID>

 

$ sudo docker ps -a

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

====================================

hello-worldコンテナが削除されました。

 

====================================

$ sudo docker rmi hello-world

Untagged: hello-world:latest
Untagged: hello-world@sha256:7e1a4e2d11e2ac7a8c3f768d4166c2defeb09d2a750b010412b6ea13de1efb19
Deleted: sha256:74cc54e27dc41bb10dc4b2226072d469509f2f22f1a3ce74f4a59661a1d44602
Deleted: sha256:63a41026379f4391a306242eb0b9f26dc3550d863b7fdbb97d899f6eb89efe72

 

$ sudo docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

====================================

hello-worldイメージも削除できました。

 

こちらで基本的なコンテナ操作が確認できました!!

今後は様々なGenAIコンテナを利用して検証していきましょう。