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にリモートで接続されています。

DockerをUbuntu Serverにインストールする実際のプロセスは2つのコマンドで完了します。 Ubuntuは、Ubuntuに付属するデフォルトのパッケージマネージャであるapt
でDockerを利用できるようにしています。
VS CodeのSSHターミナルウィンドウで、次の2つのコマンドを実行してDockerをインストールします:
Ubuntu Serverのインストール中に、Dockerをsnapとしてインストールするオプションが表示された場合は、まずsnapパッケージを削除するために
sudo snap remove docker
を実行してください。
以下のアニメーションでDockerのインストールを確認できます:

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 httpdとNginxですが、少し変わったウェブサーバーを使って新しいものに触れてみましょう。それがCaddyと呼ばれるものです。
Caddyはシンプルさで知られるウェブサーバーです。1行のファイルで多くの有効なサーバー設定をデプロイできます。シンプルさは良いことであり、また良い基本の例にもなります。
- まず、Dockerイメージを見つける必要があります。Windowsマシンで、https://hub.docker.comに移動します。
- ページの左上隅にある検索ボックスで
を検索します。以下のようなページが表示されるはずです:

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
コマンドを実行します。
以下のコマンドは、ローカルマシン上で-p
スイッチを使用してUbuntu Serverのリッスンポート80をコンテナのポート80にマッピングしています。この機能はポートマッピングと呼ばれます。
ほとんどのDocker Hubイメージは、
/ という命名規則に従います。ただし、Dockerによって「公式」とブランド化されたイメージには、前に が付いていません(上記の のようなイメージ)。
上記のコマンドを実行すると、以下のように出力されます。ログ情報が直接ターミナルに表示されます:

ほとんどのDockerコマンドは、
sudo
を前置することで、コマンドを管理者として実行するためです。デフォルトでは、Dockerサービスはroot
として実行され、コンテナやイメージへの変更は管理者として行う必要があります。
以上で、インストールが完了し実行できる状態になりました。UbuntuにDockerをインストールしてよかったですね。
今、Windowsコンピュータでhttp://<your-ip>に移動すると、Caddyのランディングページが表示されるはずです。以下で確認できます(このガイドのIPはhttp://homelab-dockerに置き換えられています):

現在docker
コマンドを実行すると、コマンドラインが使用できなくなります。他のコマンドを実行することはできず、セッションが終了すると実行中のコンテナも停止します。この問題を解決するために、コンテナをバックグラウンドで実行する方法(デタッチ)を見ていきましょう。
バックグラウンドでDockerコンテナを実行する
現在実行中のコンテナがありますが、コマンドラインが使用できなくなっています。他のことはできません。サービスのようにバックグラウンドでコンテナを起動するためのより良い方法が必要です。それをするには:
- コマンドラインでcontrol+cを押して、現在のコンテナを停止します。これにより、コマンドラインが再度使用できるようになります。
- 今度は、前回と同じコマンドを実行し、
-d
パラメータを指定します。以下のように表示されます。DockerはコンテナIDを返し、コマンドラインを返します。

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
:すべての停止したコンテナを破棄して削除します。
上記のすべてのコマンドは、以下のスクリーンショットでコンテキストで使用されているのがわかります:

サーバー上のコンテナを表示、変更、検査、またはリモートで操作するための他の多くのdocker containerコマンドがあります。すべてを表示するには、
sudo docker container --help
を実行してください。
バックグラウンドで実行されるコンテナにWebサーバーをデプロイしたにもかかわらず、カスタムコンテンツをホストする方法はまだありません。現状では、Caddyはデフォルトのウェブページを提供しています。
Dockerイメージを使用して、意味のあるデータを持つコンテナを展開するために、バインドマウントという概念を使用する方法を見てみましょう。
バインドマウントを使用したコンテナデータの保存
Dockerは、イメージ(および生成されるコンテナ)を使い捨てまたは一時的なものとして機能します。Caddyソフトウェアの更新がある場合、サービスを更新するのではなく、完全に新しいイメージをゼロから使用します。
このようにコンテナを廃棄して再作成する利点は非常に大きいです。ソフトウェアの不安定性は、(潜在的に)数年前のソフトウェアを継続的に更新することで徐々に導入されます。 Dockerは、毎回新しいイメージを使用することで、安定した、信頼性のある(おそらく)テスト済みのベースを提供します。
この概念は、Windowsのアプリケーションソフトウェアを更新するたびに新しいWindowsのインストールを使用することに相当します。Windowsでは楽しいアイデアではありませんが、Dockerでは非常に適用可能です。
ただし、使い捨ての方法論には明確な問題があります。現在のサービスが廃棄されたときに重要なデータが削除されることは望ましくありません。 Dockerは、バインドマウントという概念を使用してこの問題を解決します。
では、コンテナのバインドマウントの作成方法を探ってみましょう。
フォルダ構造の作成とクリーンアップ
バインドマウントを使用する前に、このデータを保存する場所を作成する必要があります。このチュートリアルでは、ホームディレクトリにフォルダを作成します。これを行うには、VS CodeでUbuntu Serverに接続したままで行います。
- VS Codeのエクスプローラパネルの空白の領域で右クリックし、「新しいフォルダー」を選択します。
2. 新しいフォルダーの名前をcontainers/caddy/filesにします。
フォルダーの名前は自由ですが、次のdockerコマンドで正しく定義されている必要があります。VS Codeはスラッシュを使用してこれを3つのフォルダーの作成と解釈します。フォルダーfilesはフォルダーcaddyのサブディレクトリであり、caddyはcontainersのサブディレクトリです。このフォルダー構造を使用する必要はありませんが、同じサーバー上に複数のコンテナがある場合にはより意味がある構造です。
以前に作成したコンテナがある場合は、次のコマンドで停止して削除します:
以下のスクリーンショットでこのコマンドを確認できます:

