GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

DockerComposeの使用について知っておくべきことすべて

Docker Composeを使用して再現可能なDockerコンテナーを作成する方法を知りたい場合は、適切な場所に来ました。このステップバイステップのDockerComposeチュートリアルでは、単純なコンテナーを作成する方法、DockerComposeを使用してポートを複雑なマルチコンテナーシナリオにマッピングする方法を学習します。

準備はできたか?掘り下げましょう!

前提条件

ステップバイステップでフォローしたい場合は、このチュートリアルで、次のものがあることを確認してください。

  1. SSHが有効になっているUbuntuServerLTSの新規インストール 。このガイドでは、DockerホストマシンとしてUbuntu ServerLTS20.04.1を使用します。
  2. VSコードを備えたコンピューター インストール済み(オプション)。このガイドでは、Visual Studio Code 1.52.1を使用してDockerホストにSSHで接続し、コマンドを実行します。
  3. インストールされているVSCode公式SSH拡張機能 Dockerホストに接続します。 (オプション)

Docker Composeとは何ですか?

Dockerでは、単一のコマンドが長くなる可能性があります。例として以下を取り上げます。この例では、bookstackというソフトウェアアプリケーションのコンテナを作成します。

docker create \
   --name=bookstack \
   -e PUID # UID of user to take ownership of application/files \
   -e PGID # GID of user to take ownership of application/files \
   -e DB_USER # The database user \
   -e DB_PASS # The database password \
   -e DB_HOST # The database host \
   -e DB_DATABASE # The database to be used \
   -e APP_URL # The url your application will be accessed on (required for correct operation of reverse proxy) \
   -v /host/path/to/config:/config # Location of any uploaded data \
   -p 80:80/tcp # Web UI port \
   --restart unless-stopped \
   linuxserver/bookstack:version-v0.31.4

Docker環境の複雑さが増すにつれて、作業コンテナーのセットアップに必要なフラグと条件の量も増えます。 Dockerコマンドラインは煩雑になり、トラブルシューティングが困難になり始めます。特に、マルチコンテナのセットアップがミックスに入り始めたら。

Docker Composeは、非常に長いDockerコマンドの代わりに、構成ファイルを使用して再現可能なDockerコンテナーを作成する方法です。構造化された構成ファイルを使用することで、間違いを見つけやすくなり、コンテナーの相互作用を定義しやすくなります。

Docker Composeは、コンテナーの依存関係やマルチコンテナー環境を処理するときにすぐに非常に貴重になります。

Docker Composeは、Kubernetesのような分散システムの複雑さを伴わずに、InfrastructureasCodeに足を踏み入れる素晴らしい方法です。

Docker Composeは、 YAMLと呼ばれる構成ファイル構造を使用します 。 YAMLは、構造化された機械可読言語であるという点でJSONまたはHTMLに似ています。 YAMLは、構造化されたパワーを維持しながら、可能な限り人間が読める形式にすることに特に重点を置いています。

YAMLには、タブやその他の空白が重要であり、適切にフォーマットする必要があるという欠点があります。 VS Codeは、このような大変な作業の多くを実行します。また、VSCodeで実行されている例の多くが表示される理由でもあります。

DockerComposeのインストール

手を汚してみましょう。 Dockerホストに接続していると仮定して、DockerComposeをインストールします。

Docker Composeは、Dockerランタイムとは別のパッケージです。ただし、Docker ComposeをインストールするとDockerランタイムもインストールされるため、1つの石で2羽の鳥を殺すことができます。

Docker ComposeとDockerランタイムをインストールするには、次の2つのコマンドを実行します。

# update the software list (known as a repository) and then install docker compose
# with any needed dependencies. the -y flag is used to skip confirmation
sudo apt update -y
sudo apt install docker-compose -y

インストールしたら、コンテナを保存するためのフォルダ構造を作成する必要があります。

DockerComposeのフォルダー構造の作成

Docker Composeを使用してコンテナーを作成する前に、まずコンテナーを格納するフォルダーを作成する必要があります。コンテナを保存するためのフォルダ構造を作成するだけでなく、さまざまなDockerコマンドがさまざまな構成ファイルの場所に影響されることがわかります。 DockerComposeも例外ではありません。

