UbuntuでDockerをマスターする:現実世界の展開ガイド

DockerをUbuntuにインストールする方法についての情報をお探しの場合、正しい場所にいます。さらに、このチュートリアルでは、基本的なDockerコマンドを実行してコンテナを実行および管理する方法も学びます。

便利なVisual Studio(VS)Codeの機能を使用して、SSHのスキルを向上させる方法も学びます。さあ、始めましょう!

関連記事: リモートSSHでのLinuxの世界でのWindowsユーザー:VS Codeと

前提条件

このチュートリアルにステップバイステップで従いたい場合、次のものを準備してください:

  • A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
  • A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
  • Ubuntu Server LTSインストールにVSCode公式SSH拡張機能をインストールし、接続する

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

まず、UbuntuにDockerをインストールすることから始めましょう。この時点では、SSHを介してUbuntuサーバーに接続されたローカルのWindowsコンピューターでVS Codeを開いていると仮定しています。VS CodeとSSHの使用方法については、最新の記事をご覧ください

以下の例では、VSCodeがホームフォルダ(この場合、/home/homelab)をワークスペースとして開いたまま、Ubuntuにリモートで接続されています。

VSCode when SSHed into a Ubuntu Machine

DockerをUbuntu Serverにインストールする実際のプロセスは2つのコマンドで完了します。 Ubuntuは、Ubuntuに付属するデフォルトのパッケージマネージャであるaptでDockerを利用できるようにしています。

VS CodeのSSHターミナルウィンドウで、次の2つのコマンドを実行してDockerをインストールします:

sudo apt update -y
sudo apt install docker.io -y

Ubuntu Serverのインストール中に、Dockerをsnapとしてインストールするオプションが表示された場合は、まずsnapパッケージを削除するためにsudo snap remove dockerを実行してください。

以下のアニメーションでDockerのインストールを確認できます:

The Installation Process for Docker on Ubuntu

Ubuntuは自動的にサービスを有効にし、起動時に設定するので、Dockerの使用準備が整いました!

UbuntuでDockerコンテナを作成して実行する

Dockerがインストールされたので、それを使って何ができるのでしょうか?まず、Dockerコンテナの作成から始めましょう。このチュートリアルでは、Dockerコンテナの良い例として静的なWebサーバーを設定します。このセクションでは、次の作業を行います:

  • Docker Hubイメージリポジトリから新しいコンテナをセットアップしてHTTPサービスを実行する
  • ポートマッピングを使用してコンテナ内のHTTPポートをUbuntuホストにマッピングする
  • バインドマウントを使用してコンテナ内から重要なデータをUbuntuホストにマッピングする
  • コンテナの再起動時の永続性を設定します。

上記の手順のいずれかがわかりにくい場合は心配しないでください。各ステップを1つずつ説明して、プロセスを理解するのに役立ちます。

Dockerイメージのダウンロード

最初に考えるべき質問は、このコンテナはどこから来るのかということです。Docker Hubを見てみましょう。

A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.

A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.

このファイルシステムのキャプチャにより、Dockerは非常に人気があります。ソフトウェアだけでなく、完全なオペレーティング環境もキャプチャされます。これにより、サーバー環境の違いによって導入される問題がなくなります。

最も人気のあるリポジトリ(およびデフォルト)は、Docker Hubとしても知られる公式のDockerリポジトリです。イメージリポジトリでは、数千の事前作成されたDockerイメージをダウンロードしてコンテナとして実行することができます。

このチュートリアルでは、静的ウェブサーバーを設定するため、ウェブサーバーのイメージをダウンロードする必要があります。最も人気のあるウェブサーバーは、Apache httpdNginxですが、少し変わったウェブサーバーを使って新しいものに触れてみましょう。それがCaddyと呼ばれるものです。

Caddyはシンプルさで知られるウェブサーバーです。1行のファイルで多くの有効なサーバー設定をデプロイできます。シンプルさは良いことであり、また良い基本の例にもなります。

  1. まず、Dockerイメージを見つける必要があります。Windowsマシンで、https://hub.docker.comに移動します。
  2. ページの左上隅にある検索ボックスでを検索します。以下のようなページが表示されるはずです:
Searching for caddy on the Docker Hub

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.

信頼できるソースからイメージを選択するように注意する必要があります。誰でもイメージにマルウェアを配置し、それをDocker Hubにアップロードできます。

3. イメージの名前をメモしてください。上記のスクリーンショットでは、名前はです。次のステップでイメージ名を指定するためにこの名前が必要です。

UbuntuでDockerを使用してコンテナを実行する

ダウンロードしたいイメージの名前がわかったら、それをダウンロードしてコンテナを作成する時が来ました。

イメージからコンテナを起動するには、1つのコマンドが必要です。Ubuntu Serverに接続されたSSHターミナルで、以下のdocker runコマンドを実行します。

