Docker Composeを使用して再現可能なDockerコンテナーを作成する方法を知りたい場合は、適切な場所に来ました。このステップバイステップのDockerComposeチュートリアルでは、単純なコンテナーを作成する方法、DockerComposeを使用してポートを複雑なマルチコンテナーシナリオにマッピングする方法を学習します。
準備はできたか?掘り下げましょう!
ステップバイステップでフォローしたい場合は、このチュートリアルで、次のものがあることを確認してください。
- SSHが有効になっているUbuntuServerLTSの新規インストール 。このガイドでは、DockerホストマシンとしてUbuntu ServerLTS20.04.1を使用します。
- VSコードを備えたコンピューター インストール済み(オプション)。このガイドでは、Visual Studio Code 1.52.1を使用してDockerホストにSSHで接続し、コマンドを実行します。
- インストールされている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ホストにログオンしていると仮定して、次のようにフォルダー構造を作成します。
- ホームディレクトリに、 containersというフォルダーを作成します。 。このフォルダは、このコンテナや他のコンテナの適切なプレースホルダーになります。
- コンテナの内部 フォルダ、 caddyというサブフォルダを作成します 。このフォルダーには、DockerCompose構成ファイルとCaddyコンテナー自体が含まれます。
- 最後に、コンテナフォルダー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://
以下のアニメーションで、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が重要なユーザーデータをサーバー上のローカルストレージにマッピングする方法です。まず、ホストするコンテナのコンテンツを生成します。
- 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共有を構築してください。そのためには:
- 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 /
Docker名前付きボリュームの定義
NFS共有を作成したら、Dockerにその共有へのアクセス方法を指示する必要があります。 Docker Composeを使用すると、名前付きボリュームを定義することでそれを行うことができます。 DockerCompose構成ファイル内。
名前付きボリュームは、Dockerがネットワークベースのファイル共有を抽象化する方法です。最近のネットワークファイル共有には、CIFS(Windows)共有、NFS(Linux)共有、AWSS3バケットなどのさまざまな形とサイズがあります。名前付きボリュームを作成することで、Dockerはネットワーク共有と通信する方法を理解するという難しい部分を実行し、コンテナーが共有をローカルストレージであるかのように処理できるようにします。
名前付きボリュームを作成するには:
- 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ホストの場合:
- まず、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用のコンテナ コンテナ。
- 〜/ 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 外部で作成されたネットワークを含める。
-
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.