Docker Composeの最も重要なコンポーネントは、 docker-compose.yamlという構成ファイルです。 。この構成ファイルは、上で説明したように、Dockerランタイムがコンテナーを構築する方法を指示します。

Docker Composeを実行すると、コマンドは、コマンドの実行と同じフォルダーで構成ファイルを検索します。この要件があるため、Docker Composeを実行するときは、常に別のフォルダを作成することをお勧めします。

フォルダごとにDockerCompose構成ファイルは1つしか存在しない場合があります。

Docker Composeを使用してDockerコンテナーを作成する方法を示すには、まず、Caddyと呼ばれる小さなファイルサーバーを使用して将来のコンテナーとその構成ファイルを格納するフォルダー構造を作成します。

キャディー apache httpdに似たファイルサーバーです またはnginx 、ただしGo言語で書かれています。 Caddyは、構成なしで使いやすいように特別に設計されています(そして、index.htmlファイルを自動的に生成または提供します)。この組み合わせにより、キャディは初心者に適しています。

Dockerホストにログオンしていると仮定して、次のようにフォルダー構造を作成します。

  1. ホームディレクトリに、 containersというフォルダーを作成します。 。このフォルダは、このコンテナや他のコンテナの適切なプレースホルダーになります。
  2. コンテナの内部 フォルダ、 caddyというサブフォルダを作成します 。このフォルダーには、DockerCompose構成ファイルとCaddyコンテナー自体が含まれます。
  3. 最後に、コンテナフォルダーcaddy内に、 docker-compose.yamlという名前の空白のテキストファイルを作成します。 これがDockerCompose構成ファイルになります。

フォルダ構造とDockerCompose構成ファイルが作成されたら、DockerCompose構成でその構成ファイルへの入力を開始できます。

DockerCompose構成ファイルの作成

最も基本的な形式では、 docker-compose.yaml キャディコンテナのファイルは次のようになります。お気に入りのLinuxテキストエディターまたはVSCodeで、以下のコードをコピーして、前に作成したDockerCompose構成ファイルに貼り付けます。

version: "3.7"
services:
  caddy:
    container_name: "caddy"
    image: "caddy:latest"
    ports:
      - "80:80"

表示されている各オプションを順を追って見ていきましょう:

  • version docker-composeファイルのバージョンを指定します。 Docker Composeの新しい定義にはそれぞれ、仕様に対する重大な変更が含まれています。したがって、Docker Composeが使用する必要のある機能を認識できるように、バージョンは重要です。バージョン3.7は、Ubuntu20.04.1LTSがサポートする最新バージョンです。

Docker Compose 3.xの完全な仕様は、ここにあります。リンクされたドキュメントには、DockerCompose内で使用できるすべてのオプションが記載されています

  • services 実際のコンテナの仕様が含まれています。このセクションでは、複数のコンテナを定義できます。
  • caddy は最初のコンテナの名前です(これは純粋に参照用です)。
  • container_name Dockerによってコンテナに付けられた実際の名前を定義し、一意である必要があります。
  • image 画像の名前です。この場合、キャディ Docker Hubから が定義されています。コロンで区切られたタグの後の名前または番号がバージョンです。
ポートマッピング

特にその最後のオプションには特別な言及が必要です:

ports:
  - "80:80"

Docker Composeでは、ports ディレクティブを使用すると、ホストからコンテナーへの1つ以上のマッピングを設定できます。たとえば、上記ではポート80をマッピングしました ホストからポート80 コンテナに。ただし、ポート番号を一致させる必要はありません。以下の例は、ポート8800をマップします ホストからポート80 コンテナ内。

ports:
  - "8800:80"

以下のように複数のポートを定義することもできます。

ports:
  - "80:80"
  - "443:443"

そうすることで、両方のポート80がマップされます および443 ホストへ(HTTPとHTTPSの両方を提供するためのWebサーバーの一般的な構成)

Dockerイメージクリエーターは、作成時に使用可能なポートを定義します。マップ可能なポートについては、DockerHubまたはメンテナのウェブサイトで使用しているイメージのドキュメントを必ず確認してください。ポートが使用されていない場合、ポートをマッピングする意味はありません!

