이전글에서는 docker의 컨테이너 설치부터 삭제까지 간단히 다뤘다.
이번엔 내가 docker를 사용하면서 필요했던 설정에 대해서 적어보고자 한다.
이 글의 주요 내용은 아래와 같다.
1. 여러 컨테이너의 서버자원 사용을 관리하고 싶다.
2. 컨테이너는 host에 설치된 DB에 연결하고 싶다.
3. 컨테이너에서 업로드 또는 다운로드 되는 파일은 host 영역에 배치하고 싶다.
번외1. docker를 이용하며 발생한 이슈 : 서버시간, 한글
번외2. log파일을 관리해야 겠다.
번외3. docker file을 만든다.
1. 여러 컨테이너의 서버자원 사용을 관리하고 싶다.
내 운영서버는 1대로 dev, prod, 컨테이너 관리를 위한 portainer를 함께 사용한다.
이 말은 각 컨테이너의 자원을 할당해야 한다는 의미다.
아무래도 prod가 더 많은 일을 할 것이고, 문제없이 서비스 되어야 하므로 다른 컨테이너들이 자원을 사용하는 것을 제한해야 한다고 생각했다.
docker stats 명령어를 통해 현재 실행중인 docker 컨테이너의 자원 사용상황을 확인할 수 있다.
나는 그래서 prod외 컨테이너들의 cpu, memory 각 10%로 제한하기로 했다.
(아래 방법은 실시간으로 변경하는 방법이다.)
docker update --memory 용량 --memory-swap 용량 컨테이너명 : 컨테이너의 메모리 사용은 2.4g로 제한했다.
docker update --cpus=갯수(또는 비율) 컨테이너명 : --cpus에 정수인 경우 CPU의 코어 갯수이고, 1 미만의 실수를 입력하면 비율로 정해진다.
이후 자원 사용현황을 확인하면 아래와 같다.
2. 컨테이너는 host에 설치된 DB에 연결하고 싶다.
docker 컨테이너의 개념에서 실제 운영중인 DB를 컨테이너로 관리한다는 것은 무리가 있다고 생각했다.
그래서 host의 설치된 DB를 각 컨테이너가 연결하는 것이 맞다고 생각하고, 연결하기로 했다.
그럼 내부에서의 IP만 알면 되는 것인데 이건 어떻게 확인할 것인가?
ifconfig를 입력하면 확인되는 docker0의 ip로 접근하면 된다.
만약 ifconfig를 사용할 수 없다면 아래 명령어로 패키지를 설치하도록.
sudo apt-get update
sudo apt install net-tools
자세한 docker 네트워크에 대해서는 아래 글 참고
3. 컨테이너에서 업로드 또는 다운로드 되는 파일은 host 영역에 배치하고 싶다.
나는 host에 존재하는 폴더를 컨테이너에서 읽기, 쓰기, 삭제의 모든 권한이 필요하다.
그래서 내가 사용한 것은 bind mount다.
현재 권장되는 것은 아니나(docker에서는 volume mount를 권장),
난 내가 지정한 위치에 폴더를 배치하고 싶어서 사용하기로 했다.
아래 순서로 진행하면 컨테이너에서 host의 폴더를 mount되는 것을 확인할 수 있다.
1) host에 mount 할 폴더를 만들고 테스트로 txt파일을 하나 배치한다.
2) 컨테이너를 만들면서 bind mount 한다.
docker run -d -it --name 컨테이너명 -v host의폴더명:컨테이너의폴더명 -p 이미지명
3) 컨테이너로 접속해서 파일 확인
컨테이너에 접속해 보면 mount된 폴더가 확인된다. 그리고 파일 삭제도 가능하다.
이렇게 하면 컨테이너에서 host의 폴더를 내 폴더인 처럼 바로 사용이 가능하다.
docker의 데이터 파일 mount에 관련해서 자세한 내용은 아래 글 참조
번외1. docker를 이용하며 발생한 이슈 : 서버시간, 한글
이후 운영서버에서 서비스 오픈하고 상황을 모니터링하는 과정에서 몇가지 이슈가 발견 되었다.
1) 서버시간이다.
내 서버는 특정 시간마다 진행되는 스케줄이 있다.
나의 운영서버는 세팅한지 1년이 넘어가는 서버로 이미 세팅할때 서버시간을 한국시간으로 적용하고 있었다.
그래서 당연히 정해진 시간에 정해진 스케줄이 돌아가리라 생각하고 있었다.
그런데 실행되는 스케줄이 내가 정해 놓은 시간과 다르다.
이러한 이유는 컨테이너의 시간이 운영서버의 시간과 다를 수 있기 때문이다.
(사실 이 결론에 도달하는데 여러 삽질이 있긴 했지만 그건 그냥 넘어가기로 하고....)
컨테이너로 접속하고 아래 순서로 진행해 보자.
apt-get update && apt-get -y upgrade : tzdata을 사용할 수 없는 경우
apt-get -y install tzdata : 타임존 설정
6(Asia) -> 69(Seoul) 선택
그리고 터미널에 date를 입력하면 컨테이너가 적용되고 있는 시간이 변경된 것을 확인할 수 있다.
시간 변경에 대해서는 아래글 참조
2) 한글이 안 나온다.
가끔 서버에서 log 메시지를 기록할 때가 있다. 근데 문제는 이게 깨져 나온다는 거다.
컨테이너 내부에서 변경하는 방법도 있긴하나 나는 컨테이너 생성시 지정하는 것을 선호한다.
docker run -d -it -e LC_ALL=C.UTF-8 --name 컨테이너명 이미지명
언어변경에 대해서는 아래 글 참조
번외2. log파일을 관리해야 겠다.
내 운영서버는 무료 클라우드 서버다. 그래서 디스크 잔여 용량에 대해서 신경 쓰고 있다.
그래서 무한대로 늘어날 가능성이 있지만 매번 관리하기 어려운 log는 관리 대상인 셈이다.
이 내용은 단순하지 않아서 자세한 글을 링크해 둔다. 이 글을 참고해서 적용해 보길 바란다.
+ 덧
이걸로 완전히 해결되지는 않는다. 쓰다보면 점점 docker에 대한 파일 용량이 늘어난다.
그리고 뭔가 관리로 해결할 방법을 찾아봤는데 쉽지가 않다.
다행이라면 docker는 쉽게 설치, 삭제를 가능하게 하는 것이니 완전히 삭제하는 방법이 그나마 내가 찾은 차선책 이었다.
번외3. docker file을 만든다.
docker file은 나만의 여러 환경설정이 지정되어 있는 docker 이미지를 만드는데 사용된다.
그러므로 동일한 환경을 자주 구성해야 한다면, 그리고 그 환경이 여러가지를 설정을 포함하고 있다면 docker file을 만드는 것을 추천한다.
역시 이 내용도 자세한 글을 링크해 두니 참고하시길.
'코딩 삽질' 카테고리의 다른 글
[ubuntu, docker, tomcat] manage log files (0) | 2022.04.26 |
---|---|
[java, selenium] web crawling (웹 크롤링) (0) | 2022.04.26 |
docker 컨테이너로 tomcat 실행하기 (0) | 2022.04.04 |
[mysql] Incorrect string value: '\xF0\x9F\x98\x99 "...' (0) | 2022.04.04 |
[spring, jpa] org.springframework.beans.factory.UnsatisfiedDependencyExceptio (0) | 2022.04.04 |