Ubuntu 22.04にDockerをインストールして使用する方法

紹介

Dockerは、コンテナでアプリケーションプロセスを管理するプロセスを簡素化するアプリケーションです。コンテナを使用すると、アプリケーションをリソースを隔離したプロセスで実行できます。これらは仮想マシンに似ていますが、コンテナはより移植性が高く、リソースを効率的に利用し、ホストオペレーティングシステムに依存しています。

Dockerコンテナのさまざまなコンポーネントの詳細な紹介については、 Dockerエコシステム:一般的なコンポーネントの紹介をご覧ください。

このチュートリアルでは、Ubuntu 22.04にDocker Community Edition(CE)をインストールして使用します。 Docker自体をインストールし、コンテナとイメージを操作し、Dockerリポジトリにイメージをプッシュします。

DigitalOcean App Platformを使用してアプリケーションのデプロイを簡素化します。数分でGitHubから直接デプロイします。

前提条件

このチュートリアルに従うには、次のものが必要です:

  • Ubuntu 22.04のサーバーは、Ubuntu 22.04の初期サーバーセットアップガイドに従ってセットアップされています。このセットアップには、sudorootユーザーとファイアウォールが含まれています。
  • Docker Hubのアカウントがある場合は、独自のイメージを作成してDocker Hubにプッシュすることもできます(手順7と8を参照)。

ステップ1 — Dockerのインストール

公式のUbuntuリポジトリにあるDockerインストールパッケージは、最新バージョンでない場合があります。最新バージョンを取得するために、公式のDockerリポジトリからDockerをインストールします。これには、新しいパッケージソースを追加し、DockerのGPGキーをシステムに追加してダウンロードが正当であることを確認し、その後パッケージをインストールします。

まず、既存のパッケージリストを更新します:

  1. sudo apt update

次に、aptがHTTPS経由でパッケージを使用できるようにするいくつかの必要なパッケージをインストールします:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

次に、公式のDockerリポジトリのGPGキーをシステムに追加します:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

APTソースにDockerリポジトリを追加します:

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

追加されたことが認識されるように、再度既存のパッケージリストを更新します:

  1. sudo apt update

デフォルトのUbuntuリポジトリではなく、Dockerリポジトリからインストールすることを確認します:

  1. apt-cache policy docker-ce

バージョン番号は異なる場合がありますが、次のような出力が表示されます:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

docker-ceがインストールされていないことに注意してくださいが、インストール候補はUbuntu 22.04のDockerリポジトリ(jammy)からです。

最後に、Dockerをインストールします:

  1. sudo apt install docker-ce

これでDockerがインストールされ、デーモンが起動し、プロセスが起動時に有効になりました。それが実行されているかどうかを確認してください:

  1. sudo systemctl status docker

出力は以下のようになり、サービスがアクティブで実行されていることが示されます:

Output
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7854 (dockerd) Tasks: 7 Memory: 38.3M CPU: 340ms CGroup: /system.slice/docker.service └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

今、Dockerをインストールすると、Dockerサービス(デーモン)だけでなく、dockerコマンドラインユーティリティ、またはDockerクライアントも提供されます。後でこのチュートリアルでdockerコマンドの使用方法を探ります。

ステップ2 — sudoなしでDockerコマンドを実行する(オプション)

デフォルトでは、dockerコマンドはrootユーザーまたはDockerのインストールプロセス中に自動的に作成されるdockerグループに所属するユーザーによってのみ実行できます。 sudoを接頭辞として付けずにdockerコマンドを実行しようとすると、次のような出力が得られます:

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.

dockerコマンドを実行するときにいつもsudoを入力したくない場合は、ユーザー名をdockerグループに追加してください:

  1. sudo usermod -aG docker ${USER}

新しいグループメンバーシップを適用するには、サーバーからログアウトして再ログインするか、次のように入力します:

  1. su - ${USER}

続行するにはユーザーのパスワードを入力してください。

ユーザーがdockerグループに追加されたことを確認するには、次のように入力してください:

  1. groups