それを念頭に置いて、実際にコンテナを実行する方法を見てみましょう。

コンテナの実行

これで、 docker-compose.yamlが作成されます。 〜\ containers \ caddy内のファイル フォルダ。今こそ、キャディコンテナを作成して起動するときです。

ターミナルで次のコマンドを実行すると、d ocker-compose.yamlで定義されたDockerコンテナが表示されます。 ファイル。

# This command must be run in the same folder as the file. The -d flag runs
# the command *detached*, which will bring up the container in the background
sudo docker-compose up -d

sudo docker-compose up -dを実行するときに、docker-compose.yamlファイルの場所を指定する必要がないことに気付くかもしれません。 。 Docker Composeは、docker-compose.yamlファイルを含むフォルダー内ですべてのコマンドを実行することを想定しています。これは、多くのコマンドがそのフォルダーに関連しているためです。

次に、 http:// に移動して、コンテナが稼働していることを確認します。 。このガイドでは、 http:// homelab-dockerを使用しています。 参考までに。

以下のアニメーションで、DockerホストにSSHで接続されているときにVSCodeでこの処理が行われていることを確認できます。

成功!これで、DockerComposeを使用して構成ファイルからコンテナーを正常に起動できました。最初の重要なステップを実行したら、コンテナの状態を管理する方法を見てみましょう。

分離されたコンテナを管理するためのコマンド

前のセクションでは、-dを使用してキャディコンテナを起動しました 国旗。そうすることで、切り離されたでコンテナを実行しました 州。コンテナが切り離された状態の場合、そのコンテナはバックグラウンドで実行され続けます。しかし、これには問題があります。直接制御できなくなった場合、そのコンテナをどのように管理しますか?

この問題を解決するために、DockerComposeにはdocker-compose.yamlで始まるコンテナーを管理する一連のコマンドがあります。 ファイル:

  • docker-compose restart 現在実行中のコンテナを再起動するために使用されます。そうすることは、実際にdocker-compose up -dを再実行することとは異なります。 。 restartコマンドは、既存のコンテナを再起動し、docker-compose up -dを再実行するだけです。 コマンドを実行し、コンテナを最初から再作成します(構成ファイルが変更されている場合)。
  • docker-compose stop コンテナを破壊せずに実行中のコンテナを停止します。同様に、docker-compose start コンテナが再び起動します。
  • docker-compose down 実行中のコンテナを停止し、それらも破棄します 。ここで、ボリュームのバインドマウントが効果を発揮します(詳細は以下を参照)。
  • docker-compose pull Dockerイメージの現在のバージョンをリポジトリからプルします。 latestを使用する場合 タグの場合は、docker-compose down && sudo docker-compose up -dを続けることができます コンテナを最新バージョンに置き換えます。 docker-compose pullを使用する 最小限のダウンタイムでコンテナをすばやく更新する便利な方法です。
  • docker-compose logs 実行中(または停止中)のコンテナーのログが表示されます。 docker-compose logs <container name>を使用して、個々のコンテナー(作成ファイルに複数のコンテナーが定義されている場合)をアドレス指定することもできます。 。

docker-composeコマンドの完全なリストは、docker-composeを実行することで確認できます。 追加の引数なしで、またはここでドキュメントで参照されています。

実行中のコンテナができたので、マシンにローカルに保存されたコンテンツの使用を見てみましょう。

DockerComposeでのバインドマウントの作成

バインドマウント Dockerが重要なユーザーデータをサーバー上のローカルストレージにマッピングする方法です。まず、ホストするコンテナのコンテンツを生成します。

  1. Dockerホストで、〜/ container / caddyの内部 フォルダfilesという名前の新しいフォルダを作成します 。

2. index.htmlという名前の新しいファイルを作成します 〜/ container / caddyの内部 以下のようなフォルダ。これは、CaddyWebサーバーが提供するメインページになります。

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

3.DockerCompose構成ファイルを次のように変更します。以下のサンプルファイルは、volumesを追加しています セクションとバインドマウントをファイルにポイントします コンテナで使用できるようにするために作成されたフォルダ。

