[{"data":1,"prerenderedAt":1747},["ShallowReactive",2],{"blog-ja-docker-compose-to-kubernetes-migration":3,"blog-ja-docker-compose-to-kubernetes-migration-alt":435},{"id":4,"title":5,"author":6,"body":7,"date":1735,"description":1736,"extension":1737,"image":255,"locale":1738,"meta":1739,"navigation":435,"path":1740,"seo":1741,"stem":1742,"tags":1743,"__hash__":1746},"blog\u002Fblog\u002Fja\u002Fdocker-compose-to-kubernetes-migration.md","Docker Compose から Kubernetes への移行ガイド","Kubo Team",{"type":8,"value":9,"toc":1711},"minimark",[10,14,24,29,32,157,165,173,177,180,184,249,453,472,476,484,487,563,566,618,633,637,720,729,733,748,752,822,828,1016,1019,1022,1290,1296,1300,1303,1306,1398,1405,1408,1413,1456,1476,1479,1482,1497,1501,1504,1507,1544,1636,1649,1653,1656,1688,1698,1707],[11,12,13],"p",{},"Docker Compose は開発環境やシンプルなデプロイに優れていますが、本番環境でのスケーラビリティ・可用性・運用自動化には Kubernetes が必要です。しかし、Docker Compose から Kubernetes への移行は「YAML を書き換えるだけ」では済みません。ネットワーキング、ストレージ、シークレット管理など、根本的なアーキテクチャの違いを理解した計画的な移行が成功の鍵です。",[11,15,16,23],{},[17,18,22],"a",{"href":19,"rel":20},"https:\u002F\u002Fkubo.hexabase.io\u002F",[21],"nofollow","Kubo"," は、本番グレードの Kubernetes 基盤を提供し、Docker Compose からの移行をスムーズにサポートします。本記事では、移行の全フェーズを実践的に解説します。",[25,26,28],"h2",{"id":27},"docker-compose-と-kubernetes-の根本的な違い","Docker Compose と Kubernetes の根本的な違い",[11,30,31],{},"移行を始める前に、両者のアーキテクチャの違いを理解しておくことが重要です。",[33,34,35,51],"table",{},[36,37,38],"thead",{},[39,40,41,45,48],"tr",{},[42,43,44],"th",{},"項目",[42,46,47],{},"Docker Compose",[42,49,50],{},"Kubernetes",[52,53,54,66,82,96,107,118,135,146],"tbody",{},[39,55,56,60,63],{},[57,58,59],"td",{},"スコープ",[57,61,62],{},"単一ホスト",[57,64,65],{},"マルチノードクラスタ",[39,67,68,71,79],{},[57,69,70],{},"スケーリング",[57,72,73,74,78],{},"手動（",[75,76,77],"code",{},"scale"," オプション）",[57,80,81],{},"自動（HPA \u002F VPA）",[39,83,84,87,93],{},[57,85,86],{},"ヘルスチェック",[57,88,89,92],{},[75,90,91],{},"healthcheck"," ディレクティブ",[57,94,95],{},"liveness \u002F readiness \u002F startup Probes",[39,97,98,101,104],{},[57,99,100],{},"ネットワーク",[57,102,103],{},"ブリッジネットワーク",[57,105,106],{},"Service \u002F Ingress \u002F NetworkPolicy",[39,108,109,112,115],{},[57,110,111],{},"ストレージ",[57,113,114],{},"バインドマウント \u002F ボリューム",[57,116,117],{},"PersistentVolume \u002F PersistentVolumeClaim",[39,119,120,123,132],{},[57,121,122],{},"シークレット",[57,124,125,128,129],{},[75,126,127],{},".env"," ファイル \u002F ",[75,130,131],{},"secrets",[57,133,134],{},"Secret \u002F External Secrets Operator",[39,136,137,140,143],{},[57,138,139],{},"サービスディスカバリ",[57,141,142],{},"コンテナ名 \u002F サービス名",[57,144,145],{},"DNS ベースの Service",[39,147,148,151,154],{},[57,149,150],{},"ローリングアップデート",[57,152,153],{},"なし",[57,155,156],{},"Deployment 戦略で制御",[11,158,159,164],{},[17,160,163],{"href":161,"rel":162},"https:\u002F\u002Fkubernetes.io\u002Fdocs\u002Ftasks\u002Fconfigure-pod-container\u002Ftranslate-compose-kubernetes\u002F",[21],"Kubernetes 公式ドキュメント","では、Kompose を使った変換手順が紹介されていますが、これはあくまで出発点です。",[11,166,167,172],{},[17,168,171],{"href":169,"rel":170},"https:\u002F\u002Fwww.hexabase.com\u002Fproduct\u002Fcaptain-ai\u002F",[21],"Captain.AI"," を活用すれば、Docker Compose ファイルの分析から Kubernetes マニフェストの最適化まで、AI が移行プロセスを支援します。",[25,174,176],{"id":175},"フェーズ1-現状分析とアーキテクチャ監査","フェーズ1: 現状分析とアーキテクチャ監査",[11,178,179],{},"移行の第一歩は、現在の Docker Compose 構成を徹底的に分析することです。",[181,182,183],"h3",{"id":183},"チェックリスト",[185,186,187,199,209,215,227,236],"ul",{},[188,189,190,194,195,198],"li",{},[191,192,193],"strong",{},"サービス依存関係",": ",[75,196,197],{},"depends_on"," で定義された起動順序の把握",[188,200,201,204,205,208],{},[191,202,203],{},"ボリュームマッピング",": 開発用バインドマウント（",[75,206,207],{},".\u002Fsrc:\u002Fapp","）と永続データの区別",[188,210,211,214],{},[191,212,213],{},"ネットワーク構成",": カスタムネットワークとサービス間通信の把握",[188,216,217,194,220,222,223,226],{},[191,218,219],{},"環境変数",[75,221,127],{}," ファイル、",[75,224,225],{},"environment"," ディレクティブ、シークレットの整理",[188,228,229,194,232,235],{},[191,230,231],{},"ビルドコンテキスト",[75,233,234],{},"build"," ディレクティブの有無（K8S ではビルド済みイメージが必要）",[188,237,238,194,241,244,245,248],{},[191,239,240],{},"リソース制約",[75,242,243],{},"mem_limit",", ",[75,246,247],{},"cpus"," などの設定",[250,251,256],"pre",{"className":252,"code":253,"language":254,"meta":255,"style":255},"language-yaml shiki shiki-themes tokyo-night","# 典型的な Docker Compose 構成\nservices:\n  web:\n    build: .\u002Fweb\n    ports:\n      - \"8080:8080\"\n    environment:\n      - database_url=postgres:--db:5432-myapp\n    depends_on:\n      - db\n    volumes:\n      - .-web:-app  # 開発用バインドマウント\n  \n  db:\n    image: postgres:16\n    volumes:\n      - db-data:-var-lib-postgresql-data\n    environment:\n      - POSTGRES_PASSWORD=secret\n\nvolumes:\n  db-data:\n","yaml","",[75,257,258,267,278,286,299,307,323,331,339,347,355,363,374,381,389,400,407,415,422,430,437,445],{"__ignoreMap":255},[259,260,263],"span",{"class":261,"line":262},"line",1,[259,264,266],{"class":265},"sbD-w","# 典型的な Docker Compose 構成\n",[259,268,270,274],{"class":261,"line":269},2,[259,271,273],{"class":272},"s0U2E","services",[259,275,277],{"class":276},"sAklC",":\n",[259,279,281,284],{"class":261,"line":280},3,[259,282,283],{"class":272},"  web",[259,285,277],{"class":276},[259,287,289,292,295],{"class":261,"line":288},4,[259,290,291],{"class":272},"    build",[259,293,294],{"class":276},":",[259,296,298],{"class":297},"sPY7s"," .\u002Fweb\n",[259,300,302,305],{"class":261,"line":301},5,[259,303,304],{"class":272},"    ports",[259,306,277],{"class":276},[259,308,310,314,317,320],{"class":261,"line":309},6,[259,311,313],{"class":312},"sgJMe","      -",[259,315,316],{"class":276}," \"",[259,318,319],{"class":297},"8080:8080",[259,321,322],{"class":276},"\"\n",[259,324,326,329],{"class":261,"line":325},7,[259,327,328],{"class":272},"    environment",[259,330,277],{"class":276},[259,332,334,336],{"class":261,"line":333},8,[259,335,313],{"class":312},[259,337,338],{"class":297}," database_url=postgres:--db:5432-myapp\n",[259,340,342,345],{"class":261,"line":341},9,[259,343,344],{"class":272},"    depends_on",[259,346,277],{"class":276},[259,348,350,352],{"class":261,"line":349},10,[259,351,313],{"class":312},[259,353,354],{"class":297}," db\n",[259,356,358,361],{"class":261,"line":357},11,[259,359,360],{"class":272},"    volumes",[259,362,277],{"class":276},[259,364,366,368,371],{"class":261,"line":365},12,[259,367,313],{"class":312},[259,369,370],{"class":297}," .-web:-app",[259,372,373],{"class":265},"  # 開発用バインドマウント\n",[259,375,377],{"class":261,"line":376},13,[259,378,380],{"class":379},"sGX4V","  \n",[259,382,384,387],{"class":261,"line":383},14,[259,385,386],{"class":272},"  db",[259,388,277],{"class":276},[259,390,392,395,397],{"class":261,"line":391},15,[259,393,394],{"class":272},"    image",[259,396,294],{"class":276},[259,398,399],{"class":297}," postgres:16\n",[259,401,403,405],{"class":261,"line":402},16,[259,404,360],{"class":272},[259,406,277],{"class":276},[259,408,410,412],{"class":261,"line":409},17,[259,411,313],{"class":312},[259,413,414],{"class":297}," db-data:-var-lib-postgresql-data\n",[259,416,418,420],{"class":261,"line":417},18,[259,419,328],{"class":272},[259,421,277],{"class":276},[259,423,425,427],{"class":261,"line":424},19,[259,426,313],{"class":312},[259,428,429],{"class":297}," POSTGRES_PASSWORD=secret\n",[259,431,433],{"class":261,"line":432},20,[259,434,436],{"emptyLinePlaceholder":435},true,"\n",[259,438,440,443],{"class":261,"line":439},21,[259,441,442],{"class":272},"volumes",[259,444,277],{"class":276},[259,446,448,451],{"class":261,"line":447},22,[259,449,450],{"class":272},"  db-data",[259,452,277],{"class":276},[11,454,455,204,458,461,462,465,466,471],{},[191,456,457],{},"重要",[75,459,460],{},".\u002Fweb:\u002Fapp","）は Kubernetes に移行",[191,463,464],{},"できません","。アプリケーションコードはイメージに含める必要があります。",[17,467,470],{"href":468,"rel":469},"https:\u002F\u002Finstitute.sfeir.com\u002Fen\u002Fkubernetes-training\u002Fmigrate-docker-compose-kubernetes-guide-transition\u002F",[21],"SFEIR の移行ガイド","でも、このポイントが強調されています。",[25,473,475],{"id":474},"フェーズ2-kompose-による自動変換","フェーズ2: Kompose による自動変換",[11,477,478,483],{},[17,479,482],{"href":480,"rel":481},"https:\u002F\u002Fkompose.io\u002F",[21],"Kompose"," は、Docker Compose ファイルを Kubernetes マニフェストに自動変換するツールです。",[181,485,486],{"id":486},"インストール",[250,488,492],{"className":489,"code":490,"language":491,"meta":255,"style":255},"language-bash shiki shiki-themes tokyo-night","# macOS\nbrew install kompose\n\n# Linux\ncurl -L https:\u002F\u002Fgithub.com\u002Fkubernetes\u002Fkompose\u002Freleases\u002Fdownload\u002Fv1.34.0\u002Fkompose-linux-amd64 -o kompose\nchmod +x kompose && sudo mv .\u002Fkompose \u002Fusr\u002Flocal\u002Fbin\u002Fkompose\n","bash",[75,493,494,499,511,515,520,537],{"__ignoreMap":255},[259,495,496],{"class":261,"line":262},[259,497,498],{"class":265},"# macOS\n",[259,500,501,505,508],{"class":261,"line":269},[259,502,504],{"class":503},"sE3pS","brew",[259,506,507],{"class":297}," install",[259,509,510],{"class":297}," kompose\n",[259,512,513],{"class":261,"line":280},[259,514,436],{"emptyLinePlaceholder":435},[259,516,517],{"class":261,"line":288},[259,518,519],{"class":265},"# Linux\n",[259,521,522,525,529,532,535],{"class":261,"line":301},[259,523,524],{"class":503},"curl",[259,526,528],{"class":527},"sT800"," -L",[259,530,531],{"class":297}," https:\u002F\u002Fgithub.com\u002Fkubernetes\u002Fkompose\u002Freleases\u002Fdownload\u002Fv1.34.0\u002Fkompose-linux-amd64",[259,533,534],{"class":527}," -o",[259,536,510],{"class":297},[259,538,539,542,545,548,551,554,557,560],{"class":261,"line":309},[259,540,541],{"class":503},"chmod",[259,543,544],{"class":297}," +x",[259,546,547],{"class":297}," kompose",[259,549,550],{"class":276}," &&",[259,552,553],{"class":503}," sudo",[259,555,556],{"class":297}," mv",[259,558,559],{"class":297}," .\u002Fkompose",[259,561,562],{"class":297}," \u002Fusr\u002Flocal\u002Fbin\u002Fkompose\n",[181,564,565],{"id":565},"基本的な変換",[250,567,569],{"className":489,"code":568,"language":491,"meta":255,"style":255},"# docker-compose.yml を Kubernetes マニフェストに変換\nkompose convert\n\n# 出力例:\n# INFO Kubernetes file \"web-service.yaml\" created\n# INFO Kubernetes file \"db-service.yaml\" created\n# INFO Kubernetes file \"web-deployment.yaml\" created\n# INFO Kubernetes file \"db-deployment.yaml\" created\n# INFO Kubernetes file \"db-data-persistentvolumeclaim.yaml\" created\n",[75,570,571,576,584,588,593,598,603,608,613],{"__ignoreMap":255},[259,572,573],{"class":261,"line":262},[259,574,575],{"class":265},"# docker-compose.yml を Kubernetes マニフェストに変換\n",[259,577,578,581],{"class":261,"line":269},[259,579,580],{"class":503},"kompose",[259,582,583],{"class":297}," convert\n",[259,585,586],{"class":261,"line":280},[259,587,436],{"emptyLinePlaceholder":435},[259,589,590],{"class":261,"line":288},[259,591,592],{"class":265},"# 出力例:\n",[259,594,595],{"class":261,"line":301},[259,596,597],{"class":265},"# INFO Kubernetes file \"web-service.yaml\" created\n",[259,599,600],{"class":261,"line":309},[259,601,602],{"class":265},"# INFO Kubernetes file \"db-service.yaml\" created\n",[259,604,605],{"class":261,"line":325},[259,606,607],{"class":265},"# INFO Kubernetes file \"web-deployment.yaml\" created\n",[259,609,610],{"class":261,"line":333},[259,611,612],{"class":265},"# INFO Kubernetes file \"db-deployment.yaml\" created\n",[259,614,615],{"class":261,"line":341},[259,616,617],{"class":265},"# INFO Kubernetes file \"db-data-persistentvolumeclaim.yaml\" created\n",[11,619,620,621,624,625,628,629,632],{},"Kompose は各 Docker Compose サービスから ",[191,622,623],{},"Deployment"," と ",[191,626,627],{},"Service"," の 2 つの Kubernetes リソースを生成します。ボリュームは ",[191,630,631],{},"PersistentVolumeClaim"," に変換されます。",[181,634,636],{"id":635},"kompose-ラベルによるカスタマイズ","Kompose ラベルによるカスタマイズ",[250,638,640],{"className":252,"code":639,"language":254,"meta":255,"style":255},"services:\n  web:\n    image: myapp:latest\n    ports:\n      - \"8080:8080\"\n    labels:\n      kompose.service.type: LoadBalancer\n      kompose.service.expose: \"myapp.example.com\"\n      kompose.image-pull-policy: Always\n",[75,641,642,648,654,663,669,679,686,696,710],{"__ignoreMap":255},[259,643,644,646],{"class":261,"line":262},[259,645,273],{"class":272},[259,647,277],{"class":276},[259,649,650,652],{"class":261,"line":269},[259,651,283],{"class":272},[259,653,277],{"class":276},[259,655,656,658,660],{"class":261,"line":280},[259,657,394],{"class":272},[259,659,294],{"class":276},[259,661,662],{"class":297}," myapp:latest\n",[259,664,665,667],{"class":261,"line":288},[259,666,304],{"class":272},[259,668,277],{"class":276},[259,670,671,673,675,677],{"class":261,"line":301},[259,672,313],{"class":312},[259,674,316],{"class":276},[259,676,319],{"class":297},[259,678,322],{"class":276},[259,680,681,684],{"class":261,"line":309},[259,682,683],{"class":272},"    labels",[259,685,277],{"class":276},[259,687,688,691,693],{"class":261,"line":325},[259,689,690],{"class":272},"      kompose.service.type",[259,692,294],{"class":276},[259,694,695],{"class":297}," LoadBalancer\n",[259,697,698,701,703,705,708],{"class":261,"line":333},[259,699,700],{"class":272},"      kompose.service.expose",[259,702,294],{"class":276},[259,704,316],{"class":276},[259,706,707],{"class":297},"myapp.example.com",[259,709,322],{"class":276},[259,711,712,715,717],{"class":261,"line":341},[259,713,714],{"class":272},"      kompose.image-pull-policy",[259,716,294],{"class":276},[259,718,719],{"class":297}," Always\n",[11,721,722,723,728],{},"ただし、",[17,724,727],{"href":725,"rel":726},"https:\u002F\u002Fsupport.tools\u002Fdocker-compose-to-kubernetes-migration-guide\u002F",[21],"Support Tools の移行ガイド","が指摘するように、Kompose は「機能的なベースを作成するが、本番に最適とは限らない」ため、次のフェーズでの精緻化が必要です。",[25,730,732],{"id":731},"フェーズ3-helm-kustomize-による本番化","フェーズ3: Helm \u002F Kustomize による本番化",[11,734,735,736,741,742,747],{},"Kompose で生成したマニフェストを本番品質に引き上げるには、",[17,737,740],{"href":738,"rel":739},"https:\u002F\u002Fhelm.sh\u002F",[21],"Helm"," または ",[17,743,746],{"href":744,"rel":745},"https:\u002F\u002Fkustomize.io\u002F",[21],"Kustomize"," を活用します。",[181,749,751],{"id":750},"helm-チャートへの移行","Helm チャートへの移行",[250,753,755],{"className":489,"code":754,"language":491,"meta":255,"style":255},"# Helm チャートのスキャフォールド\nhelm create myapp\n\n# ディレクトリ構造\nmyapp\u002F\n  Chart.yaml\n  values.yaml\n  templates\u002F\n    deployment.yaml\n    service.yaml\n    ingress.yaml\n    hpa.yaml\n",[75,756,757,762,773,777,782,787,792,797,802,807,812,817],{"__ignoreMap":255},[259,758,759],{"class":261,"line":262},[259,760,761],{"class":265},"# Helm チャートのスキャフォールド\n",[259,763,764,767,770],{"class":261,"line":269},[259,765,766],{"class":503},"helm",[259,768,769],{"class":297}," create",[259,771,772],{"class":297}," myapp\n",[259,774,775],{"class":261,"line":280},[259,776,436],{"emptyLinePlaceholder":435},[259,778,779],{"class":261,"line":288},[259,780,781],{"class":265},"# ディレクトリ構造\n",[259,783,784],{"class":261,"line":301},[259,785,786],{"class":503},"myapp\u002F\n",[259,788,789],{"class":261,"line":309},[259,790,791],{"class":503},"  Chart.yaml\n",[259,793,794],{"class":261,"line":325},[259,795,796],{"class":503},"  values.yaml\n",[259,798,799],{"class":261,"line":333},[259,800,801],{"class":503},"  templates\u002F\n",[259,803,804],{"class":261,"line":341},[259,805,806],{"class":503},"    deployment.yaml\n",[259,808,809],{"class":261,"line":349},[259,810,811],{"class":503},"    service.yaml\n",[259,813,814],{"class":261,"line":357},[259,815,816],{"class":503},"    ingress.yaml\n",[259,818,819],{"class":261,"line":365},[259,820,821],{"class":503},"    hpa.yaml\n",[11,823,824,827],{},[75,825,826],{},"values.yaml"," で環境ごとの設定値を外部化します:",[250,829,831],{"className":252,"code":830,"language":254,"meta":255,"style":255},"# values.yaml\nreplicaCount: 3\nimage:\n  repository: harbor.example.com\u002Fmyproject\u002Fweb\n  tag: \"1.0.0\"\n  pullPolicy: IfNotPresent\nresources:\n  limits:\n    cpu: 500m\n    memory: 512Mi\n  requests:\n    cpu: 100m\n    memory: 128Mi\ningress:\n  enabled: true\n  hosts:\n    - host: myapp.example.com\n      paths:\n        - path: \u002F\n          pathType: Prefix\n",[75,832,833,838,849,856,866,880,890,897,904,914,924,931,940,949,956,966,973,986,993,1006],{"__ignoreMap":255},[259,834,835],{"class":261,"line":262},[259,836,837],{"class":265},"# values.yaml\n",[259,839,840,843,845],{"class":261,"line":269},[259,841,842],{"class":272},"replicaCount",[259,844,294],{"class":276},[259,846,848],{"class":847},"sOJ5S"," 3\n",[259,850,851,854],{"class":261,"line":280},[259,852,853],{"class":272},"image",[259,855,277],{"class":276},[259,857,858,861,863],{"class":261,"line":288},[259,859,860],{"class":272},"  repository",[259,862,294],{"class":276},[259,864,865],{"class":297}," harbor.example.com\u002Fmyproject\u002Fweb\n",[259,867,868,871,873,875,878],{"class":261,"line":301},[259,869,870],{"class":272},"  tag",[259,872,294],{"class":276},[259,874,316],{"class":276},[259,876,877],{"class":297},"1.0.0",[259,879,322],{"class":276},[259,881,882,885,887],{"class":261,"line":309},[259,883,884],{"class":272},"  pullPolicy",[259,886,294],{"class":276},[259,888,889],{"class":297}," IfNotPresent\n",[259,891,892,895],{"class":261,"line":325},[259,893,894],{"class":272},"resources",[259,896,277],{"class":276},[259,898,899,902],{"class":261,"line":333},[259,900,901],{"class":272},"  limits",[259,903,277],{"class":276},[259,905,906,909,911],{"class":261,"line":341},[259,907,908],{"class":272},"    cpu",[259,910,294],{"class":276},[259,912,913],{"class":297}," 500m\n",[259,915,916,919,921],{"class":261,"line":349},[259,917,918],{"class":272},"    memory",[259,920,294],{"class":276},[259,922,923],{"class":297}," 512Mi\n",[259,925,926,929],{"class":261,"line":357},[259,927,928],{"class":272},"  requests",[259,930,277],{"class":276},[259,932,933,935,937],{"class":261,"line":365},[259,934,908],{"class":272},[259,936,294],{"class":276},[259,938,939],{"class":297}," 100m\n",[259,941,942,944,946],{"class":261,"line":376},[259,943,918],{"class":272},[259,945,294],{"class":276},[259,947,948],{"class":297}," 128Mi\n",[259,950,951,954],{"class":261,"line":383},[259,952,953],{"class":272},"ingress",[259,955,277],{"class":276},[259,957,958,961,963],{"class":261,"line":391},[259,959,960],{"class":272},"  enabled",[259,962,294],{"class":276},[259,964,965],{"class":847}," true\n",[259,967,968,971],{"class":261,"line":402},[259,969,970],{"class":272},"  hosts",[259,972,277],{"class":276},[259,974,975,978,981,983],{"class":261,"line":409},[259,976,977],{"class":312},"    -",[259,979,980],{"class":272}," host",[259,982,294],{"class":276},[259,984,985],{"class":297}," myapp.example.com\n",[259,987,988,991],{"class":261,"line":417},[259,989,990],{"class":272},"      paths",[259,992,277],{"class":276},[259,994,995,998,1001,1003],{"class":261,"line":424},[259,996,997],{"class":312},"        -",[259,999,1000],{"class":272}," path",[259,1002,294],{"class":276},[259,1004,1005],{"class":297}," \u002F\n",[259,1007,1008,1011,1013],{"class":261,"line":432},[259,1009,1010],{"class":272},"          pathType",[259,1012,294],{"class":276},[259,1014,1015],{"class":297}," Prefix\n",[181,1017,1018],{"id":1018},"必須の追加設定",[11,1020,1021],{},"Kompose が自動生成しない、本番環境で必須の設定を追加します:",[250,1023,1025],{"className":252,"code":1024,"language":254,"meta":255,"style":255},"# ヘルスチェック（Probes）\nlivenessProbe:\n  httpGet:\n    path: \u002Fhealthz\n    port: 8080\n  initialDelaySeconds: 15\n  periodSeconds: 10\nreadinessProbe:\n  httpGet:\n    path: \u002Fready\n    port: 8080\n  initialDelaySeconds: 5\n  periodSeconds: 5\n\n# リソース制限\nresources:\n  requests:\n    cpu: 100m\n    memory: 128Mi\n  limits:\n    cpu: 500m\n    memory: 512Mi\n\n# Pod Disruption Budget\napiVersion: policy\u002Fv1\nkind: PodDisruptionBudget\nmetadata:\n  name: web-pdb\nspec:\n  minAvailable: 1\n  selector:\n    matchLabels:\n      app: web\n",[75,1026,1027,1032,1039,1046,1056,1066,1076,1086,1093,1099,1108,1116,1125,1133,1137,1142,1148,1154,1162,1170,1176,1184,1192,1197,1203,1214,1225,1233,1244,1252,1263,1271,1279],{"__ignoreMap":255},[259,1028,1029],{"class":261,"line":262},[259,1030,1031],{"class":265},"# ヘルスチェック（Probes）\n",[259,1033,1034,1037],{"class":261,"line":269},[259,1035,1036],{"class":272},"livenessProbe",[259,1038,277],{"class":276},[259,1040,1041,1044],{"class":261,"line":280},[259,1042,1043],{"class":272},"  httpGet",[259,1045,277],{"class":276},[259,1047,1048,1051,1053],{"class":261,"line":288},[259,1049,1050],{"class":272},"    path",[259,1052,294],{"class":276},[259,1054,1055],{"class":297}," \u002Fhealthz\n",[259,1057,1058,1061,1063],{"class":261,"line":301},[259,1059,1060],{"class":272},"    port",[259,1062,294],{"class":276},[259,1064,1065],{"class":847}," 8080\n",[259,1067,1068,1071,1073],{"class":261,"line":309},[259,1069,1070],{"class":272},"  initialDelaySeconds",[259,1072,294],{"class":276},[259,1074,1075],{"class":847}," 15\n",[259,1077,1078,1081,1083],{"class":261,"line":325},[259,1079,1080],{"class":272},"  periodSeconds",[259,1082,294],{"class":276},[259,1084,1085],{"class":847}," 10\n",[259,1087,1088,1091],{"class":261,"line":333},[259,1089,1090],{"class":272},"readinessProbe",[259,1092,277],{"class":276},[259,1094,1095,1097],{"class":261,"line":341},[259,1096,1043],{"class":272},[259,1098,277],{"class":276},[259,1100,1101,1103,1105],{"class":261,"line":349},[259,1102,1050],{"class":272},[259,1104,294],{"class":276},[259,1106,1107],{"class":297}," \u002Fready\n",[259,1109,1110,1112,1114],{"class":261,"line":357},[259,1111,1060],{"class":272},[259,1113,294],{"class":276},[259,1115,1065],{"class":847},[259,1117,1118,1120,1122],{"class":261,"line":365},[259,1119,1070],{"class":272},[259,1121,294],{"class":276},[259,1123,1124],{"class":847}," 5\n",[259,1126,1127,1129,1131],{"class":261,"line":376},[259,1128,1080],{"class":272},[259,1130,294],{"class":276},[259,1132,1124],{"class":847},[259,1134,1135],{"class":261,"line":383},[259,1136,436],{"emptyLinePlaceholder":435},[259,1138,1139],{"class":261,"line":391},[259,1140,1141],{"class":265},"# リソース制限\n",[259,1143,1144,1146],{"class":261,"line":402},[259,1145,894],{"class":272},[259,1147,277],{"class":276},[259,1149,1150,1152],{"class":261,"line":409},[259,1151,928],{"class":272},[259,1153,277],{"class":276},[259,1155,1156,1158,1160],{"class":261,"line":417},[259,1157,908],{"class":272},[259,1159,294],{"class":276},[259,1161,939],{"class":297},[259,1163,1164,1166,1168],{"class":261,"line":424},[259,1165,918],{"class":272},[259,1167,294],{"class":276},[259,1169,948],{"class":297},[259,1171,1172,1174],{"class":261,"line":432},[259,1173,901],{"class":272},[259,1175,277],{"class":276},[259,1177,1178,1180,1182],{"class":261,"line":439},[259,1179,908],{"class":272},[259,1181,294],{"class":276},[259,1183,913],{"class":297},[259,1185,1186,1188,1190],{"class":261,"line":447},[259,1187,918],{"class":272},[259,1189,294],{"class":276},[259,1191,923],{"class":297},[259,1193,1195],{"class":261,"line":1194},23,[259,1196,436],{"emptyLinePlaceholder":435},[259,1198,1200],{"class":261,"line":1199},24,[259,1201,1202],{"class":265},"# Pod Disruption Budget\n",[259,1204,1206,1209,1211],{"class":261,"line":1205},25,[259,1207,1208],{"class":272},"apiVersion",[259,1210,294],{"class":276},[259,1212,1213],{"class":297}," policy\u002Fv1\n",[259,1215,1217,1220,1222],{"class":261,"line":1216},26,[259,1218,1219],{"class":272},"kind",[259,1221,294],{"class":276},[259,1223,1224],{"class":297}," PodDisruptionBudget\n",[259,1226,1228,1231],{"class":261,"line":1227},27,[259,1229,1230],{"class":272},"metadata",[259,1232,277],{"class":276},[259,1234,1236,1239,1241],{"class":261,"line":1235},28,[259,1237,1238],{"class":272},"  name",[259,1240,294],{"class":276},[259,1242,1243],{"class":297}," web-pdb\n",[259,1245,1247,1250],{"class":261,"line":1246},29,[259,1248,1249],{"class":272},"spec",[259,1251,277],{"class":276},[259,1253,1255,1258,1260],{"class":261,"line":1254},30,[259,1256,1257],{"class":272},"  minAvailable",[259,1259,294],{"class":276},[259,1261,1262],{"class":847}," 1\n",[259,1264,1266,1269],{"class":261,"line":1265},31,[259,1267,1268],{"class":272},"  selector",[259,1270,277],{"class":276},[259,1272,1274,1277],{"class":261,"line":1273},32,[259,1275,1276],{"class":272},"    matchLabels",[259,1278,277],{"class":276},[259,1280,1282,1285,1287],{"class":261,"line":1281},33,[259,1283,1284],{"class":272},"      app",[259,1286,294],{"class":276},[259,1288,1289],{"class":297}," web\n",[11,1291,1292,1295],{},[17,1293,22],{"href":19,"rel":1294},[21]," の Kubernetes 環境では、Helm チャートによるデプロイが標準的なワークフローとなっています。",[25,1297,1299],{"id":1298},"フェーズ4-ストレージとネットワークの移行","フェーズ4: ストレージとネットワークの移行",[181,1301,1302],{"id":1302},"ストレージ移行",[11,1304,1305],{},"Docker Compose のボリュームは Kubernetes の PersistentVolumeClaim（PVC）にマッピングします。",[250,1307,1309],{"className":252,"code":1308,"language":254,"meta":255,"style":255},"apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: db-data\nspec:\n  accessModes:\n    - ReadWriteOnce\n  storageClassName: standard\n  resources:\n    requests:\n      storage: 10Gi\n",[75,1310,1311,1320,1329,1335,1344,1350,1357,1364,1374,1381,1388],{"__ignoreMap":255},[259,1312,1313,1315,1317],{"class":261,"line":262},[259,1314,1208],{"class":272},[259,1316,294],{"class":276},[259,1318,1319],{"class":297}," v1\n",[259,1321,1322,1324,1326],{"class":261,"line":269},[259,1323,1219],{"class":272},[259,1325,294],{"class":276},[259,1327,1328],{"class":297}," PersistentVolumeClaim\n",[259,1330,1331,1333],{"class":261,"line":280},[259,1332,1230],{"class":272},[259,1334,277],{"class":276},[259,1336,1337,1339,1341],{"class":261,"line":288},[259,1338,1238],{"class":272},[259,1340,294],{"class":276},[259,1342,1343],{"class":297}," db-data\n",[259,1345,1346,1348],{"class":261,"line":301},[259,1347,1249],{"class":272},[259,1349,277],{"class":276},[259,1351,1352,1355],{"class":261,"line":309},[259,1353,1354],{"class":272},"  accessModes",[259,1356,277],{"class":276},[259,1358,1359,1361],{"class":261,"line":325},[259,1360,977],{"class":312},[259,1362,1363],{"class":297}," ReadWriteOnce\n",[259,1365,1366,1369,1371],{"class":261,"line":333},[259,1367,1368],{"class":272},"  storageClassName",[259,1370,294],{"class":276},[259,1372,1373],{"class":297}," standard\n",[259,1375,1376,1379],{"class":261,"line":341},[259,1377,1378],{"class":272},"  resources",[259,1380,277],{"class":276},[259,1382,1383,1386],{"class":261,"line":349},[259,1384,1385],{"class":272},"    requests",[259,1387,277],{"class":276},[259,1389,1390,1393,1395],{"class":261,"line":357},[259,1391,1392],{"class":272},"      storage",[259,1394,294],{"class":276},[259,1396,1397],{"class":297}," 10Gi\n",[11,1399,1400,1401,1404],{},"データベースの永続化には ",[191,1402,1403],{},"StatefulSet"," の使用を検討してください。StatefulSet は安定したネットワーク ID と永続ストレージを提供し、データベースワークロードに適しています。",[181,1406,1407],{"id":1407},"シークレット管理",[11,1409,1410,1412],{},[75,1411,127],{}," ファイルのシークレットは Kubernetes Secret に移行します:",[250,1414,1416],{"className":489,"code":1415,"language":491,"meta":255,"style":255},"# Secret の作成\nkubectl create secret generic db-credentials \\\n  --from-literal=POSTGRES_PASSWORD=secure-password\n\n# または External Secrets Operator で外部シークレットストアと連携\n",[75,1417,1418,1423,1442,1447,1451],{"__ignoreMap":255},[259,1419,1420],{"class":261,"line":262},[259,1421,1422],{"class":265},"# Secret の作成\n",[259,1424,1425,1428,1430,1433,1436,1439],{"class":261,"line":269},[259,1426,1427],{"class":503},"kubectl",[259,1429,769],{"class":297},[259,1431,1432],{"class":297}," secret",[259,1434,1435],{"class":297}," generic",[259,1437,1438],{"class":297}," db-credentials",[259,1440,1441],{"class":276}," \\\n",[259,1443,1444],{"class":261,"line":280},[259,1445,1446],{"class":527},"  --from-literal=POSTGRES_PASSWORD=secure-password\n",[259,1448,1449],{"class":261,"line":288},[259,1450,436],{"emptyLinePlaceholder":435},[259,1452,1453],{"class":261,"line":301},[259,1454,1455],{"class":265},"# または External Secrets Operator で外部シークレットストアと連携\n",[11,1457,1458,1463,1464,1469,1470,1475],{},[17,1459,1462],{"href":1460,"rel":1461},"https:\u002F\u002Fwww.vaultproject.io\u002F",[21],"HashiCorp Vault"," や ",[17,1465,1468],{"href":1466,"rel":1467},"https:\u002F\u002Faws.amazon.com\u002Fsecrets-manager\u002F",[21],"AWS Secrets Manager"," との連携には、",[17,1471,1474],{"href":1472,"rel":1473},"https:\u002F\u002Fexternal-secrets.io\u002F",[21],"External Secrets Operator"," が推奨されます。",[181,1477,1478],{"id":1478},"ネットワーキング",[11,1480,1481],{},"Docker Compose のサービス名ベースの通信は、Kubernetes の Service を通じた DNS ベースのサービスディスカバリに移行します:",[250,1483,1485],{"className":252,"code":1484,"language":254,"meta":255,"style":255},"# Docker Compose: DATABASE_URL=postgres:\u002F\u002Fdb:5432\u002Fmyapp\n# Kubernetes:     DATABASE_URL=postgres:\u002F\u002Fdb-service.default.svc.cluster.local:5432\u002Fmyapp\n",[75,1486,1487,1492],{"__ignoreMap":255},[259,1488,1489],{"class":261,"line":262},[259,1490,1491],{"class":265},"# Docker Compose: DATABASE_URL=postgres:\u002F\u002Fdb:5432\u002Fmyapp\n",[259,1493,1494],{"class":261,"line":269},[259,1495,1496],{"class":265},"# Kubernetes:     DATABASE_URL=postgres:\u002F\u002Fdb-service.default.svc.cluster.local:5432\u002Fmyapp\n",[25,1498,1500],{"id":1499},"フェーズ5-テストと段階的ロールアウト","フェーズ5: テストと段階的ロールアウト",[11,1502,1503],{},"移行の最終フェーズでは、段階的なロールアウトとバリデーションを実施します。",[181,1505,1506],{"id":1506},"移行テスト戦略",[1508,1509,1510,1516,1532,1538],"ol",{},[188,1511,1512,1515],{},[191,1513,1514],{},"ステージング環境での検証",": 本番移行前にステージング環境で全機能テスト",[188,1517,1518,194,1521,1463,1526,1531],{},[191,1519,1520],{},"負荷テスト",[17,1522,1525],{"href":1523,"rel":1524},"https:\u002F\u002Fk6.io\u002F",[21],"k6",[17,1527,1530],{"href":1528,"rel":1529},"https:\u002F\u002Flocust.io\u002F",[21],"Locust"," で本番相当の負荷をかけて検証",[188,1533,1534,1537],{},[191,1535,1536],{},"カナリアデプロイ",": トラフィックの一部を新環境に振り向けて段階的に移行",[188,1539,1540,1543],{},[191,1541,1542],{},"ロールバック計画",": 問題発生時に即座に旧環境に切り戻せる手順を準備",[250,1545,1547],{"className":252,"code":1546,"language":254,"meta":255,"style":255},"# カナリアデプロイの例\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: web-canary\nspec:\n  replicas: 1  # トラフィックの一部のみ\n  selector:\n    matchLabels:\n      app: web\n      track: canary\n",[75,1548,1549,1554,1563,1572,1578,1587,1593,1606,1612,1618,1626],{"__ignoreMap":255},[259,1550,1551],{"class":261,"line":262},[259,1552,1553],{"class":265},"# カナリアデプロイの例\n",[259,1555,1556,1558,1560],{"class":261,"line":269},[259,1557,1208],{"class":272},[259,1559,294],{"class":276},[259,1561,1562],{"class":297}," apps\u002Fv1\n",[259,1564,1565,1567,1569],{"class":261,"line":280},[259,1566,1219],{"class":272},[259,1568,294],{"class":276},[259,1570,1571],{"class":297}," Deployment\n",[259,1573,1574,1576],{"class":261,"line":288},[259,1575,1230],{"class":272},[259,1577,277],{"class":276},[259,1579,1580,1582,1584],{"class":261,"line":301},[259,1581,1238],{"class":272},[259,1583,294],{"class":276},[259,1585,1586],{"class":297}," web-canary\n",[259,1588,1589,1591],{"class":261,"line":309},[259,1590,1249],{"class":272},[259,1592,277],{"class":276},[259,1594,1595,1598,1600,1603],{"class":261,"line":325},[259,1596,1597],{"class":272},"  replicas",[259,1599,294],{"class":276},[259,1601,1602],{"class":847}," 1",[259,1604,1605],{"class":265},"  # トラフィックの一部のみ\n",[259,1607,1608,1610],{"class":261,"line":333},[259,1609,1268],{"class":272},[259,1611,277],{"class":276},[259,1613,1614,1616],{"class":261,"line":341},[259,1615,1276],{"class":272},[259,1617,277],{"class":276},[259,1619,1620,1622,1624],{"class":261,"line":349},[259,1621,1284],{"class":272},[259,1623,294],{"class":276},[259,1625,1289],{"class":297},[259,1627,1628,1631,1633],{"class":261,"line":357},[259,1629,1630],{"class":272},"      track",[259,1632,294],{"class":276},[259,1634,1635],{"class":297}," canary\n",[11,1637,1638,1639,1642,1643,1648],{},"中規模アプリケーションの場合、移行全体で ",[191,1640,1641],{},"2〜4 週間","を計画するのが妥当です。",[17,1644,1647],{"href":1645,"rel":1646},"https:\u002F\u002Fdasroot.net\u002Fposts\u002F2026\u002F03\u002Fmigrating-docker-compose-kubernetes-helm-kustomize\u002F",[21],"dasroot の移行ガイド","でも同様のタイムラインが推奨されています。",[25,1650,1652],{"id":1651},"まとめ-計画的な移行で本番-kubernetes-へ","まとめ: 計画的な移行で本番 Kubernetes へ",[11,1654,1655],{},"Docker Compose から Kubernetes への移行は、以下の 5 フェーズで計画的に進めましょう:",[1508,1657,1658,1664,1670,1676,1682],{},[188,1659,1660,1663],{},[191,1661,1662],{},"現状分析",": Docker Compose 構成の棚卸しと依存関係の整理",[188,1665,1666,1669],{},[191,1667,1668],{},"自動変換",": Kompose による初期マニフェスト生成",[188,1671,1672,1675],{},[191,1673,1674],{},"本番化",": Helm\u002FKustomize での Probes、リソース制限、Ingress 追加",[188,1677,1678,1681],{},[191,1679,1680],{},"ストレージ・ネットワーク移行",": PVC、Secret、Service の設定",[188,1683,1684,1687],{},[191,1685,1686],{},"段階的ロールアウト",": ステージング検証、カナリアデプロイ、負荷テスト",[11,1689,1690,1693,1694,1697],{},[17,1691,22],{"href":19,"rel":1692},[21]," は、Docker Compose からの移行先として最適な Kubernetes 基盤を提供しています。",[17,1695,171],{"href":169,"rel":1696},[21]," による AI 支援で、Kubernetes マニフェストの生成から運用の自動化まで、移行プロセス全体をサポートします。",[11,1699,1700,1701,1706],{},"Kubernetes への移行をご検討の方は、ぜひ",[17,1702,1705],{"href":1703,"rel":1704},"https:\u002F\u002Fwww.hexabase.com\u002Fcontact-us\u002F",[21],"お問い合わせ","ください。",[1708,1709,1710],"style",{},"html pre.shiki code .sbD-w, html code.shiki .sbD-w{--shiki-default:#51597D;--shiki-default-font-style:italic}html pre.shiki code .s0U2E, html code.shiki .s0U2E{--shiki-default:#F7768E}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sPY7s, html code.shiki .sPY7s{--shiki-default:#9ECE6A}html pre.shiki code .sgJMe, html code.shiki .sgJMe{--shiki-default:#9ABDF5}html pre.shiki code .sGX4V, html code.shiki .sGX4V{--shiki-default:#A9B1D6}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sE3pS, html code.shiki .sE3pS{--shiki-default:#C0CAF5}html pre.shiki code .sT800, html code.shiki .sT800{--shiki-default:#E0AF68}html pre.shiki code .sOJ5S, html code.shiki .sOJ5S{--shiki-default:#FF9E64}",{"title":255,"searchDepth":269,"depth":269,"links":1712},[1713,1714,1717,1722,1726,1731,1734],{"id":27,"depth":269,"text":28},{"id":175,"depth":269,"text":176,"children":1715},[1716],{"id":183,"depth":280,"text":183},{"id":474,"depth":269,"text":475,"children":1718},[1719,1720,1721],{"id":486,"depth":280,"text":486},{"id":565,"depth":280,"text":565},{"id":635,"depth":280,"text":636},{"id":731,"depth":269,"text":732,"children":1723},[1724,1725],{"id":750,"depth":280,"text":751},{"id":1018,"depth":280,"text":1018},{"id":1298,"depth":269,"text":1299,"children":1727},[1728,1729,1730],{"id":1302,"depth":280,"text":1302},{"id":1407,"depth":280,"text":1407},{"id":1478,"depth":280,"text":1478},{"id":1499,"depth":269,"text":1500,"children":1732},[1733],{"id":1506,"depth":280,"text":1506},{"id":1651,"depth":269,"text":1652},"2026-05-27","Docker Compose で動作するアプリケーションを Kubernetes に移行するステップバイステップガイド。Kompose による変換、Helm\u002FKustomize での本番化、移行時の注意点を網羅的に解説。","md","ja",{},"\u002Fblog\u002Fja\u002Fdocker-compose-to-kubernetes-migration",{"title":5,"description":1736},"blog\u002Fja\u002Fdocker-compose-to-kubernetes-migration",[47,50,1744,482,740,746,1745],"移行","コンテナオーケストレーション","wIVNJ-tZfdN93k2Zax_X6RqNv1LYggM6xUcHp1lhxjg",1779964617052]