ロッキーリナックス8にDockerをインストールして使用する方法
はじめに
Dockerは、仮想マシンのようなものであるコンテナにアプリケーションプロセスを簡単かつ容易に実行するアプリケーションです。コンテナは仮想マシンよりもポータブルで、リソースを節約し、ホストオペレーティングシステムに依存します。Dockerコンテナの異なるコンポーネントについて詳しくは、「The Docker Ecosystem: An Introduction to Common Components」をご覧ください。
このチュートリアルでは、Rocky Linux 8 の既存のインストールに対してインストール方法と使用方法を学びます。
前提条件 (ぜんていじょうけん)
- A Rocky Linux 8 server with a non-root user with sudo privileges set up using Initial Setup Guide for Rocky Linux 8 explains how to set this up.
このチュートリアルにおいては、全てのコマンドはrootユーザーではない非rootユーザーとして実行する必要があります。もしコマンドにrootアクセスが必要な場合は、その前にsudoが付いています。Rocky Linux 8の初期設定ガイドでは、ユーザーの追加やsudoアクセスの設定方法が説明されています。
ステップ1 — Dockerのインストール
公式のRocky Linux 8リポジトリには利用可能なDockerインストールパッケージが最新のバージョンであるとは限りません。最新かつ最高のバージョンを入手するには、公式のDockerリポジトリからDockerをインストールしてください。このセクションでは、その方法を説明します。
しかし、まずはパッケージデータベースを更新しましょう。
- sudo dnf check-update
次に、公式のDockerリポジトリを追加してください。
- sudo dnf config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
DockerにはRocky Linux固有のリポジトリはありませんが、Rocky LinuxはCentOSをベースにしているため、同じリポジトリを使用することができます。リポジトリを追加した後、Dockerをインストールします。Dockerは3つのパッケージで構成されています。
- sudo dnf install docker-ce docker-ce-cli containerd.io
インストールが完了した後、Dockerデーモンを起動してください。
- sudo systemctl start docker
動いていることを確認してください。
- sudo systemctl status docker
次のように、出力は次のようになることを示している必要があります。サービスがアクティブで実行されていることを示しています。
● docker.service – Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago Docs: https://docs.docker.com Main PID: 749 (docker)
最後に、サーバーの再起動時に必ず開始するようにしてください。
- sudo systemctl enable docker
今、Dockerをインストールすると、Dockerサービス(デーモン)だけでなく、dockerコマンドラインユーティリティまたはDockerクライアントも提供されます。このチュートリアルの後半で、dockerコマンドの使い方について説明します。
ステップ2 — Dockerコマンドをsudoなしで実行する(オプション)
デフォルトでは、dockerコマンドの実行にはルート権限が必要です。つまり、コマンドの前にsudoをつける必要があります。また、Dockerのインストール中に自動的に作成されるdockerグループのユーザーでも実行することができます。sudoをつけずにdockerコマンドを実行しようとするか、dockerグループに所属していない場合は、次のような出力が表示されます。
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See ‘docker run –help’.
dockerコマンドを実行する際に、毎回sudoを入力したくない場合は、ユーザー名をdockerグループに追加してください。
- sudo usermod -aG docker $(whoami)
この変更を有効にするために、vServerからログアウトして同じユーザーとして再度ログインする必要があります。
もしdockerグループにログインしていないユーザーを追加する必要がある場合は、そのユーザー名を明示的に宣言してください。
- sudo usermod -aG docker username
この記事の残りは、あなたがdockerコマンドをdockerユーザーグループのユーザーとして実行している場合を前提としています。もしそうでない場合は、コマンドの前にsudoを先頭に追加してください。
ステップ3 – Dockerコマンドの使用
Dockerがインストールされていて動作している場合は、コマンドラインユーティリティに慣れる時が来ました。Dockerの使用は、オプションとサブコマンド、そして引数を渡すことで構成されます。この構文は次のようになります。
- docker [option] [command] [arguments]
利用可能なすべてのサブコマンドを表示するには、次のように入力します:
- docker
Docker 1.11.1以降、利用可能なサブコマンドの完全なリストは以下の通りです。
attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container’s changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container’s filesystem events Get real time events from the server exec Run a command in a running container export Export a container’s filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container network Manage Docker networks pause Pause all processes within a container port List port mappings or a specific mapping for the CONTAINER ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop a running container tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within a container update Update configuration of one or more containers version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code
特定のコマンドで利用可能なスイッチを表示するには、次のように入力してください:
- docker docker-subcommand –help
システム全体の情報を表示するには、以下を使用してください。
- docker info
ステップ4 — Dockerイメージの操作
DockerコンテナはDockerイメージから実行されます。デフォルトでは、これらのイメージはDockerプロジェクトの運営会社であるDockerが管理するDocker Hubから取得されます。誰でもDocker Hubに自分のDockerイメージをビルドしてホストすることができるため、多くのアプリケーションやLinuxディストリビューションで必要なDockerコンテナのイメージはDocker Hubにホストされています。
Docker Hubからイメージにアクセスしてダウンロードできるかを確認するために、以下を入力してください。
- docker run hello-world
以下の要素を含む出力が、Dockerが正しく動作していることを示す必要があります。
Hello from Docker. This message shows that your installation appears to be working correctly. …
Docker Hubで利用可能な画像を検索するには、searchサブコマンドを使用してdockerコマンドを実行することができます。例えば、Rocky Linuxの画像を検索する場合は、次のように入力してください。
- docker search rockylinux
スクリプトはDocker Hubをクロールし、検索文字列と一致する全てのイメージのリストを返します。この場合、出力は以下のようになります。
NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 2224 [OK] jdeathe/centos-ssh CentOS-6 6.7 x86_64 / CentOS-7 7.2.1511 x8… 22 [OK] jdeathe/centos-ssh-apache-php CentOS-6 6.7 x86_64 / Apache / PHP / PHP M… 17 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h… 11 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif… 10 [OK] torusware/speedus-centos Always updated official CentOS docker imag… 8 [OK] nickistre/centos-lamp LAMP on centos setup 3 [OK] …
公式の欄では、OKはそのプロジェクトの背後にある企業が作成しサポートしているイメージを示しています。使用したいイメージを特定したら、次のようにプルサブコマンドを使用してコンピュータにダウンロードすることができます。
- docker pull rockylinux
イメージのダウンロードが完了した後、ダウンロードしたイメージを使用してコンテナを実行できます。Dockerがrunサブコマンドで実行される際にイメージがダウンロードされていない場合、Dockerクライアントはまずイメージをダウンロードしてからコンテナを実行します。
- docker run rockylinux
コンピュータにダウンロードされた画像を確認するには、以下を入力してください。
- docker images
出力結果は以下のようになります:
[secondary_lable Output]
REPOSITORY TAG IMAGE ID CREATED SIZE
rockylinux latest 778a53015523 5 weeks ago 196.7 MB
hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
このチュートリアルの後で説明する通り、コンテナの実行に使用する画像は変更でき、新しい画像を生成するために使用することができます。そして、それらはDocker Hubや他のDockerレジストリにアップロード(技術的にはプッシュと呼ばれます)することができます。
ステップ5 – Dockerコンテナを実行する
前のステップで実行したハローワールドコンテナは、テストメッセージを出力した後に終了するコンテナの例です。ただし、コンテナはそれ以上の用途があり、インタラクティブに使用することもできます。なぜなら、コンテナは仮想マシンに似ていますが、よりリソースを効率的に利用できるからです。
例えば、Rocky Linuxの最新のイメージを使用してコンテナを実行しましょう。-iと-tのオプションの組み合わせにより、コンテナ内に対話的なシェルアクセスが可能になります。
- docker run -it rockylinux
コマンドプロンプトは、コンテナ内で作業していることを反映するように変更され、次の形式を取る必要があります。
[root@59839a1b7de2 /]#
重要:コマンドプロンプトでコンテナーIDを注意してください。上記の例では、それは59839a1b7de2です。
今、コンテナ内で任意のコマンドを実行できます。例えば、実行中のコンテナにMariaDBサーバーをインストールしましょう。sudoを付ける必要はありません。コンテナ内でroot権限で操作しているためです。
- dnf install mariadb-server
ステップ6 — コンテナ内の変更をDockerイメージにコミットする
Dockerイメージを起動すると、仮想マシンのようにファイルの作成、変更、削除が行えます。行った変更はそのコンテナにのみ適用されます。コンテナを開始・停止することができますが、docker rmコマンドで破棄すると変更は完全に失われます。
このセクションでは、コンテナの状態を新しいDockerイメージとして保存する方法について説明します。
Rocky Linuxのコンテナ内にMariaDBサーバーをインストールした後、イメージから起動しているコンテナがありますが、コンテナは作成時に使用したイメージとは異なっています。
コンテナの状態を新しいイメージとして保存するには、まずそれから終了してください。
- exit
次のコマンドを使用して、変更内容を新しいDockerイメージインスタンスにコミットしてください。-mスイッチは、変更内容を知るためのコミットメッセージです。-aは、作成者を指定するために使用されます。コンテナIDは、チュートリアルのインタラクティブなDockerセッションを開始した際にメモしたものです。Docker Hubで追加のリポジトリを作成していない限り、リポジトリは通常、Docker Hubのユーザー名です。
- docker commit -m “What did you do to the image” -a “Author Name” container-id repository/new_image_name
たとえば:
- docker commit -m “added mariadb-server” -a “Sunday Ogwu-Chinuwa” 59839a1b7de2 sammy/rockylinux-mariadb
Note
その操作が完了した後、コンピュータ上でDockerイメージをリストアップすると、新しいイメージとそれを派生させた古いイメージが表示されるはずです。
- docker images
以下の文章を日本語で自然に言い換えてください。1つのオプションで結構です:
出力は次のような形式であるべきです。
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/rockylinux-mariadb latest 23390430ec73 6 seconds ago 424.6 MB rockylinux latest 778a53015523 5 weeks ago 196.7 MB hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
上記の例では、rockylinux-mariadbはDocker Hubの既存のRocky Linuxイメージから派生した新しいイメージです。サイズの違いは、行われた変更を反映しています。そして、この例では、変更はMariaDBサーバーのインストールでした。したがって、Rocky LinuxにMariaDBサーバーが事前にインストールされたコンテナを実行する必要がある場合は、新しいイメージを使用するだけで済みます。イメージはまた、Dockerfileと呼ばれるものから作成することもできます。ただし、それはこの記事の範囲を超える非常に手間のかかるプロセスです。それについては、将来の記事で探求します。
ステップ7 — Dockerコンテナの一覧表示
一定期間Dockerを使用していると、コンピュータ上には多くのアクティブ(実行中)および非アクティブなコンテナがあります。アクティブなコンテナを表示するには、次を使用してください:
- docker ps
以下のような出力が表示されます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f7c79cc556dd rockylinux “/bin/bash” 3 hours ago Up 3 hours silly_spence
すべてのコンテナー(アクティブと非アクティブ)を表示するには、-aスイッチを使ってください。
- docker ps -a
最新のコンテナを表示するには、-lスイッチを渡してください。
- docker ps -l
実行中のコンテナを停止するのは、単に入力するだけです。
- docker stop container-id
docker ps コマンドの出力から、コンテナIDを見つけることができます。
ステップ8 – DockerイメージをDockerリポジトリにアップロードする
既存の画像から新しい画像を作成した後の次の論理的なステップは、それを数人の友人やDocker Hub上の全世界、またはアクセス権のある他のDockerレジストリと共有することです。Docker Hubや他のDockerレジストリに画像をプッシュするためには、そこにアカウントを持っている必要があります。
このセクションでは、DockerイメージをDocker Hubにプッシュする方法を紹介します。
Docker Hubでアカウントを作成するためには、まずDocker Hubで登録してください。その後、イメージをプッシュするためには、まずDocker Hubにログインしてください。認証を求められます。
- docker login -u docker-registry-username
正しいパスワードを指定した場合、認証は成功するはずです。その後、次のコマンドを使用して、自分のイメージをプッシュすることができます。
- docker push docker-registry-username/docker-image-name
完了するには時間がかかりますが、完了した時には、このような結果が出力されます。
The push refers to a repository [docker.io/sammy/rockylinux-mariadb] 670194edfaf5: Pushed 5f70bf18a086: Mounted from library/rockylinux 6a6c96337be1: Mounted from library/rockylinux …
イメージをレジストリにプッシュした後、それはアカウントのダッシュボードにリストされるべきです。その画像の下に表示されるようになります。
もしプッシュの試みがこのようなエラーになった場合、おそらくログインしていない可能性があります。
The push refers to a repository [docker.io/sammy/rockylinux-mariadb] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required
ログインして、その後プッシュの試みを繰り返してください。
結論
この記事には言及されていないDockerの要点がたくさんありますが、Rocky Linux 8での作業を始めるにはこれだけで十分です。Dockerはほとんどのオープンソースプロジェクト同様、急速に開発が進んでいるため、最新情報を確認するためにプロジェクトのブログページを定期的に訪れることを習慣にしましょう。
DO Community内の他のDockerチュートリアルもぜひチェックしてください。