version: "3.7" services: caddy: container_name: "caddy" image: "caddy:latest" ports: - "80:80" volumes: #the ./ refers a folder relative to the docker-compose file - "./files:/usr/share/caddy"

4. docker-compose up -dを実行します また。 Docker Composeは、ファイルが変更されたことを認識し、コンテナを再作成します。

5.ブラウザでコンテナのページに移動すると、「HelloWorld!」が提供されていることがわかります。ページ。

以下のアニメーションで次のことがわかります。

これで、マシンにローカルに保存されているコンテンツをホストしています。ただし、コンテンツがネットワーク共有などの外部ソースにある場合はどうなりますか?

DockerボリュームでのDockerComposeの使用

Docker Composeを使用して単純なコンテナーを作成したら、おそらくネットワーク共有上の別の場所にあるファイルにアクセスするために、そのコンテナーが必要になるでしょう。その場合は、DockerCompose構成ファイルでDockerボリュームを使用するようにコンテナーを構成できます。

デモンストレーションの目的で、このガイドではDockerホスト上にネットワークファイル共有(NFS)サーバーを作成します。ローカルコンテンツをNFSマウントとして提供することは、デモンストレーション以外の実用的な目的はありません。 NFSボリュームをマウントする場合、通常はNASやリモートサーバーなどの外部ソースからのものになります。

NFS共有を設定する

NFS共有をまだ設定していない場合は、このチュートリアル用にDockerホストでNFS共有を構築してください。そのためには:

  1. NFSサーバーをインストールします apt install nfs-kernel-server -yを実行してパッケージ化します 。

2.以下を実行して、コンテナーをNFSエクスポート(Windows CIFS共有と同様)として追加します。

# Add a line to the /etc/exports config file to create a NFS share for # /home/homelab/containers. This share is only exposed to localhost (to # prevent other computers from having access) echo '/home/homelab/containers localhost(rw,sync,no_root_squash,no_subtree_check)' | sudo tee -a /etc/exports # Restart the NFS server with the new config sudo systemctl restart nfs-kernel-server

3.ここで、showmount -e localhostを実行して、ホストがNFS共有を公開していることを確認します。 。このコマンドは、現在公開されているNFS共有とアクセス権を持つユーザーを表示します。

以下のスクリーンショットでは、 / home / homelab / containersを見ることができます。 は公開されていますが、ローカルホストコンピューター(Dockerホストを実行しているのと同じサーバー)にのみ公開されています。

フォルダ/home / / containersが表示されている場合 出力では、NFS共有が設定されています。

Docker名前付きボリュームの定義

NFS共有を作成したら、Dockerにその共有へのアクセス方法を指示する必要があります。 Docker Composeを使用すると、名前付きボリュームを定義することでそれを行うことができます。 DockerCompose構成ファイル内。

名前付きボリュームは、Dockerがネットワークベースのファイル共有を抽象化する方法です。最近のネットワークファイル共有には、CIFS(Windows)共有、NFS(Linux)共有、AWSS3バケットなどのさまざまな形とサイズがあります。名前付きボリュームを作成することで、Dockerはネットワーク共有と通信する方法を理解するという難しい部分を実行し、コンテナーが共有をローカルストレージであるかのように処理できるようにします。

名前付きボリュームを作成するには:

  1. Docker Compose構成ファイル( docker-compose.yaml )を開きます )。フォローしている場合、ファイルは〜/ containers / caddyにあるはずです。 フォルダ。

2.DockerCompose構成ファイル内にvolumesを追加します servicesの後のセクション セクション。設定ファイルは以下のようになります。 volumes セクションは、 MyWebsiteという名前のボリュームを作成します 。その名前付きボリューム内で、必要なパラメーター(IP、NFS設定、パスなど)が指定されます。 volumes services内のパラメータ セクションも変更され、ローカルフォルダではなく名前ボリュームを指すようになります。

version: "3.7"
 services:
   caddy:
     container_name: "caddy"
     image: "caddy:latest"
     ports:
       - "80:80"
     volumes:
       - "MyWebsite:/usr/share/caddy"
 volumes:
   MyWebsite:
     driver_opts:
       type: "nfs"
       o: "addr=localhost,nolock,soft,rw"
       device: ":/home/homelab/containers/caddy/files"