Output
sammy sudo docker

ログインしていないdockerグループにユーザーを追加する必要がある場合は、次のように明示的にそのユーザー名を宣言してください:

  1. sudo usermod -aG docker username

この記事の残りの部分では、dockerグループのユーザーとしてdockerコマンドを実行していると想定しています。それを選択しない場合は、コマンドの前にsudoを付けてください。

次にdockerコマンドを探索しましょう。

ステップ 3 — Docker コマンドの使用

dockerを使用するには、オプションとコマンドのチェーンに続いて引数を渡す必要があります。構文は次のようになります:

  1. docker [option] [command] [arguments]

すべての利用可能なサブコマンドを表示するには、次のように入力してください:

  1. docker

Docker バージョン 20.10.14の現在の完全な利用可能なサブコマンドリストは次のとおりです:

Output
attach Attach local standard input, output, and error streams 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 to files or directories 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 Docker objects kill Kill one or more running containers 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 pause Pause all processes within one or more containers 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 one or more containers 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 (streamed to STDOUT by default) 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 one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes

特定のコマンドで利用可能なオプションを表示するには、次のように入力してください:

  1. docker docker-subcommand --help

Docker のシステム全体の情報を表示するには、次を使用してください:

  1. docker info

これらのコマンドのいくつかを探索しましょう。まず、イメージを扱う作業から始めます。

ステップ4 — Dockerイメージの操作

DockerコンテナはDockerイメージから構築されます。デフォルトでは、DockerはこれらのイメージをDockerプロジェクトの背後にある会社であるDockerが管理するDockerレジストリから取得します。誰でも自分のDockerイメージをDocker Hubにホストできるため、ほとんどのアプリケーションや必要なLinuxディストリビューションはそこにホストされています。

Docker Hubからイメージをアクセスしてダウンロードできるかどうかを確認するには、次のように入力します:

  1. docker run hello-world

出力は、Dockerが正しく動作していることを示します:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

Dockerは最初にhello-worldイメージをローカルで見つけられなかったため、デフォルトのリポジトリであるDocker Hubからイメージをダウンロードしました。イメージがダウンロードされると、Dockerはそのイメージからコンテナを作成し、コンテナ内のアプリケーションが実行され、メッセージが表示されました。

Docker Hubで利用可能なイメージを検索するには、dockerコマンドをsearchサブコマンドとともに使用します。たとえば、Ubuntuイメージを検索するには、次のように入力します:

  1. docker search ubuntu

スクリプトはDocker Hubをクロールし、検索文字列と一致するすべてのイメージのリストを返します。この場合、出力は次のようになります:

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK] websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK] ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK] neurodebian NeuroDebian provides neuroscience research s… 88 [OK] open-liberty Open Liberty multi-architecture images based… 51 [OK] ...

公式の列では、OKはプロジェクトの背後にある企業が構築およびサポートするイメージを示します。使用したいイメージを特定したら、pullサブコマンドを使用してコンピュータにダウンロードできます。

次のコマンドを実行して、公式のubuntuイメージをコンピュータにダウンロードします:

  1. docker pull ubuntu

以下の出力が表示されます:

Output
Using default tag: latest latest: Pulling from library/ubuntu e0b25ef51634: Pull complete Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

イメージがダウンロードされた後、ダウンロードしたイメージを使用してコンテナを実行できます。 hello-worldの例で見たように、dockerrunサブコマンドで実行されるときにイメージがダウンロードされていない場合、Dockerクライアントはまずイメージをダウンロードし、それを使用してコンテナを実行します。

コンピュータにダウンロードされたイメージを表示するには、次のように入力します:

  1. docker images

出力は次のようになります:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB

このチュートリアルの後半で説明するように、コンテナを実行するために使用するイメージは変更して新しいイメージを生成し、その後、Docker Hubや他のDockerレジストリにアップロード(プッシュというのが専門用語です)できます。

では、コンテナを実行する方法を詳しく見てみましょう。

