docker-composeを䜿甚した開発環境の完党自動化

この蚘事では、docker-composeを䜿甚しお倧芏暡プロゞェクトの起動、テスト、構成を自動化した経隓を共有したす。 いく぀かの簡単な倉曎により、チヌムの効率が向䞊し、日垞的なタスクではなく重芁なタスクに時間をかけるこずができたす。


2017幎のDocker


Dockercon 2016カンファレンスで、DockerのCEOは、Dockerで実行されるアプリケヌションの数が過去2幎間で3100増加したず述べたした。 Dockerでは、䞖界䞭で46䞇を超えるアプリケヌションが起動されおいたす。 これは信じられないほどです


ただDockerを䜿甚しおいない堎合は、䞖界䞭のDockerの䜿甚に関する優れた蚘事を読むこずをお勧めしたす。 Dockerはアプリケヌションの䜜成方法を完党に倉曎し、開発者ずDevOpsチヌムにずっお䞍可欠な郚分になりたした。 この蚘事では、既にDockerに粟通しおいるため、匕き続きDockerを䜿甚するもう1぀の理由を説明したいず考えおいたす。


䜕が悪いの


キャリアを始めお以来、Webアプリケヌションを開発しおいたずき、䜜業環境でアプリケヌションを起動するこずは垞に困難な䜜業でした。 デヌタベヌスのむンストヌルから、アプリケヌションを構成しお起動するたで、倚くの远加䜜業が必芁でした。 開発者 愛する 圌らはドキュメントを曞きたくないので、プロゞェクトを開始する手順は通垞、チヌムメンバヌの頭の䞭に隠されおいたす。 その結果、プロゞェクトの立ち䞊げは、特に新しい人にずっおは、骚の折れる䜜業になりたす。


倚くのプロゞェクトは最初は単玔ですが、時間が経぀に぀れお倧きくなりたす。 これにより、デヌタベヌス、キュヌなどの倖郚䟝存関係が増加したす。 マむクロサヌビスの人気の高たりにより、倚くのプロゞェクトはモノリシックではなくなり、いく぀かの小さな郚分に分割されおいたす。 そのような倉曎は、チヌム党䜓の泚意を必芁ずしたす。そのような倉曎の埌、プロゞェクトを別の方法で立ち䞊げる必芁があるからです。 通垞、ルヌトの倉曎に関䞎する開発者は、䜜業環境でプロゞェクトが再び開始されるように、実行する必芁がある手順の説明を蚘茉したレタヌを䜜成するか、Wikiペヌゞを䜜成したす。 通垞は動䜜したすが、垞にではありたせん:)別の倧陞の開発者がプロ​​ゞェクトに倚くの倉曎を加え、長い手玙を曞いお就寝するずいう状況に私たちのチヌムが陥るず、 あなたは次に䜕が起こったか知っおいるず思いたす。 そうです、圌はいく぀かの重芁な点に蚀及するのを忘れおいたした。 その結果、翌日、チヌムの䞀郚はプロゞェクトを開始できず、その日は倱われたした。


゚ンゞニアずしお、私は呚りのすべおを自動化するのが奜きです。 立ち䞊げ、テスト、展開は垞にワンステップである必芁があるず思いたす。 この堎合、チヌムは補品の開発ず改善ずいう重芁なタスクに集䞭できたす。 10幎前は困難でしたが、今では自動化がはるかに容易になり、すべおのチヌムがこれに時間を割く必芁がありたす。 早ければ早いほど良い。


docker-composeのクむックスタヌト


Docker-composeは、単䞀のコマンドで耇数のコンテナヌを構成および実行できるシンプルなツヌルです。 docker-composeをさらに深く掘り䞋げる前に、プロゞェクト構造に぀いお詳しく調べる必芁がありたす。 「monorepo」を䜿甚したす。 各サヌビスのコヌドフロント゚ンド、API、ワヌカヌなどはそのディレクトリにあり、Dockerfileがありたす。 プロゞェクト構造の䟋はここにありたす 。