3. Docker Compose構成ファイルでNFS共有を指す名前付きボリュームを定義したら、docker-compose up -dを実行します。 コンテナを作成して開始します。すべてがうまくいけば、コンテナとWebサイトが復旧するはずです。

4.コンテナのページに再度移動します。 index.html コンテンツは、ファイルがローカルにマウントされているかのように表示されます。ただし、そのファイルは、ネットワーク上にセットアップされたNFSサーバーを介してマウントされています。

Docker Composeで外部Dockerボリュームをマウントできるようになったため、あらゆる種類のネットワークストレージをコンテナーに取り込むことができるようになりました。ただし、Docker Composeは、単一のコンテナーまたはボリュームを定義するだけではありません。より複雑なマルチコンテナシナリオに飛び込みましょう。

このチュートリアルではキャディコンテナを使用しなくなるため、docker-compose downを使用してコンテナを削除できます。 。

DockerComposeでの複数のコンテナの定義

ほとんどのDockerコンテナは、バキューム内では機能しません。 Dockerコンテナーには通常、データベースやAPIを介して話す個別のWebサービスなどのサービス依存関係があります。

Docker Composeを使用すると、単一のファイル内で定義されたコンテナーをグループ化できます。 1つのファイルに複数のコンテナーを定義することで、コンテナーは依存するサービス間で通信し、複雑なコンテナーレイアウトの編成を簡素化できます。

このようなシナリオを示すために、 BookStackと呼ばれる人気のあるウィキアプリケーションを設定しましょう。 。

BookStackは、使いやすさと階層レイアウト(mediawikiなどのフラットレイアウトとは対照的)で知られる人気のウィキソフトウェアです。

BookStackは、多くのWebアプリケーションと同様に、正しく機能するために別個のデータベースと、データベースとの通信に必要な情報を必要とします。このような状況を設定することは、DockerComposeが優れているところです。

DockerCompose構成ファイルを作成する

BookStackには内部的に維持されているDockerイメージはありませんが、 linuxserver.io 評判の良いDockerHubイメージを維持します BookStackに代わって。 Dockerハブサイトのドキュメントには推奨されるDockerCompose構成ファイルがありますが、このチュートリアルでは、概念を説明しながら新しい構成ファイルを作成します。

Dockerホストの場合:

  1. まず、BookStack用のフォルダーを作成します。前のセクションのチュートリアルに従った場合は、〜/ containerが必要です。 フォルダ。 bookstackというフォルダを作成します そこに。

2.次に、 docker-compose.yamlという名前の空のDockerCompose構成ファイルを作成します。 bookstackの内部 フォルダ。

3.次に、Docker Compose構成ファイルを開き、bookstackという2つのコンテナーを定義します。 コンテナとbookstack_db (mariadb)コンテナ。

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"

これまでのところ、この docker-compose.yaml ファイルは主にすでに導入されている概念を使用しています:2つのサービス(bookstack 、およびbookstack_db )、イメージとバインドマウントの両方。ブックスタックコンテナには、ホストポート8080から内部ポート80へのポートマッピングがあります。

Dockerコンテナのオーバーヘッドが非常に低いことを考えると、Webアプリケーションごとに個別のデータベースコンテナを定義するのが一般的な方法です。そうすることで、職務のより大きな分離が可能になります。これは、1つのデータベースインストールで数百のWebアプリケーションにサービスを提供できる従来のデータベース設定とは明らかに異なります。

上記のファイルに表示される新しいオプションの1つは、depends_onです。 指図。このコマンドは、コンテナーが開始する順序をDockerに指示します。 depends_onの定義 コマンドはDockerにbookstack_db コンテナ必須 最初に開始します。

環境変数を使用したコンテナ通信の設定

前のセクションで作成されたこの構成ファイルはまだ完成していません。 2つのサービス(コンテナ)を定義しましたが、それらは互いに話し合っていません。 bookstack コンテナはbookstack_dbと通信する方法を知りません 容器。環境変数を使用してそれを解決しましょう。

環境変数は、Dockerコンテナーに変数を提供する最も一般的な方法です。これらは実行時に指定される(または docker-compose.yaml で定義される)変数です。 構成ファイル)コンテナが実行する必要があることに関する情報を提供します。

