0부터 시작하는 Docker 공부 - Docker Compose - 기초

Jaehong Lee·2022년 8월 19일
0
post-thumbnail

0. docker 와 3 tier 구조

  • 우리는 wordpress + database 환경을 만들어보았다

  • 일반적으로 웹 서비스는 3tier 구조를 갖는다

    WEB server - WAS server - Database

    • 각 서버들은 다수로 두고, Auto Scale 이 가능하게 한다
    • 이러한 구조는 먼저, Db 를 만들고, 그 다음 WAS 를 만들고, 마지막으로 WEB 을 만든다. WAS 는 Db 와 link 를 걸고, WEB 는 WAS 와 link 를 건다
  • 위와 같은 구조를 docker container run 을 이용하여 구성하게 되면

    1. 복잡하다
    2. 동일 구조를 다시 만드는데 오랜 시간이 걸린다
    3. 변경이 용이하지 않다

1. docker-compose & docker stack

  • 위와 같은 구조를 하나의 명세서에 작성하는 방법을 도커에서 제공하는데 이를 docker-compose 라 부른다

    • docker-compose 는 docker 에서 제공하는 기본 서비스가 아니므로, 별도로 추가 설치가 필요하다
    • 단, docker-compose 는 클러스터 환경에서의 사용이 아니라 1 대의 docker 서버에서 동작한다. 실제 클러스터 환경에서는 docker-compose + 클러스터 환경 ( docker swarm ) = docker stack 을 사용한다
  • 명세 파일에 아래의 오브젝트를 구성하게 된다

    service -> 컨테이너
    volume
    network

2. docker compose 설치

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
  • 위 코드를 통해 docker compose 를 설치하고, 설치를 확인하자
    • uname -s 는 Linux 를 uname -m 은 x86_64 ( 칩셋 버전 ) 이다
    • /usr/local/bin/docker-compose 는 docker-compose 실행 명령어다
    • /usr/local/bin/docker-compose 는 기본적으로 일반 텍스트 파일이므로, 이를 실행하기 위해 실행 권한을 준 것 이다

  • vi ~/.bashrc 로 bashrc 를 열어 위의 별칭 설정을 추가하자
  • 변경 사항을 재부팅 없이 바로 적용시켜주자
  • 설치 및 설정 확인

3. docker compose 작성법

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
  • 하나의 compose 파일에 작성된 서비스들은 자동으로 link 가 된다

depends_on

  • ctn1 이 3번째, ctn2 는 첫번째, ctn3 는 두번째로 실행되야 할때

    ctn1 -> depends_on ctn2,ctn3
    ctn2 -> 설정 x
    ctn3 -> depends_on ctn2

  • 로 설정하면 된다
  • depends_on 은 동작 여부만 확인하고, 동작 완료는 확인하지 않는다

네트워크 정의

networks:
 private1:
  driver: bridge # private1 은 bridge Type 으로 생성된다
  external: true # 기존에 만들어두었던 private1 을 재활용한다

4. docker compose 실습

  • docker-compose.yaml 파일을 생성하자
  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
  • 위 yaml 내용을 작성해주자
docker-compose up -d

  • 위 명령어를 통해 컨테이너를 배포하자. -d 는 컨테이너가 백그라운드에서 돌아가게 하는 옵션이다
    • docker-compose up 을 하면 자동으로 디렉토리명을 가져다가 디렉터리에 있는 docker-compose.yaml 파일을 적용시킨다

  • 컨테이너가 잘 생성되었다
  • 이름을 확인해보면, 이름의 중복을 방지하여 앞에 디렉터리의 이름을 붙이고, 뒤에 숫자를 붙인다

    • 뒤에 숫자를 붙인다는 것은 동일한 컨테이너를 또 생성할 수 있다는 것이다. 이를 통해 위 그림처럼 Scale 을 늘릴 수 있다
profile
멋진 엔지니어가 될 때까지

1개의 댓글

comment-user-thumbnail
2022년 12월 22일

docker-compose.yaml 작성할 때 첫번째 줄 version : "3.0" 안으로 들여써야 할 것 같습니다.

답글 달기