환경: 센토스 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
검색 키워드: 도커 볼륨 로그파일 권한
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
도커 네트워크
'인프라 > Docker' 카테고리의 다른 글
Docker 명령어 정리 (0) | 2021.03.24 |
---|