인프라/Docker

Docker를 이용한 SpringBoot, Mysql 백엔드 개발 서버 구축(with centos 7.8)

소프 2022. 10. 21.

환경: 센토스 7.8

 

목적

하나의 개발 서버에 도커 네트워크를 구성하여 Spring Applications, Mysql을 docker-compose를 이용해서 구성한다. 

 

docker 설치

# Docker 설치
# https://docs.docker.com/engine/install/centos/ 사이트 자료를 참고하여 설치한다.
yum -y update
yum install -y yum-utils
 
# Docker repository 시스템에 추가
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-nightly
 
# 최신버전의 Docker 설치(Install Docker Engine)
yum -y install docker-ce docker-ce-cli containerd.io
 
# Docker 데몬 시작 및 부팅 시 Docker 데몬 자동 시작
systemctl start docker
systemctl enable docker
 
# Docker 실행중인지 확인
systemctl status docker

 

docker-compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

 

docker 최신버전 확인

https://github.com/docker/compose

 

도커 네트워크 설정

- 도커 컨테이너는 격리된 환경이다.

- Spring Application과 Mysql을 각각의 컨테이너로 띄운다.

- 외부에서 도커 네트워크를 생성하여 생성된 네트워크에 컨테이너를 등록하면 컨테이너 간의 내부 통신이 가능하다.

- Spring Application과 Mysql간의 내부 통신이 가능하도록 구성한다.

docker network create ${네트워크 이름} # default bridge로 생성

docker network ls # 네트워크 전체 확인

docker network inspect ${네트워크 이름} # 네트워크 상세정보 확인

docker exec A ping B # 이거 안됨
- 컨테이너 들어가서 ping 설치 후 이름으로 ping 날리기
- docker exec -i -t --user root ${컨테이너이름} /bin/bash
- apt update
- apt-get install iputils-ping
- ping api-server(컨테이너 이름)

 

Spring Application docker-compose.yml

version: "3.7"
services:
  api-server-dev:
    image: '${이미지 이름}:${태그}'
    container_name: api-server-dev
    ports:
      - "8082:8082"
    environment:
      - "SPRING_PROFILES_ACTIVE=dev"
      - "AWS_ACCESS_KEY_ID=${Aws Iam AccessKey}" # 파라미터 스토어 연동 
      - "AWS_SECRET_ACCESS_KEY=${Aws Iam SecretKey}" # 파라미터 스토어 연동
      - "AWS_REGION=ap-northeast-2"
      - "PORT:8082" # Spring Application Port
    volumes: # 하단 글 참조
      - /home/dev-server/api-server/logs/info:/workspace/./server/logs/info
      - /home/dev-server/api-server/logs/warn:/workspace/./server/logs/warn
      - /home/dev-server/api-server/logs/error:/workspace/./server/logs/error
      - /home/dev-server/api-server/logs/backup:/workspace/./server/logs/backup
    restart: always

networks:
  default:
    external:
      name: ${생성한 외부 네트워크 이름}

- Logback 설정으로 생성된 로그를 도커 볼륨을 통해 외부로 마운트하려고 했다.

- 그러나 아무리 컨테이너를 실행시켜도 외부로 마운트가 되지 않았다.

- Spring Application 컨테이너에 접속해서 실제 로그 경로를 확인해봤을땐 Logback에 설정한 로그 경로(/server/logs/**)가 아닌 앞단의 경로에 '/worksapce/./'가 세팅되어 있었다.

- 그래도 생성이 안되서 외부에 생성한 폴더의 권한을 777로 주었더니 생성이 되었다.

  - 하지만 이방법은 보안에 취약하다. 바로 아래에 있는 게시글에 좋은 방법이 있으니 참고

- 하지만 로그 파일 로테이션이 적용되지 않아(내부 컨테이너도 마찬가지) 추후 logback 설정 수정이 필요한 상황이다.

VOLUME으로 지정된 디렉토리에 log파일을 생성하지 못한 이유

volume으로 지정된 디렉토리에 log파일을 생성하지 못한 이유

문제의 원인은 log파일을 저장하는 디렉토리의 owner가 root로 설정되어서 해당 디렉토리에서 쓰기가 거부당한 것이다.
log파일이 저장되는 /home/node/node_logs디렉토리는 미리 생성하지 않아서 볼륨이 지정되면서 생성되었다.이때 
root의 권한으로 디렉토리가 생성되었고 owner가 
root로 설정되었다. 그러니 root의 권한이 있어야 해당 디렉토리에서 파일을 생성할 수 있게 된 것이다.
도커 컨테이너 내의 프로세스(log파일을 생성하고 쓰는 프로세스)는 기본 user인 ubuntu 였기에 권한이 부족해서 파일을 생성할 수 없었던 것이다.

https://sweethoneybee.tistory.com/28

https://engineer-mole.tistory.com/264

https://sang12.co.kr/230/Docker-%EC%99%B8%EB%B6%80-Volume%EC%84%A4%EC%A0%95%EC%8B%9C%2C-%EC%9C%A0%EC%A0%80-%EA%B6%8C%ED%95%9C-%EB%AC%B8%EC%A0%9C-%28permission-denied%29

검색 키워드: 도커 볼륨 로그파일 권한

 

 

Mysql docker-compose.yml

version: "3.7"
services:
  db:
    image: mysql:8.0
    container_name: mysql8
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=${DB 이름}
      - MYSQL_ROOT_PASSWORD=${ROOT 패스워드}
    command:
      - --lower_case_table_names=1 # 대소문자 구분
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /home/dev-server/mysql-server/db:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)


networks:
  default:
    external:
      name: ${생성한 외부 네트워크 이름}

 

출처

도커, 도커 컴포즈

https://link2me.tistory.com/2088

 

도커 네트워크

https://www.daleseo.com/docker-compose-networks/

https://www.daleseo.com/docker-networks/

'인프라 > Docker' 카테고리의 다른 글

Docker 명령어 정리  (0) 2021.03.24

댓글