以下のコマンドは、ローカルマシン上でイメージをチェックします。存在しない場合は、Docker Hubからイメージをダウンロードし、コンテナを作成して起動します。以下のコマンドは、-pスイッチを使用してUbuntu Serverのリッスンポート80をコンテナのポート80にマッピングしています。この機能はポートマッピングと呼ばれます。

sudo docker run -p 80:80 caddy

ほとんどのDocker Hubイメージは、/という命名規則に従います。ただし、Dockerによって「公式」とブランド化されたイメージには、前にが付いていません(上記ののようなイメージ)。

上記のコマンドを実行すると、以下のように出力されます。ログ情報が直接ターミナルに表示されます:

Running the Caddy Docker container

ほとんどのDockerコマンドは、sudoを前置することで、コマンドを管理者として実行するためです。デフォルトでは、Dockerサービスはrootとして実行され、コンテナやイメージへの変更は管理者として行う必要があります。

以上で、インストールが完了し実行できる状態になりました。UbuntuにDockerをインストールしてよかったですね。

今、Windowsコンピュータでhttp://<your-ip>に移動すると、Caddyのランディングページが表示されるはずです。以下で確認できます(このガイドのIPはhttp://homelab-dockerに置き換えられています):

The default landing page for Caddy

現在コンテナは実行中ですが、問題があることに気づいたかもしれません。そのdockerコマンドを実行すると、コマンドラインが使用できなくなります。他のコマンドを実行することはできず、セッションが終了すると実行中のコンテナも停止します。この問題を解決するために、コンテナをバックグラウンドで実行する方法(デタッチ)を見ていきましょう。

バックグラウンドでDockerコンテナを実行する

現在実行中のコンテナがありますが、コマンドラインが使用できなくなっています。他のことはできません。サービスのようにバックグラウンドでコンテナを起動するためのより良い方法が必要です。それをするには:

  1. コマンドラインでcontrol+cを押して、現在のコンテナを停止します。これにより、コマンドラインが再度使用できるようになります。
  2. 今度は、前回と同じコマンドを実行し、-dパラメータを指定します。以下のように表示されます。DockerはコンテナIDを返し、コマンドラインを返します。
sudo docker run -d -p 80:80 caddy
Running a detached container

Dockerコマンドを使用してバックグラウンドコンテナを管理する

バックグラウンドで実行されている1つ以上のDockerを管理する必要があります。Dockerは、docker containerコマンドを使用してそれを行うためのいくつかの異なるコマンドを提供しています。

  • sudo docker container list -a:すべてのコンテナ(実行中および停止中)とその状態をリストアップします。
  • sudo docker container stop <name>:名前(またはID)によってDockerコンテナを停止します。
  • sudo docker container start <name>:名前(またはID)によってDockerコンテナを開始します。
  • sudo docker container prune:すべての停止したコンテナを破棄して削除します。

上記のすべてのコマンドは、以下のスクリーンショットでコンテキストで使用されているのがわかります:

Managing detached containers using docker container commands

サーバー上のコンテナを表示、変更、検査、またはリモートで操作するための他の多くのdocker containerコマンドがあります。すべてを表示するには、sudo docker container --helpを実行してください。

バックグラウンドで実行されるコンテナにWebサーバーをデプロイしたにもかかわらず、カスタムコンテンツをホストする方法はまだありません。現状では、Caddyはデフォルトのウェブページを提供しています。

Dockerイメージを使用して、意味のあるデータを持つコンテナを展開するために、バインドマウントという概念を使用する方法を見てみましょう。

バインドマウントを使用したコンテナデータの保存

Dockerは、イメージ(および生成されるコンテナ)を使い捨てまたは一時的なものとして機能します。Caddyソフトウェアの更新がある場合、サービスを更新するのではなく、完全に新しいイメージをゼロから使用します。

このようにコンテナを廃棄して再作成する利点は非常に大きいです。ソフトウェアの不安定性は、(潜在的に)数年前のソフトウェアを継続的に更新することで徐々に導入されます。 Dockerは、毎回新しいイメージを使用することで、安定した、信頼性のある(おそらく)テスト済みのベースを提供します。

この概念は、Windowsのアプリケーションソフトウェアを更新するたびに新しいWindowsのインストールを使用することに相当します。Windowsでは楽しいアイデアではありませんが、Dockerでは非常に適用可能です。

ただし、使い捨ての方法論には明確な問題があります。現在のサービスが廃棄されたときに重要なデータが削除されることは望ましくありません。 Dockerは、バインドマウントという概念を使用してこの問題を解決します。

では、コンテナのバインドマウントの作成方法を探ってみましょう。

フォルダ構造の作成とクリーンアップ

