DockerfileとDocker composeの違いを公式ドキュメントに沿って整理し、Linux UbuntuのDockerで「Nextcloud+mariaDB」と「WordPress+mySQL」の2つのサーバーを同時運用する方法を紹介します。
管理人本記事の読者層は以下の方を想定しています。
- DockerfileとDocker composeの違いを知りたい方
- Dockerfileの書き方・置き場所・実行方法の基本を確認したい方
- Dockerで複数のイメージを同時に利用してサーバーを構築したい方
- Docker composeを利用したい方
DockerfileとDocker composeの違い
結論から言うと、Dockerfileは「1つのイメージの作り方」を書くファイル、Docker composeは「複数のコンテナをどう動かすか」を書くファイルです。2つは役割が違うため、どちらか一方を選ぶものではありません。Composeのサービス定義にbuild:を書くと、Dockerfileからイメージを作って起動することもできます。
| 比べる点 | Dockerfile | Docker compose |
|---|---|---|
| 役割 | 1つのコンテナイメージを作る手順を書く | 複数のコンテナ(サービス)の構成と起動方法を書く |
| ファイル名 | 標準は拡張子のないDockerfile | 標準はcompose.yamlまたはdocker-compose.yaml |
| 書く内容 | FROM・RUN・COPYなどの命令 | services・ports・volumes・environmentなどの設定 |
| 主なコマンド | docker build | docker compose up |
| 使う場面 | 自分用のイメージを作りたいとき | アプリとDBなど、複数のコンテナをまとめて動かしたいとき |
本記事のように、Docker Hubの公式イメージをimage:で指定するだけなら、Dockerfileを書かなくてもComposeで動かせます。詳しい仕様は、公式ドキュメントのDockerfile overviewとCompose Build Specificationで確認できます。
Dockerfileの書き方・置き場所・実行方法
Dockerfileは、イメージを組み立てるための命令を並べたテキストファイルです。docker buildを実行すると、Dockerが命令を順番に処理してイメージを作ります。ここでは、検索でよく調べられている「どうやって作るのか」「どこに置くのか」「どうやって実行するのか」を順に整理します。
Dockerfileに書く主な命令
| 命令 | 役割 |
|---|---|
FROM | ベースにするイメージを指定する |
RUN | イメージのビルド中にコマンドを実行する(ソフトのインストールなど) |
COPY | 手元のファイルやディレクトリをイメージの中にコピーする |
WORKDIR | 以降のRUN・CMD・COPYなどを実行する作業ディレクトリを指定する |
ENV | 環境変数を設定する |
EXPOSE | アプリが待ち受けるポートを書き残す |
USER | 以降の命令と、コンテナ実行時のユーザーを指定する |
CMD | コンテナ起動時の既定のコマンドを指定する |
RUNはイメージを作るとき(ビルド時)に実行され、CMDはコンテナを起動するときに実行されます。EXPOSEはポートを書き残すだけなので、外から接続するには、docker run -pやComposeのports:でポートを公開します。このほかにもENTRYPOINT(既定の実行ファイルを指定)やARG(ビルド時の変数)などがあり、全命令の一覧は公式のDockerfile referenceで確認できます。
Dockerfileの置き場所と拡張子
標準のファイル名は、拡張子のない「Dockerfile」です。docker buildを実行するディレクトリに置くと、ファイル名を指定しなくてもビルドできます。別の名前にした場合は、docker build -f ファイル名 .のように指定し、Composeから使う場合はbuild:の中のdockerfile:で名前を指定します。
COPYで取り込めるのは、ビルドコンテキスト(docker buildの最後に指定したディレクトリ)の中のファイルだけです。不要なファイルをビルドに含めたくない場合は、そのディレクトリに.dockerignoreファイルを置いて除外します。
Dockerfileをビルドして実行する
たとえば、次のようなDockerfileをDockerfileという名前で保存します(名前: sample-curl、バージョン: 1.0)。
# Dockerfile name: sample-curl / version: 1.0
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y curl
RUN echo "build: sample-curl v1.0" >> /var/log/build.log
CMD ["curl", "--version"]FROMでUbuntu 24.04を土台にし、RUNでcurlをインストールして、ビルドした記録を/var/log/build.logに残しています。CMDは、コンテナを起動したときにcurlのバージョンを表示する指定です。
Dockerfileがあるディレクトリで、次の2つのコマンドを順に実行します。1つ目でイメージを作り、2つ目でそのイメージからコンテナを起動します。
docker build -t my-image:latest .
docker run my-image:latest-tでイメージに名前(タグ)を付け、最後の.がビルドコンテキスト(現在のディレクトリ)を表します。
UbuntuのDocker composeで複数コンテナを連携する方法
Dockerでアプリケーションを動かす場合、1つのコンテナだけで完結することは少なく、アプリ用のコンテナとデータベース用のコンテナのように、複数のコンテナを連携させて動かすのが一般的です。
本記事では、その基本となる「複数のコンテナを連携させながら、2つの独立したサーバーを同時運用する」具体的な方法を、Nextcloud+mariaDBとWordPress+mySQLという2つの構成を例に解説します。
過去の記事で、複数のコンテナをまとめて動かすツール「Docker compose」をLinux Ubuntuにインストールする方法を紹介しました。今回は、NextcloudとWordPressを同時にDockerでインストールする方法を紹介いたします。
ポート設定で重要な点
(1) httpdのポート番号をNextcloudとWordPressで異なるポートにすること。
(2) mysqlとmariaDBでデータベースサーバーも異なるポートでアクセスできるようにすることです。
Docker Engine(Ubuntu 22.04 / 24.04 / 26.04 LTS。2026年10月時点の公式のインストール手順が対象とするバージョン)
Docker Compose(v2。docker compose versionコマンドで導入済みの版を確認できます)
【サーバー1】: Nextcloud+mariaDB (アクセス先:http://servername:8080)
- Nextcloud
35系(2026年10月時点で、nextcloudの公式イメージのlatestになっているバージョンです。最新バージョンは公式サイトでご確認ください)
- mariaDB
最新版(公式サイトでご確認ください)
【サーバー2】: WordPress+mySQL (アクセス先:http://servername:8085)
- WordPress
7.1系(2026年10月時点。7.1は2026年8月19日に公開されました。最新のバージョンは公式サイトでご確認ください)
- mySQL
本記事の定義ファイルではmysql:8.0を指定しています(MySQL 8.0は2026年4月30日にサポートが終了しているため、新しく構築する場合はサポート継続中のLTS版「MySQL 8.4」の利用を検討してください。注意点は、サーバー2の定義ファイルの後の解説を参照)
Docker Hubの公式イメージをダウンロードする(docker pull)
以下のDockerの公式イメージから、mysql・mariadb・nextcloud・wordpressのイメージをダウンロードします。この手順で使うのはすべてDocker Hubの公式イメージなので、Dockerfileを自分で書く必要はありません。
Ubuntuのターミナル上から以下のdocker pullコマンドを実行して、Dockerのイメージをダウンロードできます。
docker pull mysql:8.0
docker pull nextcloud
docker pull mariadb
docker pull wordpress次に、
【サーバー1】「Nextcloud+mariaDB 」docker-composeの定義ファイルを作成します。以降のコマンドに合わせて、ファイル名はdocker-compose1.ymlとしてください。
version: '3'
volumes:
mariadb:
ownapp:
services:
mariadb:
restart: always
image: mariadb
container_name: mariadb
ports:
- 5400:5400
expose:
- 5400
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- ./mariadb:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_PASSWORD=userpass
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_TCP_PORT=5400
ownapp:
restart: always
container_name: ownapp
image: nextcloud
volumes:
- ./ownapp:/var/www/html
ports:
- 8080:80
depends_on:
- mariadb
environment:
- MYSQL_PASSWORD=userpass
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=mariadb:5400
【サーバー2】「WordPress+mySQL 」docker-composeの定義ファイルを作成します。ファイル名はdocker-compose2.ymlとしてください。
version: '3'
volumes:
wd_app:
wd_db:
services:
wd_db:
restart: always
image: mysql:8.0
container_name: wd_db
ports:
- 12345:3306
expose:
- 3306
volumes:
- ./wd_db4:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_PASSWORD=userpass
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
wd_app:
restart: always
container_name: wd_app
image: wordpress
volumes:
- ./wp_app4:/var/www/html
ports:
- 8085:80
depends_on:
- wd_db
environment:
- WORDPRESS_DB_HOST=wd_db:3306
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=userpass
- WORDPRESS_DB_NAME=wordpress
なお、定義ファイル先頭のversionは、現在のDocker Composeでは使われません。書いてあっても動作しますが、「obsolete(廃止)」という警告が表示されます。新しく書く場合は、versionの行を省いて構いません(公式ドキュメント)。
また、サーバー2のimage: mysql:8.0について、MySQL 8.0は2026年4月30日にサポートが終了しています。MySQL 8.4へ切り替える場合は、MySQL 8.4では認証プラグインmysql_native_passwordが既定で無効になっている点に注意してください(WordPressの開発チームがTracのチケットで説明しています)。本記事の手順はmysql:8.0で記載しており、mysql:8.4での動作は本記事では扱っていません。
ymlの設定で重要な点
(1) volumeのIDは異なるものを使用すること。
今回はwd_app, wd_db, mariadb, ownappの異なるボリュームを使用しました。
(2) hostへの保存先のディレクトリも異なるものを使用すること。
Docker composeで2つのサーバーを順番に立ち上げる
【サーバー1】: 「Nextcloud+mariaDB 」の立ち上げ
最終的に、以下のコマンド「docker compose -f docker-compose1.yml up -d」を入力してバックグラウンドでスタートして終了です。
ここで、エラーがでないか「docker compose -f docker-compose1.yml up」(-dなし)としてフォアグラウンド処理で確認してみるのも良いかと思います。
-fはupの前に書きます(docker compose -f ファイル名 upの順。公式ドキュメントの書式です)。なお、旧版の本記事ではdocker-compose(ハイフン付き)と書いていましたが、ハイフン付きは旧版(Compose v1)のコマンドです。現在はDockerのコマンドに統合されたdocker composeを使います(Docker公式ブログ)。
% docker compose -f docker-compose1.yml up -d
[+] Running 2/2
⠿ Container mariadb Started 1.0s
⠿ Container ownapp Started 0.3s【サーバー2】: 「WordPress+mySQL 」の立ち上げ
同様に
% sudo docker compose -f docker-compose2.yml up -d
WARN[0000] Found orphan containers ([nextcloud-app db-container wd_app wd_db]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
[+] Running 2/2
⠿ Volume "wd_app" Created 0.0s
⠿ Container wd_db Started 0.3s
⠿ Container wd_app Started 0.5sDocker composeのリストを確認すると以下のように見えます。
$ docker compose ls -a
NAME STATUS CONFIG FILES
user exited(2), running(4) /home/user/docker-compose1.yml,/home/user/docker-compose2.ymlその後、適当なブラウザで「http://servername:8085」にアクセスすると、WordPressの初期設定画面が表示されるので、サイトタイトルや管理者アカウントを設定してください。
コンテナ内に入る方法
サーバー1の定義ファイルで起動したコンテナは、次のコマンドで確認できます。表示されるコンテナ名は、定義ファイルのcontainer_nameで指定したmariadbとownappです。
sudo docker compose -f docker-compose1.yml ps何か問題が起こった場合には、データベースの設定に問題がある場合があります。
この場合、コンテナの中に入って修正します。
Nextcloudのコンテナ(定義ファイルのサービス名はownapp)に入るには、次のようにコマンドを入力します。
sudo docker compose -f docker-compose1.yml exec ownapp bashコンテナ内の/var/www/html/configにある「config.php」を開き、データベースの設定を確認します。
Docker composeの停止
Composeの停止は以下のコマンドでできます。コンテナとネットワークが削除されます。
sudo docker compose -f docker-compose1.yml down
sudo docker compose -f docker-compose2.yml downまとめ
DockerfileはイメージのつくりかたをDocker composeは複数コンテナの動かし方を書くもので、本記事ではUbuntuのDocker composeで「Nextcloud+mariaDB」と「WordPress+mySQL」の2つのサーバーを、ポート番号やボリューム名を分けて同時運用しました。
- Dockerfileは「イメージを作る手順」、Docker composeは「複数コンテナの構成と起動」を書くもので、Composeの
build:でDockerfileを使うこともできる - ポート番号・ボリューム名・保存先ディレクトリを2つのサーバー間で重複させないことが重要
- 環境変数をリスト形式で書くときは
KEY=値で指定し、WordPressコンテナにはWORDPRESS_DB_HOSTなどのDB接続情報を必ず指定する
複数のコンテナを連携させる際は、ポート・ボリュームの重複に気をつければ、比較的簡単に複数サーバーを同時運用できます。
関連リンク








コメント
コメント一覧 (4件)
[…] SEO対策の賢者 Docker composeで2つ以上のサーバーを運用する方法 – SEO対策の賢者 Docker composeを使って2つ以上のサーバー(コンテナ)を同時に運用する方法を解説。複数コンテナの […]
[…] SEO対策の賢者 Docker composeで2つ以上のサーバーを運用する方法 – SEO対策の賢者 Docker […]
[…] SEO対策の賢者 Docker composeで2つ以上のサーバーを運用する方法 – SEO対策の賢者 Docker composeを使って2つ以上のサーバー(コンテナ)を同時に運用する方法を解説。複数コンテナの […]
[…] SEO対策の賢者 Docker composeで2つ以上のサーバーを運用する方法 – SEO対策の賢者 Docker […]