長い起動コマンドを、管理しやすい設定に
検証用に使っていたdocker runを繰り返し使うなら、起動条件をファイルに残すと変更を確認しやすくなります。compose.yamlではイメージ、ポート、環境変数を項目ごとに読み取れるため、引き継ぎやGitでのレビューにも使えます。
変換対象は1コマンド、出力は1サービスです。稼働中のコンテナから設定を取得する機能ではなく、複数サービスの依存関係も自動では作成しません。
貼り付けたあとに確認すること
docker runまたはdocker container runで始まるコマンドを入力します。複数行に分ける場合は行末のバックスラッシュを残してください。サービス名を指定しても、--nameで指定したコンテナ名は変わりません。
YAMLを保存したら、参照先のディレクトリと環境変数ファイルを確認し、docker compose configを実行します。常駐サービスの起動にはdocker compose up -dを使えます。元のコマンドに--rmがある場合は、単発実行として扱います。
既存のボリュームを取り違えないために
名前付きボリュームは元の名前を指定し、external: trueで参照します。Composeが別名の新規ボリュームを作り、データが消えたように見える事態を避けるためです。既存のボリュームが必要なので、新規構築では事前に作成するか、この指定を外してください。データ自体は移動しません。
相対パスの基準はComposeファイルの配置先です。独自ネットワークも既存の外部ネットワークとして参照します。ネットワーク指定がなければnetwork_mode: bridgeを維持します。Composeのプロジェクトネットワークを利用する場合は、この項目を外します。
Nginxの起動設定をファイルにする例
ホストの8080番をコンテナの80番に割り当てる例です。unless-stoppedは再起動ポリシーとして残りますが、バックグラウンド実行を指定する-dはYAMLの項目にはなりません。
docker run -d --name web -p 8080:80 \
--restart unless-stopped nginx:alpineservices:
web:
image: "nginx:alpine"
container_name: "web"
ports:
- "8080:80"
restart: "unless-stopped"
network_mode: "bridge"
シェルの展開処理は事前に済ませてください
POSIX形式の引用符、エスケープ、行継続に対応しています。PowerShellやCMD、パイプ、複数コマンド、Dockerのグローバルオプションには対応していません。$(pwd)やシェル変数は実際の値に置き換えてください。文字として残すドル記号は単一引用符などで保護し、出力では$$にエスケープします。
--env-fileはformat: rawで出力するため、Docker Compose 2.30.0以降が必要です。参照ファイルの読み取り、ポートの空き確認、イメージの検査は行いません。構成を確認できてもアプリケーションの起動が保証されるわけではありません。
docker runのオプションとComposeの対応表
| オプション | Composeの項目 | 扱い |
|---|---|---|
IMAGE | image | イメージ名とタグを維持 |
--name | container_name | 明示されたコンテナ名を維持 |
-p, --publish | ports | ホストとコンテナのポート割り当て |
-e, --env | environment | 値のない変数は実行環境で解決 |
-v, --volume / --mount | volumes | バインド、名前付き・匿名ボリューム |
--network | networks / network_mode | ネットワーク名またはモード |
--restart | restart | 再起動ポリシー |
IMAGE [COMMAND] [ARG…] | command | 起動引数を配列で保持 |
Composeへの移行でよくある質問
versionの記述は必要ですか?
現在のCompose Specificationに沿って、servicesから始まるYAMLを生成します。旧形式のversionは追加しません。確認にはdocker composeを使ってください。
--rmを使う単発コマンドは?
docker compose run --rm --service-ports SERVICEのSERVICEをサービス名に置き換えます。--service-portsにより、設定したポート割り当ても適用されます。
非対応のオプションがあるとどうなりますか?
--gpusや--link、一部の詳細なマウント設定は手動での記述が必要です。不完全な設定を渡さないよう、未対応の引数がある間は出力を停止します。
複数のコマンドをまとめられますか?
1つずつ変換し、サービス定義を結合してください。共有するボリュームやネットワーク、サービス間の依存関係は別途確認が必要です。
入力した認証情報は送信されますか?
変換はブラウザー内で完結し、入力コマンドをアップロードしません。ただし生成ファイルには入力した値が含まれるため、リポジトリに保存する前に内容を確認してください。
既存コンテナをそのまま置き換えますか?
変換だけではコンテナを操作しません。Composeを起動するときは、同じコンテナ名や使用中のポートとの競合を解消してください。
Docker公式ドキュメント: docker run · Compose · $$