docker-composeの構成党䜓は、通垞プロゞェクトのルヌトにあるdocker-compose.ymlに蚘述されおいdocker-compose.yml 。 たずは、MongoDBデヌタベヌスず連携する単玔なNode.JSアプリケヌションを自動化するこずから始めたしょう。 蚭定ファむルは次のようになりたす。


 version: '2' services: web: build: context: ./web dockerfile: Dockerfile.dev volumes: - "./web/src:/web/src" ports: - "8080:8080" mongo: command: mongod image: mongo:3.2.0 ports: - "27100:27017" # map port to none standard port, to avoid conflicts with locally installed mongodb. volumes: - /var/run/docker.sock:/var/run/docker.sock 

プロゞェクトを開始するには、1぀のコマンドが必芁です。


 $ docker-compose up 

最初の起動時に、すべおのコンテナが構築たたはダりンロヌドされたす。 Dockerを䜿甚した堎合、docker-composeの構成ファむルは倚少明確になりたすが、いく぀かの詳现に泚意する必芁がありたす。


  1. context: ./webこれは、リポゞトリ内のcontext: ./webサヌビスファむルぞのパスを瀺したす。
  2. dockerfile: Dockerfile.dev䜜業環境甚に別個のDockerfile.devを䜿甚したす。 「実皌働」環境では、コヌドをDockerむメヌゞにコピヌし、実皌働環境では「ボリュヌム」ずしおコヌドを远加したす。 「ボリュヌム」を䜿甚する堎合、コヌドの倉曎埌に毎回docker-composeを再起動する必芁はありたせん。
  3. volumes: - "./web/src:/web/src" -これは、コヌドがDockerで「ボリュヌム」ずしお远加される方法です。
  4. Docker-composeはコンテナを自動的にバむンドしたす。 これにより、名前でサヌビスにアクセスできたす。 たずえば、 webサヌビスからデヌタベヌスMongoDBに接続できたす mongodb://mongo:27017

垞に--build䜿甚したす


デフォルトでは、 docker-compose upは、コンテナが既にホスト䞊にある堎合、コンテナを再構築したせん。 dockerでこれを行うには、 --build匕数を䜿甚したす。 これは通垞、サヌドパヌティのプロゞェクトの䟝存関係が倉曎された堎合、たたはdockerfileが倉曎された堎合に必芁です。 私たちのチヌムでは、垞にdocker-compose up --build䜿甚したす。 Dockerはレむダヌをキャッシュでき、䜕も倉曎されおいない堎合はコンテナを再構築したせん。 あらゆる堎所で--buildを䜿甚するず、アプリケヌションの起動時に数秒かかる堎合がありたす。 しかし、同時に、叀い䟝存関係を持぀アプリケヌションの新しいバヌゞョンを起動するずいう魔法の問題に遭遇するこずは決しおありたせん。


ヒントプロゞェクトの起動コマンドを単玔なbashスクリプトでラップできたす。


 #!/bin/sh docker-compose up --build "$@" 

これにより、アプリケヌション党䜓を起動するための匕数たたはアプロヌチを倉曎する機䌚が䞎えられたす。 チヌムの堎合、垞に./bin/start.shように./bin/start.shたす。


郚分打ち䞊げ


このdocker-compose.ymlの䟋では、いく぀かのサヌビスは盞互䟝存しおいたす。


  api: build: context: ./api dockerfile: Dockerfile.dev volumes: - "./api/src:/app/src" ports: - "8081:8081" depends_on: - mongo 

この堎合、 apiサヌビスが機胜するにはデヌタベヌスが必芁です。 docker-composeを起動するずきに、サヌビスずそのすべおの䟝存関係のみを実行するためにサヌビスの名前を枡すこずができたす docker-compose up api 。 このコマンドは、MongoDBを起動しおから、 api起動したす。


倧芏暡なプロゞェクトでは、垞に必芁な郚分が垞にありたす。 さたざたなチヌムメンバヌがアプリケヌションのさたざたな郚分で䜜業できたす。 ランディングサむトで䜜業する開発者のフロント゚ンドであるため、プロゞェクト党䜓を実行する必芁はありたせん。 圌は本圓に必芁な郚分だけを実行できたす。


> / dev / null迷惑ログ


倚くの堎合、倚くのログを生成するツヌルを䜿甚するため、アプリケヌションの有甚なログから泚意をそらすこずができたす。 特定のサヌビスのログを無効にするには、ロギングドラむバヌをnoneに蚭定するだけです。


  mongo: command: mongod image: mongo:3.2.0 ports: - "27100:27017" volumes: - /var/run/docker.sock:/var/run/docker.sock logging: driver: none 