環境変数は、Dockerイメージを作成する人によって定義されます。使用しているDockerイメージによって異なります。使用する環境変数については、作成者からのドキュメントを参照する必要があります。

環境変数を定義する方法は2つあります。 docker-compose.yamlに直接 ファイル自体または別のファイルとして。

通常、別のファイルが推奨される方法です。特に 変数にパスワードなどの機密データが含まれている場合。 docker-compose.yaml ファイルは、公開されているGitHubリポジトリで共有またはアップロードするように設計されています。機密データ用に別のファイルを用意しておくと、偶発的なセキュリティ違反の可能性が低くなります。

Dockerホストで、2つの環境変数を作成します。 bookstack用に1つ コンテナとbookstack_db用のコンテナ コンテナ。

  1. 〜/ containers / bookstackに新しいファイルを作成します bookstack.envというフォルダ 次の内容で:
APP_URL is the IP address or hostname of your server. This article is using homelab-docker
 APP_URL=http://homelab-docker:8080
 DB_HOST is the container name you gave your container
 DB_HOST=bookstack_db
 DB_USER is defined in the bookstack_DB environment file
 DB_USER=bookstack_user
 DB_PASS is also defined in the bookstack_DB environment file
 DB_PASS=MySecurePassword
 DB_DATABASE is the name of the database within mariadb
 DB_DATABASE=bookstack

2. 〜/ containers / bookstackに新しいファイルを作成します bookstack_db.envというフォルダ 次のコンテンツを含めます:

The root password for our database, keep it secret, keep it safe
 MYSQL_ROOT_PASSWORD=MySecureRootPassword
 The database bookstack will be using
 MYSQL_DATABASE=bookstack
 the user bookstack will be using
 MYSQL_USER=bookstack_user
 the password bookstack will be using
 MYSQL_PASSWORD=MySecurePassword

3.ベストプラクティスとして、両方の envを確認します。 他のユーザーがファイルを読み取ることはできません。

chmod 600 bookstack.env bookstack_db.env

bookstack.envファイルとbookstack_db.envファイルの両方に機密データが含まれているため、読み取りアクセスを変更する必要があります。

4. 〜/ containers / bookstack / docker-compose.yamlを更新します 以下に示すこれら2つの環境ファイルを参照するDockerComposeファイル。

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"

5.ここで、 bookstackを起動します およびbookstack_db DockerComposeを使用するコンテナー。

sudo docker-compose up -d

以下のVSCodeで実行される、このセクションの前述の各手順を確認できます。

Docker作成ログの監視

DockerエンジンはDockerComposeと連携して、バックグラウンドでさまざまなタスクを実行します。特に一度に複数のコンテナを操作するときに何が起こっているかを監視できると便利です。

たとえば、bookstackコンテナを監視するには、logsを使用します。 指図。このチュートリアルでは、ログに[services.d] doneが表示されたら 、bookstackのURLにアクセスできます。

sudo docker-compose logs bookstack

この段階では、完全に機能するWikiを独自のコンテナー内で実行し、独自のデータベースを完全にDocker内で実行する必要があります。

bookstackフォルダーとbookstack_dbフォルダーがあれば、bookstack環境を最初から再作成できます。

ドッカーの作成とネットワーキング

これまで、コンテナがどのように連携するかについてのコミュニケーションとネットワーキングの側面についてはあまり学びませんでした。それを変えましょう。

1つのdocker-compose.yaml内に複数のコンテナーを作成する場合 前のセクションで行ったように、ファイルはすべて同じネットワークに割り当てられます(通常は name-of-parent-folder_default と呼ばれます) 。

docker-compose up -dを実行すると、コンテナ用に作成されたネットワークを確認できます。 以下に示すように。

すべてのコンテナが同じネットワーク内で割り当てられると、DockerはそれらのDNSエントリを内部で作成します。そのため、前の例では、データベースをbookstack_dbと呼んでいました。 環境変数で。そのbookstack_db nameは、実際にはデータベースコンテナのIPアドレスを指すDNSエントリです。

