가상화 환경에서 k8s 없이 docker 컨테이너를 띄울 때 아래와 같은 점을 고려해야한다.
# Docker demon process 활성화
host 서버 재시작 시에 자동으로 도커 엔진이 부팅되게 해야한다. 서버가 켜질 때 자동으로 Docker demon이 켜진다.
sudo systemctl enable docker
# Volume : 앱 로그 파일 보존
- app log 파일을 컨테이너 재기동에도 보존할 수 있도록 적절한 볼륨 설정을 하고 있는가?
컨테이너가 재기동 혹은 삭제되어도 로그를 영구적으로 보존하려면 호스트 서버의 특정 디렉토리에 컨테이너 내부 로그를 바인드 마운트 해야한다.
services:
my-app:
image: my-app:latest
volumes:
- /data/logs/my-app:/app/logs # [호스트 경로]:[컨테이너 내부 경로]
# Daemon : /etc/docker/daemon.json 커스텀 설정
로그가 무제한으로 쌓여서 호스트 디스크가 꽉 차는 Disk Full를 막고 운영 안전성을 높이기 위해서 설정이 꼭 필요하다.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
},
"live-restore": true,
"data-root": "/data/docker"
}
①log-opts (로그 롤링 및 제한)
컨테이너의 표준 출력(stdout, stderr) 로그 크기와 파일 개수를 제한하는 것이다.
- max-size: 로그 파일의 크기를 제한
- max-file: 최대 보관하는 파일의 갯수, 가장 오래된것부터 덮어씀
-> 해당 옵션은 Doker 데몬이 수집하는 표준 출력 로그(docker logs로 보는 로그)에만 적용된다.
-> 앱 내부 자체 파일 로그는 Logback이나 logrotate를 통해서 별도 설정이 필요하다.
②live-restore (무중단 운영)
-> Docker 데몬 프로세스가 업데이트되거나 재시작될 때, 실행 중인 컨테이너들을 강제로 종료하지 않고 계속 살려두는 옵션이다.
③data-root (디스크 파티션 분리)
-> Docker는 기본적으로 모든 이미지, 볼륨, 컨테이너 데이터를 /var/lib/docker (OS Root 파티션) 에 저장한다.
-> 이미지가 쌓이거나 컨테이너 용량이 커지면 OS 영역의 디스크가 가득 차서 서버 자체가 다운될 수 있다. 그래서 별도의 데이터 파티션으로 저장 경로를 변경해주는 것이 중요하다.
# Docker Network Mode(Bridge VS host mode)
- default bridge mode 아닌, host mode가 더 적합하지 않은가?
bridge mode
방식: 컨테이너마다 도커가 만들어준 가상의 독립된 네트워크 공간에서 격리하여 관리
특징: 컨테이너 통신 시 이름으로 통신 가능하며 외부와 통신할때는 호스트 서버의 포트를 빌려서 통신한다.
결론: 보안과 독립성이 중요한 일반적인 서비스용에서 사용한다.
단점: 컨테이너 내부 IP가 가상 IP라서 NAT가 필요하다.
host mode
방식: 컨테이너가 호스트 서버의 네트워크를 그대로 공유한다.
특징: 호스트와 똑같이 움직여 네트워크 성능 저하가 전혀 없지만, 포트가 겹치면 안된다.
결론: 격리보다는 성능이 최우선인 특수 환경용
-> default bridge mode로 진행했다. NAT로 인한 오버헤드는 서버들의 하드웨어 가속화와 리눅스 커널의 고성능 패킷 처리 기술로 인해서 미세하고 WEB/WAS/DB 구성에서 기본 모드로 사용을 주로하고 hosts 파일 수정없이 통신하여(port 충돌 해결) 컨테이너 격리 보장하기 위해서다.

Bridge 모드에서 주의할 점
NETWORK MODE가 host가 아닌 경우, docker-compose.yml 내 extra_hosts 추가해야 한다.
컨테이너 내부에 별도로 생긴 자신만의 /etc/hosts 파일을 가지고 있기에 host 서버의 /etc/hosts 레코드를 컨테이너는 인식 못한다. 또한 extra_hosts 가 추가되면 컨테이너 재시작이 필요하다. 이미 실행중인 컨테이너는 /etc/hosts가 생성된 상태라서 실행 중인 컨테이너의 파일 내부를 도커가 실시간으로 고쳐주지는 않는다. 그래서 서비스 중단 없이 적용하기 위해서는 무중단 배포를 사용하면 된다. docker-compose up -d --build (또는 --force-recreate) 사용하면 무중단 배포가 된다.