【Docker再入門】~Dockerの概要紹介・Dockerインストール偏~
はじめに
こんにちは。championです。
普段は、Google CloudやAWSを中心としたクラウドインフラの設計~保守運用を行なっています。
個人的に年明けからコンテナ技術に再入門使用という企画をやっています。
Google CloudのCloud Runや、AWSのECSでも利用されるDockerという技術ですが、Dockerについて再度復習を兼ねてまとめたいと思います。
今回は、Dockerの概要についての紹介や、仮想マシンとの違い、Linuxホストマシン上にDockerをインストールするまでを記載したいと思います。
Dockerとは
DockerはDocker社が開発をしており、アプリケーションとその実行に必要な環境を一つにパッケージ化し、軽量で可搬性の高い実行環境を提供するコンテナ型仮想技術です。基本的には、Dockerエンジンと呼ばれるDockerコンテナを管理するためのソフトウェアをインストールさえしていれば、様々な環境でDockerコンテナを実行することができます。そのため、Dockerは開発環境の差異を吸収してくれ、環境の一貫性を保つことができます。
仮想マシンとの違い
コンテナと仮想マシンは、両方それぞれの中に独立したプロセス実行環境を提供する点は同じですが、プロセスの下にあるカーネル以下のレイヤに大きな違いがあります。仮想マシンは、個々の仮想マシン専用の仮想的なハードウェアとカーネルを使うのに対して、コンテナの場合は、コンテナを動かすホストOS、および全コンテナが1つのカーネルを共有します。
仮想マシンが起動するまでの流れは以下の通りです。
- ホストOS上の仮想化ソフトウェアが、仮想マシンを起動する。
- GRUBなどのブートローダが起動する
- ブートローダがカーネルを起動する
- カーネルがinitプログラムを起動する
- init(systemd)プロセスが各種サービスを立ち上げる
コンテナが起動するまでの流れは以下の通りです。
- コンテナランタイム(Dockerd)が、コンテナを作る
- コンテナが最初のプロセスを立ち上げる
仮想マシンと比較すると、起動するまでの過程がかなり短いことがわかります。
そのため、コンテナは起動時間が短いことから、迅速なスケーリングが可能になります。
Dockerのアーキテクチャ
Dockerのアーキテクチャは、クライアント・サーバ型のアーキテクチャを採用しています。
Dockerのアーキテクチャに登場する用語について解説していきます。
Dockerクライアント
Dockerクライアントは、Dockerデーモンとやり取りするためにユーザが利用します。dockerCLIコマンドを実行することで、Dockerデーモンに対してDockerの機能の実行を命令します。
Dockerデーモン
Dockerデーモンは、Dockerクライアントから命令を受け付け、Dockerイメージ、コンテナ、ネットワークなどのDockerの機能群を管理・実行します。
Dockerレジストリ
Dockerレジストリは、Dockerイメージを管理します。Docker Hubのような公開レジストリもあれば、AWSやGoogle Cloudのようなクラウドサービスが提供するレジストリや、プライベートレジストリも使用することができます。
Dockerデーモンは、DockerレジストリからDockerイメージを取得して、ホスト上でDockerイメージからDockerコンテナを実行します。
Dockerイメージ
Dockerイメージは、Dockerコンテナを作成する命令が記載されているテンプレートのことを言います。DockerコンテナはDockerイメージをもとに作成されます。Dockerイメージは、先述したDockerレジストリからダウンロードすることもできますし、自身で作成することもできます。自身でDockerイメージを作成する場合は、Dockerfileというファイルを作成し、DockerfileにDockerイメージを作成するまでの命令を記載します。
Dockerコンテナ
Dockerコンテナは、先述したDockerイメージから作成される実行状態となったインスタンスのことを言います。コンテナは、Linuxカーネルの機能を利用して独立したネットワークや、プロセスが提供されホストマシン上で隔離された領域になります。
Dockerのインストール
DockerをLinux上にインストールしていきます。
今回は、Rocky Linux 9.5にDockerをインストールしていきます。
$ cat /etc/os-release
NAME="Rocky Linux"
VERSION="9.5 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.5"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.5 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="https://rockylinux.org/"
VENDOR_NAME="RESF"
VENDOR_URL="https://resf.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
SUPPORT_END="2032-05-31"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.5"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.5"
Dockerリポジトリの追加
Docker社が提供する公式のリポジトリを追加していきます。
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
リポジトリ一覧を確認していきます。
$ sudo dnf repolist | grep Docker
docker-ce-stable Docker CE Stable - x86_64
これでRocky LinuxにDockerのリポジトリがインストールできました。
Dockerエンジンのインストール
Dockerエンジンを以下のコマンドでインストールしていきます。
$ sudo dnf -y install docker-ce docker-ce-cli containerd.io
インストール後、docker versionコマンドを実行することで、インストールしたDockerのバージョンを表示することができます。
今回はバージョン27.5.1がインストールされていることが確認できました。
$ docker version
Client: Docker Engine - Community
Version: 27.5.1
API version: 1.47
Go version: go1.22.11
Git commit: 9f9e405
Built: Wed Jan 22 13:42:47 2025
OS/Arch: linux/amd64
Context: default
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Dockerの起動確認と自動起動設定
Dockerエンジンインストール直後は、Dockerデーモンが起動していません。
$ sudo systemctl status docker
○ docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; preset: disabled)
Active: inactive (dead)
TriggeredBy: ○ docker.socket
Docs: https://docs.docker.com
そのため、systemctl startコマンドを利用して、Dockerの起動を行っていきます。
$ sudo systemctl start docker
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; preset: disabled)
Active: active (running) since Fri 2025-01-24 23:17:49 UTC; 1s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 78229 (dockerd)
Tasks: 10
Memory: 28.2M
CPU: 207ms
CGroup: /system.slice/docker.service
└─78229 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Jan 24 23:17:47 rocky dockerd[78229]: time="2025-01-24T23:17:47.956118145Z" level=info msg="Starting up"
Jan 24 23:17:47 rocky dockerd[78229]: time="2025-01-24T23:17:47.957371649Z" level=info msg="OTEL tracing is not>
Jan 24 23:17:48 rocky dockerd[78229]: time="2025-01-24T23:17:48.019630565Z" level=info msg="Loading containers:>
Jan 24 23:17:48 rocky dockerd[78229]: time="2025-01-24T23:17:48.059542785Z" level=info msg="Firewalld: created >
Jan 24 23:17:49 rocky dockerd[78229]: time="2025-01-24T23:17:49.309172007Z" level=info msg="Firewalld: interfac>
Jan 24 23:17:49 rocky dockerd[78229]: time="2025-01-24T23:17:49.642863119Z" level=info msg="Loading containers:>
Jan 24 23:17:49 rocky dockerd[78229]: time="2025-01-24T23:17:49.664401585Z" level=info msg="Docker daemon" comm>
Jan 24 23:17:49 rocky dockerd[78229]: time="2025-01-24T23:17:49.664710505Z" level=info msg="Daemon has complete>
Jan 24 23:17:49 rocky dockerd[78229]: time="2025-01-24T23:17:49.716290617Z" level=info msg="API listen on /run/>
Jan 24 23:17:49 rocky systemd[1]: Started Docker Application Container Engine.
Dockerの起動が確認できた後は、再起動後も自動的にDockerデーモンが起動するように、systemctl enableコマンドを利用して自動起動の設定を行なっていきます。
$ sudo systemctl enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
$ sudo systemctl is-enabled docker
enabled
Dockerグループへユーザーを追加
Dockerインストール時は、dockerコマンドはroot権限でしか実行できません。docker psコマンドを実行すると、/var/run/docker.sockファイルへの権限エラーになってしまいます。
/var/run/docker.sockファイルの権限を確認すると、rootかdockerグループのメンバーにしか権限がないことがわかります。
$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/containers/json": dial unix /var/run/docker.sock: connect: permission denied
$ ll /var/run/docker.sock
srw-rw----. 1 root docker 0 Jan 24 23:17 /var/run/docker.sock
root以外でもdockerコマンドを実行することができるように設定していきます。
自身のユーザをdockerグループに所属させることで、自身のユーザでdockerコマンドを実行することができます。
$ sudo usermod -aG docker $USER
その後、再起動して再度ログインした後にdocker psコマンドを実行すると、権限エラーがなく実行結果を表示することができました。
$ sudo reboot
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
これでdockerを使用できる環境は整いました。
次回、dockerを実際に動作させてみて、各種コマンドを実行した際に何が起こるのかを説明していきます。
参考
Discussion