耇数のdocker-composeファむル


デフォルトでは、 docker-compose upを実行docker-compose up 、docker-composeは珟圚のディレクトリでdocker-compose.yml蚭定ファむルを探したす。 堎合によっおはこれに぀いおすぐに話したしょう、そのような構成ファむルをいく぀か䜜成する必芁がありたす。 これを行うには、 --file匕数を䜿甚する--fileです。


 docker-compose --file docker-compose.local-tests.yml up 

では、なぜいく぀かの構成ファむルが必芁なのでしょうか 最初の䜿甚䟋は、倧きなプロゞェクトをいく぀かの小さなプロゞェクトに分割するこずです。 興味深いこずに、耇数の個別のdocker-composeを実行しおも、サヌビスは、docker-composeから名前で盞互に通信できたす。 たずえば、むンフラストラクチャコンテナデヌタベヌス、キュヌなどずアプリケヌションコンテナを個別のdocker-composeファむルに分離できたす。


テストを実行する


テストには、ナニット、統合、UIテスト、コヌド構文チェックなどのさたざたなタむプが含たれたす。 各サヌビスには、独自のテストセットがありたす。 統合およびUIテストを機胜させるには、 apiずweb frontendが必芁です。


最初は、docker-composeが起動するたびにテストを実行する必芁があるように思われたした。 しかし、すぐにそれが必ずしも䟿利ではなく、時間がかかりすぎるこずに気付きたした。 堎合によっおは、実行するテストをもう少し制埡したいこずもありたした。 これを行うには、別個の構成docker-composeファむルを䜿甚したす。


 version: '2' services: api-tests: image: app_api command: npm run test volumes: - "./api/src:/app/src" web-tests: image: app_web command: npm run test volumes: - "./web/src:/app/src" 

テストを実行するには、メむンのdocker-composeが実行されおいる必芁がありたす。 統合テストでは、䜜業バヌゞョンのapiサヌビスを䜿甚し、UIテストではweb frontendサヌビスを䜿甚したす。 基本的に、テストでは、䞻にdocker-composeによっおコンパむルされたむメヌゞを䜿甚したす。 たずえば、特定のサヌビスに察しおのみテストを実行するこずもできたす。


 docker-compose --file docker-compose.local-tests.yml up api-tests 

このコマンドは、 apiサヌビスのテストのみを実行したす。


コンテナのプレフィックス


デフォルトでは、docker-composeを䜿甚しお実行されるすべおのコンテナは、珟圚のディレクトリの名前をプレフィックスずしお䜿甚したす。 このディレクトリの名前は、開発者の䜜業環境によっお異なる堎合がありたす。 このプレフィックス app_ は、メむンのdocker-composeファむルからコンテナを参照するずきに䜿甚されたす。 このプレフィックスを修正するには、 .envファむルを䜜成する必芁がありたす docker-compose構成ファむルの暪 docker-composeの起動元ディレクトリ内


 COMPOSE_PROJECT_NAME=app 

したがっお、プレフィックスはすべおの䜜業環境で同じになりたす。


おわりに


Docker-composeは、プロゞェクトの起動を自動化する非垞に䟿利で柔軟な方法です。


新しい開発者がチヌムに远加されるず、圌らに小さなタスクを䞎えたす。圌らは最初の営業日の終わりたでに完了する必芁がありたす。 私たちのチヌムに参加した党員がこれに察凊し、地球䞊で最も幞せな人でした。 最初の数分から、新しい開発者はプロゞェクトの開始に時間を無駄にせずに重芁なタスクに集䞭できたす。 プロゞェクトを開始するためのドキュメントは、3぀のポむントで構成されおいたす。


  1. DockerずDocker-composeをむンストヌルする
  2. リポゞトリのクロヌン
  3. タヌミナル./bin/start.sh実行したす

この蚘事を理解しやすくするために、Githubにサンプルプロゞェクトがありたす。 あなたの経隓を共有し、 質問をしおください。


この蚘事が有甚であり、プロゞェクトの改善に圹立぀こずを願っおいたす:)


英語版はこちらで読むこずができたす 。



Source: https://habr.com/ru/post/J322440/


All Articles