DockerfileとDocker composeの違いは?複数サーバーを同時に動かす方法

📖 この記事は約 21 分で読めます。
DockerfileとComposeの違い解説
概要

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からイメージを作って起動することもできます。

比べる点DockerfileDocker compose
役割1つのコンテナイメージを作る手順を書く複数のコンテナ(サービス)の構成と起動方法を書く
ファイル名標準は拡張子のないDockerfile標準はcompose.yamlまたはdocker-compose.yaml
書く内容FROM・RUN・COPYなどの命令services・ports・volumes・environmentなどの設定
主なコマンドdocker builddocker 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の環境

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.5s

Docker 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接続情報を必ず指定する

複数のコンテナを連携させる際は、ポート・ボリュームの重複に気をつければ、比較的簡単に複数サーバーを同時運用できます。

関連リンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (4件)

コメントする

目次