ãã®èšäºã§ã¯ã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ã®æ§æãã¡ã€ã«ã¯å€å°æç¢ºã«ãªããŸãããããã€ãã®è©³çŽ°ã«æ³šæããå¿
èŠããããŸãã
context: ./web
ããã¯ããªããžããªå
ã®context: ./web
ãµãŒãã¹ãã¡ã€ã«ãžã®ãã¹ã瀺ããŸããdockerfile: Dockerfile.dev
äœæ¥ç°å¢çšã«å¥åã®Dockerfile.devã䜿çšããŸãã ãå®çšŒåãç°å¢ã§ã¯ãã³ãŒããDockerã€ã¡ãŒãžã«ã³ããŒããå®çšŒåç°å¢ã§ã¯ãããªã¥ãŒã ããšããŠã³ãŒãã远å ããŸãã ãããªã¥ãŒã ãã䜿çšããå Žåãã³ãŒãã®å€æŽåŸã«æ¯ådocker-composeãåèµ·åããå¿
èŠã¯ãããŸãããvolumes: - "./web/src:/web/src"
-ããã¯ãã³ãŒããDockerã§ãããªã¥ãŒã ããšããŠè¿œå ãããæ¹æ³ã§ãã- 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ã€ã®ãã€ã³ãã§æ§æãããŠããŸãã
- DockerãšDocker-composeãã€ã³ã¹ããŒã«ãã
- ãªããžããªã®ã¯ããŒã³
- ã¿ãŒããã«
./bin/start.sh
å®è¡ããŸã
ãã®èšäºãçè§£ããããããããã«ãGithubã«ãµã³ãã«ãããžã§ã¯ãããããŸãã ããªãã®çµéšãå
±æãã 質åãããŠãã ããã
ãã®èšäºãæçšã§ããããããžã§ã¯ãã®æ¹åã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸã:)
è±èªçã¯ãã¡ãã§èªãããšãã§ããŸã ã