우리는 wordpress + database 환경을 만들어보았다
일반적으로 웹 서비스는 3tier 구조를 갖는다
WEB server - WAS server - Database
- 각 서버들은 다수로 두고, Auto Scale 이 가능하게 한다
- 이러한 구조는 먼저, Db 를 만들고, 그 다음 WAS 를 만들고, 마지막으로 WEB 을 만든다. WAS 는 Db 와 link 를 걸고, WEB 는 WAS 와 link 를 건다
위와 같은 구조를 docker container run 을 이용하여 구성하게 되면
- 복잡하다
- 동일 구조를 다시 만드는데 오랜 시간이 걸린다
- 변경이 용이하지 않다
위와 같은 구조를 하나의 명세서에 작성하는 방법을 도커에서 제공하는데 이를 docker-compose 라 부른다
- docker-compose 는 docker 에서 제공하는 기본 서비스가 아니므로, 별도로 추가 설치가 필요하다
- 단, docker-compose 는 클러스터 환경에서의 사용이 아니라 1 대의 docker 서버에서 동작한다. 실제 클러스터 환경에서는 docker-compose + 클러스터 환경 ( docker swarm ) = docker stack 을 사용한다
명세 파일에 아래의 오브젝트를 구성하게 된다
service -> 컨테이너
volume
network
p. 228
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
- uname -s 는 Linux 를 uname -m 은 x86_64 ( 칩셋 버전 ) 이다
- /usr/local/bin/docker-compose 는 docker-compose 실행 명령어다
- /usr/local/bin/docker-compose 는 기본적으로 일반 텍스트 파일이므로, 이를 실행하기 위해 실행 권한을 준 것 이다
docker container run 명령들을 yaml 파일에 작성하는 것
다음 사항을 정의한다
version : 버전 별로 지원되는 옵션이 달라진다. 지원이 되지 않는 등의 문제가 있다면 해당 버전을 홈페이지에서 반드시 확인해야 한다
service : 실제로 서비스를 제공하는 컨테이너에 대한 정의
volume : 컨테이너에 연결할 볼륨을 정의한다 ( 필수 아님 )
network : 컨테이너들을 연결할 네트워크를 정의한다 ( 필수 아님 -> 작성하지 않으면 모든 컨테이너는 docker0 에 연결된다 )
각 항목의 하위 항목을 정의하려면 들여쓰기가 매우 중요하다. 일반적으로 yaml 파일은 tab 을 인식하지 않으므로 반드시 space bar 를 이용해야 한다
버전 정의: # docker compose 버전
version: '3.9'
서비스 정의:
services:
myctn1: # 이미지를 미리 준비한 경우
image: centos:7
links: myctl2 # 3 버전 부터는 links 를 사용하지 않는다. 자동으로 link 된다
environment:
MYSQL_ROOT_PASSWORD: test123 # : 을 쓰면 뒤에 한 칸 띄우고 쓴다
MYSQL_DATABASE: wordpress
networks:
- private1
- private2
myctn2: # Dockerfile 로 이미지를 build 해서 사용하는 경우
build: . #현재 위치에 있는 Dockerfile 을 build
environment:
- WORDPRESS_DB_USER=root # - 를 쓰면 뒤에 한 칸 띄우고, 뒤에 : 대신 = 를 쓰고, = 뒤에는 한 칸 띄우지 않는다
- WORDPRESS_DB_NAME=wordpress
depends_on: # 실행 순서 결정
- myctn1 # myctn2 가 실행 전에 myctn1 이 동작하는지 확인 하겠다는 의미다. 허나, 이는 myctn1 의 동작 여부만 확인하지, 동작 완료를 확인하지는 않는다
ports:
- "8080:80" # 시간을 의미하는 12:30 과 같은 것과 구분하기 위해 일반적으로 " 으로 감싼다
- "33061:3306" # Host 의 특정 Port 와 컨테이너의 특정 Port 매핑
- "8080" # Host 의 랜덤 Port 와 컨테이너의 특정 Port 매핑
- "8081-8085" # Host 의 랜덤 Port 들과 컨테이너의 특정 Port 들을 매핑
networks:
- private2
ctn1 -> depends_on ctn2,ctn3
ctn2 -> 설정 x
ctn3 -> depends_on ctn2
networks:
private1:
driver: bridge # private1 은 bridge Type 으로 생성된다
external: true # 기존에 만들어두었던 private1 을 재활용한다
version: "3.0"
services:
wordpress:
image: wordpress
ports:
- "8888:80"
environment:
- WORDPRESS_DB_PASSWORD=test123
- WORDPRESS_DB_NAME=wpdb
- WORDPRESS_DB_USER=root
depends_on:
- db
links:
- db:mysql
db:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=test123
- MYSQL_DATABASE=wpdb
docker-compose up -d
- docker-compose up 을 하면 자동으로 디렉토리명을 가져다가 디렉터리에 있는 docker-compose.yaml 파일을 적용시킨다
- 뒤에 숫자를 붙인다는 것은 동일한 컨테이너를 또 생성할 수 있다는 것이다. 이를 통해 위 그림처럼 Scale 을 늘릴 수 있다
docker-compose.yaml 작성할 때 첫번째 줄 version : "3.0" 안으로 들여써야 할 것 같습니다.