Docker compose 기초
단일 노드에서 container 끼리의 의존관계를 해결하기 위해 docker-compose
를 사용한다.
여러 노드에서는
docker-swarm
설치하자
#download
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#apply execute permission
sudo chmod +x /usr/local/bin/docker-compose
#make link
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
기본 커맨드 정리
기본 컴포즈 파일명은 docker-compose.yml
또는 docker-compose.yaml
이다. 없다면 -f
옵션으로 파일을 지정하자.
커맨드 바로 뒤에 넣으면 되는듯 하다. docker-compose -f <FILE> up
이런식
docker-compose up [options] [–scale SERVICE=NUM…] [SERVICE…]
Builds, (re)creates, starts, and attaches to containers for a service. Unless they are already running, this command also starts any linked services.
buld, create, start 까지 다 해준다.
docker-compose down [options]
Stops containers and removes containers, networks, volumes, and images created by up.
up
커맨드로 생성된 컨테이너/네트워크/볼륨/이미지를 다 지운다.
docker-compose ps [options] [SERVICE…]
docker-compose build
이건 뭔지 모르겠다.
docker-compose create
This command is deprecated. Use the up command with –no-start instead.
서비스를 위한 컨테이너를 생성한다. deprecated
되었다. up
커맨드의 --no-start
옵션을 사용하자.
기본 커맨드 up/down/restart
$ docker-compose -f <COMPOSE-FILE-PATH> up -d --scale <SERVICE-NAME>=<SCALE-NUMBER>
#-f : compose File
#-d : detached
$ docker-compose -f <COMPOSE-FILE-PATH> down
$ docker-compose -f <COMPOSE-FILE-PATH> restart <SERVICE-NAME>
실습 - 단순 서비스 - subicura/whoami
container 간의 의존관계가 없는 단순한 whoami
(http:4567 요청 시인스턴스의 해쉬값 반환) 서비스들을 구성해보자.
먼저 container 들을 정의한 .yaml
/.yml
파일이 필요하다.
분명
yaml
이 표준이라는 것 같은데 대부분yml
을 사용한다.. 그리고vim
에디터에서 yaml indent 가 왜이렇게 넓은지 모르겠다..
아래 예제에는 subicura
님의 docker hub 이미지를 사용했다.
docker-compose-whoami.yaml
version: '3'
services:
whoami1:
image: subicura/whoami:1
ports:
- "4500:4567"
whoami2:
image: subicura/whoami:1
ports:
- "4501:4567"
만든 파일로 실행
$ docker-compose -f docker-compose-whoami.yaml up -d
#-f : file
#-d : detached
실행된 container 들을 확인해보자
$ docker-compose -f docker-compose-whoami.yaml ps
Name Command State Ports
------------------------------------------------------------------------------------
ec2-user_whoami1_1 /bin/sh -c bundle exec rub ... Up 0.0.0.0:4500->4567/tcp
ec2-user_whoami2_1 /bin/sh -c bundle exec rub ... Up 0.0.0.0:4501->4567/tcp
$ curl localhost:4500
2240f99b5b27
$ curl localhost:4501
d2a4026413e8
실행된 container 중지 및 삭제
$ docker-compose -f docker-compose-whoami.yaml down
Stopping ec2-user_whoami1_1 ... done
Stopping ec2-user_whoami2_1 ... done
WARNING: Found orphan containers (ec2-user_redis1_1, ec2-user_counter1_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing ec2-user_whoami1_1 ... done
Removing ec2-user_whoami2_1 ... done
Removing network ec2-user_default
$ docker-compose -f docker-compose-whoami.yaml ps
Name Command State Ports
------------------------------
응용 서비스 - subicura/counter
container 간의 의존관계가 있는 서비스를 구성해보자.
요청할때마다 증가시킨 counter 값을 반환하며 증가시킨 counter 를 redis
에 저장하는 서비스를 구성해보자.
docker-compose-counter.yaml
version: '3'
services:
counter1:
image: subicura/counter
ports:
- "4600:4567"
networks:
- internal-redis
environment:
- "REDIS_HOST=redis1"
redis1:
image: redis:latest
networks:
- internal-redis
networks:
internal-redis:
driver: bridge
실행하자
$ docker-compose -f docker-compose-counter.yaml up -d
확인하자
$ docker-compose -f docker-compose-counter.yaml ps
Name Command State Ports
-------------------------------------------------------------------------------------
ec2-user_counter1_1 /bin/sh -c bundle exec rub ... Up 0.0.0.0:4600->4567/tcp
ec2-user_redis1_1 docker-entrypoint.sh redis ... Up 6379/tcp
$ curl localhost:4600
abc023f9c363 > 8
$ curl localhost:4600
abc023f9c363 > 9
$ curl localhost:4600
abc023f9c363 > 10
counter 값이 증가하는 것을 볼 수 있다. docker-compose 로 구성된 서비스들은 따로 docker network 를 생성하지 않아도 한 네트워크로 묶이게 된다고 한다.
By default Compose sets up a single network for your app 출처
scale up
docker-compose -f docker-compose-counter.yaml up -d -scale counter1=5
etc
docker-compose 자원(service/network/volume) 에 prefix 가 붙어요
docker compose 는 compose file 이 존재하는 폴더의 이름을 프로젝트명으로 인식하고 모든 자원 앞에 prefix 로 붙인다.
바꾸고 싶다면,
- docker-compose up 의 옵션으로 -p, –project-name 옵션으로 명시한다.
- docker compose 3.5 버전 이후로는 각 자원에 name 을 붙여주면, 해당 name 으로 자원이 생성된다.
name 을 사용하여 kafka-network 라는 network 를 만들고 싶다면,
version: '3.5'
services:
zookeeper:
image: zookeeper:3.4
ports:
- "2181:2181"
networks:
- kafka
networks:
kafka:
name: kafka-network
출처