また、ネットワークを自動生成するためにDockerComposeに依存する必要はありません。内部ネットワークまたは外部ネットワークを手動で定義できます。ネットワークを手動で定義することは、別の docker-compose.yaml内の別のコンテナーと通信する必要があるコンテナーがある場合に最適です。 ファイル。ポートを公開することも、両方が参加できるネットワークを作成することもできます!

ネットワークの明示的な定義を開始するときは、デフォルトネットワークも明示的に定義する必要があることに注意してください。ネットワークの定義を開始すると、DockerComposeはそのネットワークの作成を自動的に停止します

次に、ブックスタックを変更します docker-compose.yaml 外部で作成されたネットワークを含める。

  1. docker network create my_external_networkを使用して外部ネットワークを作成します 。

2. docker-compose.yamlで外部ネットワークを定義します :

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
     networks:
       - "my_external_network"
       - "bookstack_default"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"
     networks:
       - "bookstack_default"
 networks:
   bookstack_default:
   my_external_network:
     external: true

3. docker-compose up -dを実行します コンテナを再作成します。これで、以下に示すように、2つのコンテナが2つのネットワークに参加しました。

ブックスタックコンテナもになりました 外部で定義されたネットワークに参加しました。これにより、BookStack HTTPトラフィックをDockerを離れる前にHTTPSに変換する別のコンテナーを作成できます(リバースプロキシと呼ばれます)。 。

コンテナを実行するための特定のユーザーの設定

デフォルトでは、すべてのDockerコンテナはサンドボックス化されたrootユーザーとして実行されます。これは、デフォルトのAdministratorユーザーとしてログインしている仮想マシンを実行するのと同じです。これは一般的に 問題ではありません。サンドボックスが危険にさらされた場合、セキュリティ上の懸念があります。

ルートとして実行する際のもう1つの問題は、ファイルのアクセス許可です。 db を削除しようとすると、気付くかもしれません。 bookstack内のフォルダ フォルダ、実際にはできません。コンテンツはrootが所有しています。

ほとんどのイメージはroot以外のユーザーとして実行することを評価していませんが、 linuxserver.io 特に画像は、コンテナ内で実行するユーザーを設定するための環境変数を提供します。これを行うには、UID=1000を追加します およびGID=1000 bookstack.env内 構成。

1000:1000は、ubuntuの最初のユーザーのデフォルトのユーザーIDとグループです(そうでない場合もあります)。 You can read more about User IDs and Group IDs at Related:A Windows Guy in a Linux World:Users and File Permissions )

You can also force a UID and GID using the user parameter in docker-compose, but this is not recommended as most containers do not behave well when forced to a different user

Setting the Restart Policy

If you’d like containers built with Docker Compose to restart on failure, use the restart policy by adding a restart: <option> parameter under the container settings in docker-compose.yaml

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

Adding this parameter will cause containers to automatically restart on failure to help maintain uptime in the event of unexpected power issues.

Manually setting DNS entries for Containers

Just like with Windows and Linux, Docker also has a “hosts file”. By using the extra_hosts parameter in a config file, you can force a host to resolve to a specific IP. This can be useful when you have DNS constraints, such as split DNS or a test server you want to interact with temporarily.

extra_hosts:
  - "somehost:x.x.x.x"
  - "otherhost:x.x.x.x"

Running Commands

Once the container is started, you can run commands inside of the container using the docker-compose run 。 For example, maybe you’d like to start up a Bash terminal inside of your bookstack 容器。 To do that, you’d run the command below.

docker-compose run web bash
結論

At this stage, you should have enough information to follow along with the majority of docker-compose tutorials out on the web. Having this knowledge can vastly expand your ability to move into the world of Docker, and the building of web apps in Infrastructure as Code.


Docker
  1. Podman vs Docker:知っておくべきことすべて

  2. ZorinOS12について知りたいことすべて

  3. VPNとは何ですか? VPNについて知っておくべきことすべて

  1. Ubuntu13.04について知っておくべきことすべて

  2. CentOSストリームについて知っておくべきことすべて

  3. Linuxファイルシステムについて知っておくべきことすべて

  1. LinuxChmodコマンドについて知っておくべきことすべて

  2. Linuxコンテナー(LXC)について知っておくべきことすべて

  3. UbuntuDNSサーバーについて知っておくべきことすべて