✔️ Docker Compose
Compose file version 3 reference | Docker Documentation
Docker의 IaC - yaml 코드를 이용해 컨테이너를 어떻게 실행할 것인지를 정의한다.
그것을 Docker compose file이라고 한다.
docker-compose
예전 명령어docker compose
로 변경되었다.
Docker Compose 파일은 이름이 정해져있다.docker-compose.yaml
또는 docker-compose.yml
✔️ example 1
vagrant@docker ~ cd compose
vagrant@docker ~/compose mkdir example1
vagrant@docker ~/compose cd example1
vagrant@docker ~/compose/example1 vi docker-compose.yaml
`docker-compose.yaml`
version: '3' # 3 버전에서 사용할 수 있는 최신 버전을 알아서 지정한다.
services: # 컨테이너를 서비스라는 개념으로 사용한다.
web: # 컨테이너의 이름
image: httpd # 이 컨테이너를 실행하기 위한 이미지를 지정, 태그 존재시 태그를 붙인다.
- up : 컨테이너를 create, start 한다.
- down : 리소스를 삭제한다. (네트워크, 컨테이너를 모두 삭제)
- run : 이미 만들어진 것을 실행한다.
vagrant@docker ~/compose/example1 docker compose up -d
[+] Running 2/2 # 2개가 실행되었다. 네트워크 example1_default
⠿ Network example1_default Created 0.0s
⠿ Container example1-web-1 Started 0.4s
example1_default 이라고 붙은 이유는 project의 이름이 붙기 때문이다.
네트워크에 이름을 지정하면 default가 아닌 지정한 이름으로 생성된다.
vagrant@docker ~/compose/example1 docker network ls
NETWORK ID NAME DRIVER SCOPE
c65813723b2a bridge bridge local
1333adaa698f example1_default bridge local
4159dc8b15f3 host host local
42eb99a7c805 none null local
dd8cb6c53e9b wordpress-network bridge local
docker network ls
를 실행하면 생성한 default 네트워크가 존재한다.
Docker Compose는 매번 컨테이너를 실행하기 위한 브릿지 타입 네트워크를 만든다.
example1-web-1 : example1이라고 하는 것은 디렉토리명이며 web이라는 서비스명이 들어가게 되고 첫번째라는 1이 붙는다.
vagrant@docker ~/compose/example1 docker compose ls # 서비스의 목록
NAME STATUS CONFIG FILES
example1 running(1) /home/vagrant/compose/example1/docker-compose.yaml
vagrant@docker ~/compose/example1 docker compose ps #컨테이너의 목록
NAME COMMAND SERVICE STATUS PORTS
example1-web-1 "httpd-foreground" web running 80/tcp
✔️ Docker Compose Lifecycle
vagrant@docker ~/compose/example1 docker compose stop
[+] Running 1/1
⠿ Container example1-web-1 Stopped 1.1s
vagrant@docker ~/compose/example1 docker compose ps
NAME COMMAND SERVICE STATUS PORTS
example1-web-1 "httpd-foreground" web exited (0)
vagrant@docker ~/compose/example1 docker compose start
[+] Running 1/1
⠿ Container example1-web-1 Started 0.3s
vagrant@docker ~/compose/example1 docker compose down
[+] Running 2/2
⠿ Container example1-web-1 Removed 1.2s
⠿ Network example1_default Removed 0.1s
✔️ example 2
docker-compose.yaml
version: '3'
services:
web:
image: httpd
restart: always # 재시작 정책
ports:
- 80:80 # 포트 포워딩
environment: # 환경 변수
MSG: hello world
volumes: # 연결할 볼륨
- web-contents:/var/www/html
networks: # 연결할 네트워크
- web-net # 서비스의 네트워크를 어떤 네트워크에 연결시킬 것인가
web2:
image: nginx
networks: # 네트워크 설정
- web-net
volumes:
web-contents: # 해당 이름의 볼륨이 만들어진다.
networks:
web-net: # 생성하고자 할 네트워크명
vagrant@docker ~/compose/example2 docker compose up -d
[+] Running 4/4
⠿ Network example2_web-net Created 0.0s
⠿ Volume "example2_web-contents" Created 0.0s
⠿ Container example2-web2-1 Started 0.5s
⠿ Container example2-web-1 Started 0.4s
vagrant@docker ~/compose/example2 docker compose ls
NAME STATUS CONFIG FILES
example2 running(2) /home/vagrant/compose/example2/docker-compose.yaml
vagrant@docker ~/compose/example2 docker compose ps
NAME COMMAND SERVICE STATUS PORTS
example2-web-1 "httpd-foreground" web running 0.0.0.0:80->80/tcp, :::80->80/tcp
example2-web2-1 "/docker-entrypoint.…" web2 running 80/tcp
vagrant@docker ~/compose/example2 docker network ls
NETWORK ID NAME DRIVER SCOPE
c65813723b2a bridge bridge local
f82faa7d09e2 example2_web-net bridge local
4159dc8b15f3 host host local
42eb99a7c805 none null local
dd8cb6c53e9b wordpress-network bridge local
vagrant@docker ~/compose/example2 docker volume ls
DRIVER VOLUME NAME
local bdd8ef51490eadd328df3f0014efdf98e6e0fe2b14ff4cff6af5ef62a0a82046
local example2_web-contents
vagrant@docker ~/compose/example2 docker compose exec
requires at least 2 arg(s), only received 0
vagrant@docker ~/compose/example2 docker compose exec web bash
root@9d9249616b16:/usr/local/apache2# echo $MSG
hello world
root@9d9249616b16:/usr/local/apache2# curl
bash: curl: command not found
root@9d9249616b16:/usr/local/apache2# apt update; apt install curl
root@9d9249616b16:/usr/local/apache2# curl web2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@9d9249616b16:/usr/local/apache2#
curl 명령어를 사용하여 web2와 통신한다.
접속한 컨테이너는 web이지만 web2와 통신할 수 있다.
docker 명령에서는 --link
옵션을 붙여야 했지만 Docker Compose로 배포한 컨테이너는 서로를 이름으로 가리킬 수 있다.
Docker Compose도 links
라는 옵션이 있긴 하지만 사용할 필요가 없다. (옛날 기능이다.)
기본적으로 Docker Compose에서는 서로(ex. web, web2)를 이름으로 가리켜 통신할 수 있다.
도커 컴포즈로 배포한 컨테이너는 서로 이름으로 통신할 수 있다.
✔️ example 3
version: '3'
services:
myflask:
build: ./hello-flask
mydjango:
build: ./hello-django
기존 이미지를 사용할 수도 있고 Dockerfile로 바로 빌드해서 사용할 수도 있다.
vagrant@docker ~/compose mkdir example3
vagrant@docker ~/compose cd example3
vagrant@docker ~/compose/example3 cp -r ~/python/hello-django .
vagrant@docker ~/compose/example3 cp -r ~/python/hello-flask .
vagrant@docker ~/compose/example3 ls
hello-django hello-flask
vagrant@docker ~/compose/example3 ls hello-django
Dockerfile djangoapp mysite requirements.txt
vagrant@docker ~/compose/example3 ls hello-flask
Dockerfile __pycache__ hello.py requirements.txt templates venv
vagrant@docker ~/compose/example3 docker compose up -d
vagrant@docker ~/compose/example3 docker compose ps
NAME COMMAND SERVICE STATUS PORTS
example3-mydjango-1 "python3 manage.py r…" mydjango running 8000/tcp
example3-myflask-1 "python3 -m flask ru…" myflask running 5000/tcp
코드를 짜고 도커 이미지로 빌드하고 테스트하고 빌드하고 런해서 확인하고 이런 일련의 과정들을
Docker Compose를 사용하면 빠르게 확인할 수 있다.
Docker Compose는 이미지를 만들어서 테스트하는 용도 그 이상도 그 이하도 아니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker Compose를 이용해 Wordpress 배포하기 (0) | 2022.05.15 |
---|---|
[Docker] Docker를 이용하여 wordpress 배포하기 (0) | 2022.05.15 |
[Docker] Docker Hub 사용법 (0) | 2022.05.12 |
[Docker] node.js App을 Docker Image로 빌드하기 (0) | 2022.05.12 |
[Docker] Web App을 Docker Image로 빌드하기 (0) | 2022.05.12 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!