ステップ5 — Dockerコンテナの実行

前のステップで実行したhello-worldコンテナは、テストメッセージを出力した後に実行して終了するコンテナの例です。コンテナはそれ以上のものになります。それらはインタラクティブになることができます。結局のところ、それらは仮想マシンと似ていますが、リソースをより効率的に利用します。

例として、最新のUbuntuイメージを使用してコンテナを実行してみましょう。-iおよび-tスイッチの組み合わせにより、コンテナ内の対話型シェルアクセスが可能になります。

  1. docker run -it ubuntu

コマンドプロンプトは、今やコンテナ内で作業していることを反映するように変更され、次のようになります:

Output
root@d9b100f2f636:/#

コマンドプロンプトには、コンテナIDが表示されます。この例では、d9b100f2f636です。後でコンテナを削除する際には、このコンテナIDが必要になります。

今、コンテナ内で任意のコマンドを実行できます。例えば、コンテナ内のパッケージデータベースを更新してみましょう。コマンドの先頭にsudoを付ける必要はありません。なぜなら、rootユーザーとしてコンテナ内で操作しているからです。

  1. apt update

次に、その中に任意のアプリケーションをインストールします。Node.jsをインストールしましょう。

  1. apt install nodejs

これにより、公式UbuntuリポジトリからNode.jsがコンテナにインストールされます。インストールが完了したら、Node.jsがインストールされていることを確認してください。

  1. node -v

ターミナルにバージョン番号が表示されます:

Output
v12.22.9

コンテナ内で行った変更は、そのコンテナにのみ適用されます。

コンテナを終了するには、プロンプトでexitと入力します。

次に、システム上のコンテナの管理方法を見てみましょう。

ステップ6 — Dockerコンテナの管理

しばらくDockerを使用すると、コンピューター上に多くのアクティブ(実行中)および非アクティブなコンテナがあります。アクティブなものを表示するには、次を使用します:アクティブなもの、使用します:

  1. docker ps

次のような出力が表示されます:

Output
CONTAINER ID IMAGE COMMAND CREATED

このチュートリアルでは、hello-worldイメージから1つ、およびubuntuイメージからもう1つのコンテナを起動しました。どちらのコンテナも実行されていませんが、まだシステムに存在しています。

すべてのコンテナ(アクティブおよび非アクティブ)を表示するには、docker ps-aスイッチを付けて実行します:

  1. docker ps -a

次のような出力が表示されます:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig 587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski

最後に作成したコンテナを表示するには、-lスイッチを渡します:

  1. docker ps -l
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig

停止しているコンテナを開始するには、docker startを使用して、コンテナIDまたはコンテナの名前を指定します。UbuntuベースのコンテナのIDである1c08a7a0d0e4を使用してみましょう:

  1. docker start 1c08a7a0d0e4

コンテナが開始され、そのステータスを確認するにはdocker psを使用できます:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig

実行中のコンテナを停止するには、docker stopを使用して、コンテナのIDまたは名前を指定します。今回は、Dockerが割り当てたコンテナの名前であるdazzling_taussigを使用します:

  1. docker stop dazzling_taussig

docker rmコマンドを使用して、コンテナをもう必要ないと判断した場合は、コンテナIDまたは名前を使用してそれを削除します。 docker ps -aコマンドを使用して、hello-worldイメージに関連するコンテナのコンテナIDまたは名前を見つけて削除します。

  1. docker rm adoring_kowalevski

新しいコンテナを開始し、--nameスイッチを使用して名前を付けることができます。 --rmスイッチを使用して、停止時に自動的に削除されるコンテナを作成することもできます。これらのオプションやその他の情報については、docker run helpコマンドを参照してください。

コンテナは、新しいコンテナを構築するために使用できるイメージに変換できます。その動作方法を見てみましょう。

ステップ7 — コンテナでの変更をDockerイメージにコミットする