Caddyコンテナのバインドマウントでの展開
Ubuntuサーバー上にフォルダー構造が作成されました。バインドマウントを使用してCaddyコンテナを作成する時が来ました。
- さらに進む前に、作業しているコンテナが永続データを保存している場所を確認してください。これは、誰がDockerイメージを作成し、それがどのような目的で使用されるかによって異なります。
永続データが保存されている場所を見つけるための最良のオプションは、質問のDocker Hubのイメージ内のドキュメントを確認することです。Caddyのドキュメントはこちらで見つけることができます:

2. 以下のコマンドを使用してコンテナを起動します。パラメータ-v ~/containers/caddy/files:/usr/share/caddy
は、コロン(~/containers/caddy/files)の前のパスをコンテナ内のフォルダ(/usr/share/caddy)にマッピングしています。これはポートマッピングコマンドと非常に似ていますが、ポートではなくフォルダをマッピングしています。このタイプのコマンドはバインドマウントと呼ばれます。
上記のコードのチルダ(
~
)はホームフォルダを指します。この記事では、それは/home/homelab
と同等です。
3. ブラウザを開き、サーバのHTTPアドレスに移動します。サーバが現在404
ページを提供していることに気付くでしょう。これは、現在~/containers/caddy/filesにindex.htmlファイルがないためです。
4. UbuntuサーバのVS Code Explorerウィンドウでindex.htmlファイルを~/containers/caddy/filesに作成し、以下のようにします:
5. サーバのHTTPアドレスに移動し、コンテナが新しいindex.htmlページを提供していることを確認してください。
上記のすべては、以下のアニメーションで見ることができます:

ドッカーの管理コマンドとは異なり、index.htmlのような作成しているファイルには管理者権限は必要ありません。これは、caddyサーバーが提供しているコンテンツがあなたのホームフォルダ内にあるためです。
バインドマウントの検証
素晴らしいです!完全に新しいDockerコンテナを使用しているだけでなく、そのコンテナはホームフォルダに保存されたコンテンツを提供しています!次のコマンドを実行して証明できます:
- 実行中のコンテナを停止して削除します。この手順では、バインドマウントを使用していない場合、index.htmlファイルを含むすべてが完全に削除されます。
2. 新しいコンテナを作成します。
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.
- 実行中のすべてのコンテナを停止して削除します。
2. 新しいコンテナを--restart always
パラメータを使用して再起動し、この新しいコンテナをホストの再起動時に開始するように設定します。 --restart always
フラグを使用することで、コンテナは自動的に起動するようになります。
3. サーバーを再起動します。
4. 新しいコンテナが起動し、まだhttp://<your server>
アドレスでindex.htmlファイルを提供していることを確認します。
以下に適用されるコマンドをご覧いただけます:

次に進む
この段階では、動作するDocker環境とイメージやコンテナに関する基本的な理解があるはずです。コンテナのプル、起動、停止、および基本的な管理を行うことができます。また、バインドマウントとポートマッピングを使用して、実行中のWebサービスコンテナを正常に作成しました。
Dockerに関してはまだまだカバーしなければならないことがたくさんあります:次の記事では、Docker Composeを使用した高度なDocker管理について詳しく説明しますので、お楽しみに。this spaceでお待ちください。