バインドマウントを使用する前に、このデータを保存する場所を作成する必要があります。このチュートリアルでは、ホームディレクトリにフォルダを作成します。これを行うには、VS CodeでUbuntu Serverに接続したままで行います。

  1. VS Codeのエクスプローラパネルの空白の領域で右クリックし、「新しいフォルダー」を選択します。

2. 新しいフォルダーの名前をcontainers/caddy/filesにします。

フォルダーの名前は自由ですが、次のdockerコマンドで正しく定義されている必要があります。VS Codeはスラッシュを使用してこれを3つのフォルダーの作成と解釈します。フォルダーfilesはフォルダーcaddyのサブディレクトリであり、caddycontainersのサブディレクトリです。このフォルダー構造を使用する必要はありませんが、同じサーバー上に複数のコンテナがある場合にはより意味がある構造です。

以前に作成したコンテナがある場合は、次のコマンドで停止して削除します:

# 現在実行中のすべてのコンテナを停止して削除します。
# $(sudo docker ps -q)は現在実行中のすべてのコンテナのIDを動的に取得します
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

以下のスクリーンショットでこのコマンドを確認できます:

Using the VSCode Explorer Window

Caddyコンテナのバインドマウントでの展開

Ubuntuサーバー上にフォルダー構造が作成されました。バインドマウントを使用してCaddyコンテナを作成する時が来ました。

  1. さらに進む前に、作業しているコンテナが永続データを保存している場所を確認してください。これは、誰がDockerイメージを作成し、それがどのような目的で使用されるかによって異なります。

永続データが保存されている場所を見つけるための最良のオプションは、質問のDocker Hubのイメージ内のドキュメントを確認することです。Caddyのドキュメントはこちらで見つけることができます:

The Caddy documentation on Docker Hub

2. 以下のコマンドを使用してコンテナを起動します。パラメータ-v ~/containers/caddy/files:/usr/share/caddyは、コロン(~/containers/caddy/files)の前のパスをコンテナ内のフォルダ(/usr/share/caddy)にマッピングしています。これはポートマッピングコマンドと非常に似ていますが、ポートではなくフォルダをマッピングしています。このタイプのコマンドはバインドマウントと呼ばれます。

# ホストのフォルダ(コロンの前のパス)を
# コンテナ内の/usr/share/caddyにバインド
sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

上記のコードのチルダ(~)はホームフォルダを指します。この記事では、それは/home/homelabと同等です。

3. ブラウザを開き、サーバのHTTPアドレスに移動します。サーバが現在404ページを提供していることに気付くでしょう。これは、現在~/containers/caddy/filesindex.htmlファイルがないためです。

4. UbuntuサーバのVS Code Explorerウィンドウでindex.htmlファイルを~/containers/caddy/filesに作成し、以下のようにします:

<body><h2>hello world!</h2></body>

5. サーバのHTTPアドレスに移動し、コンテナが新しいindex.htmlページを提供していることを確認してください。

上記のすべては、以下のアニメーションで見ることができます:

container is now serving your new index.html page.

ドッカーの管理コマンドとは異なり、index.htmlのような作成しているファイルには管理者権限は必要ありません。これは、caddyサーバーが提供しているコンテンツがあなたのホームフォルダ内にあるためです。

バインドマウントの検証

素晴らしいです!完全に新しいDockerコンテナを使用しているだけでなく、そのコンテナはホームフォルダに保存されたコンテンツを提供しています!次のコマンドを実行して証明できます:

  1. 実行中のコンテナを停止して削除します。この手順では、バインドマウントを使用していない場合、index.htmlファイルを含むすべてが完全に削除されます。
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. 新しいコンテナを作成します。

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

3. 新しいコンテナがまだhttp://<your server>アドレスでindex.htmlファイルを提供していることを確認します。

永続的なDockerコンテナの作成

A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.

  1. 実行中のすべてのコンテナを停止して削除します。
# 現在実行中のすべてのコンテナを停止して削除します
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. 新しいコンテナを--restart alwaysパラメータを使用して再起動し、この新しいコンテナをホストの再起動時に開始するように設定します。 --restart alwaysフラグを使用することで、コンテナは自動的に起動するようになります。

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy --restart always caddy

3. サーバーを再起動します。

4. 新しいコンテナが起動し、まだhttp://<your server>アドレスでindex.htmlファイルを提供していることを確認します。

以下に適用されるコマンドをご覧いただけます:

Setting caddy to restart on boot

次に進む

この段階では、動作するDocker環境とイメージやコンテナに関する基本的な理解があるはずです。コンテナのプル、起動、停止、および基本的な管理を行うことができます。また、バインドマウントとポートマッピングを使用して、実行中のWebサービスコンテナを正常に作成しました。

Dockerに関してはまだまだカバーしなければならないことがたくさんあります:次の記事では、Docker Composeを使用した高度なDocker管理について詳しく説明しますので、お楽しみに。this spaceでお待ちください。

Source:
https://adamtheautomator.com/docker-ubuntu/