Dockerイメージを起動すると、仮想マシンと同様にファイルを作成、変更、削除することができます。行った変更はそのコンテナにのみ適用されます。それを開始して停止することができますが、docker rmコマンドで破棄すると、変更は永久に失われます。

このセクションでは、コンテナの状態を新しいDockerイメージとして保存する方法を示します。

Node.jsをUbuntuコンテナ内にインストールした後、イメージからコンテナを実行していますが、コンテナは作成時に使用したイメージとは異なります。ただし、このNode.jsコンテナを将来の新しいイメージの基盤として再利用したい場合があります。

次のコマンドを使用して、変更内容を新しいDockerイメージインスタンスにコミットします。

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

-mスイッチは、変更内容を説明するためのコミットメッセージに使用され、-aは著者を指定するために使用されます。container_idは、以前にDockerセッションを開始した際にチュートリアルでメモしたものです。Docker Hubで追加のリポジトリを作成していない限り、repositoryは通常、Docker Hubのユーザー名です。

たとえば、ユーザーsammy、コンテナIDがd9b100f2f636の場合、コマンドは次のようになります:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

イメージをコミットすると、新しいイメージがローカルに保存されます。このチュートリアルの後半では、他の人がアクセスできるようにイメージをDocker HubなどのDockerレジストリにプッシュする方法について学びます。

再度Dockerイメージをリストアップすると、新しいイメージと、それが派生した古いイメージが表示されます:

  1. docker images

次のような出力が表示されます:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...

この例では、ubuntu-nodejsが新しいイメージであり、Docker Hubの既存のubuntuイメージから派生しています。サイズの差異は行われた変更を反映しています。この例では、Node.jsがインストールされたことが変更内容です。したがって、次回UbuntuにNode.jsが事前にインストールされたコンテナを実行する必要がある場合は、新しいイメージを使用できます。

Dockerfileからもイメージを構築できます。これにより、新しいイメージにソフトウェアのインストールを自動化できます。ただし、これはこのチュートリアルの範囲外です。

さて、他の人と新しいイメージを共有して、彼らがそれからコンテナを作成できるようにしましょう。

ステップ8 — DockerイメージをDockerリポジトリにプッシュする

既存のイメージから新しいイメージを作成した後の次の論理的なステップは、それを一部の友人、Docker Hubの世界全体、またはアクセス権がある他のDockerレジストリと共有することです。Docker Hubまたは他のDockerレジストリにイメージをプッシュするには、そこでアカウントを持っている必要があります。

イメージをプッシュするには、まずDocker Hubにログインします。

  1. docker login -u docker-registry-username

Docker Hubパスワードを使用して認証するように求められます。正しいパスワードを指定した場合、認証が成功します。

注意: Dockerレジストリのユーザー名がイメージを作成するために使用したローカルユーザー名と異なる場合は、イメージにレジストリのユーザー名をタグ付けする必要があります。前のステップで示された例では、次のように入力します。

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

その後、次のコマンドを使用して独自のイメージをプッシュできます。

  1. docker push docker-registry-username/docker-image-name

ubuntu-nodejs イメージを sammy リポジトリにプッシュする場合、コマンドは次のようになります。

  1. docker push sammy/ubuntu-nodejs

このプロセスは、イメージをアップロードするために時間がかかる場合がありますが、完了すると出力は次のようになります:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...

イメージをレジストリにプッシュした後、それはアカウントのダッシュボードにリストされる必要があります。以下の画像に示すように。

プッシュの試行がこのようなエラーで終了した場合、おそらくログインしていませんでした:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required

docker loginを使用してログインし、プッシュの試行を繰り返してください。その後、Docker Hub リポジトリページ上に存在することを確認してください。

これで、新しいマシンにイメージをプルし、新しいコンテナを実行するために使用できます。docker pull sammy/ubuntu-nodejs

結論

このチュートリアルでは、Docker をインストールし、イメージとコンテナを操作し、変更したイメージを Docker Hub にプッシュしました。これで基本を理解したので、DigitalOcean Community で他の Docker チュートリアルを探索してください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04