728x90
반응형
728x90
반응형
728x90
반응형

docker Container에서 GUI firefox 실행을 해봅시다.

 

환경정보

ubuntu 20.04.5

docker 20.10.19

 

주의! 컨테이너 생성부터 모두 docker host의 GUI 데스크톱에서 진행해야 합니다.

 

1. GUI사용을 위한 컨테이너 생성

docker run -d -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY --name con_test ubuntu:focal

여기서 GUI와 관련하여 중요한 포인트는 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY 입니다.

--name con_test는 컨테이너명 지정한 것이고, ubuntu:focal은 ubuntu의 버전을 명시한 것입니다.

 

2. docker의 host에서 인증쿠키 확인

xauth list

참고로 GUI 연결 시 마다 인증쿠키가 변경됩니다. 

컨테이너 접속 전에 사용하기 위해 미리 복사해 둡시다.

 

반응형

 

3. 컨테이너에 접속 후 업데이트 및 필요한 패키지 설치

apt-get update -y
apt-get install xauth -y
apt-get install firefox -y

 

4. GUI 사용을 위해 인증쿠키 설정

xauth add 복사한인증쿠키

제대로 작성 했다면 에러가 나더라도 정상입니다.

 

5. firefox 실행

firefox

명령어를 입력하면 해당 컨테이너의 firefox가 GUI로 실행됩니다.

 

참고로 이 단계에서 겼었던 에러 2가지가 있습니다.

1) ubuntu 20.04.5 (focal)

Unable to init server: Broadway display type not supported: unix
Error: cannot open display: unix

CLI 모드에서 컨테이너를 생성한 경우입니다. GUI에서 생성해서 해결 되었습니다.

 

2) ubuntu 22.04.1

ommand '/usr/bin/firefox' requires the firefox snap to be installed.
Please install it with:

snap install firefox

이 에러는 짧게 나마 구글 검색을 해봤지만 만족스러운 답을 찾지 못했습니다.

 

* 참고한 글

 

Container 내에서 GUI Application(firefox, 계산기) 실행하기

<선결 조건> docker host를 반드시 GUI 버전으로 설치한다(Server with GUI 설치) container를 실행할 때도 GUI Desktop으로 액세스하여 Terminal을 띄워서 해야 한다 (즉, ssh로 접속하여 GUI Package를 실행해서는 안

cloudsns.wordpress.com

 

docker와 GUI 환경 연결

docker container에서 GUI 애플리케이션을 수행할 필요가 있는 경우가 많다. 이를테면 vscode를 실행시킨다던지, 심심하니까 xeyes를 실행시켜 놓는다던지.. 아래 설명한 방법을 사용하면 docker container가

driz2le.tistory.com

 

 

번외

.... 사실이건 지난 주말에 어떤 문제를 해결하기 위해 적용했던 겁니다만....

그 문제에는 전~혀 소용이 없더군요..... 하하핫.. 

그래도 하나 알았으니.. 위안을..

728x90
반응형
728x90
반응형

결론적으로 현재 상황을 정리하면 docker 환경의 메모리 증가에 대해 난감해 졌다.

 

이슈 시작을 간단히 설명하면,
기존에 사용하던 docker에 kernel 에러가 발생해서 중단하고 host에 tomcat서버를 설치하여 사용하고 있었다.

기능상 당장 큰 문제가 없기 때문에 크게 신경쓰지 않고 있었는데 어느날 확인해 보니 메모리 사용량이 급증해 있었다.
아무 계획없이 확인했던 것인데 더 방치 했다면 아마도 50%를 바라봤을지도 모르겠다.

docker를 사용할 당시 컨테이너 3개가 돌아가고 있었고, 많아 봐야 메모리 사용량은 20% 정도였다.
당시와 비교해도 특별한 소스 변동이 없었기 때문에 이 그래프의 흐름은 내게 메모리 관리가 별도로 필요성을 느끼게 했다.

그래서 ubuntu의 메모리 사용량 관리에 대한 내용을 찾아서 스케줄로 등록했다.
참고정보 : https://oopaque.tistory.com/119

 

우분투 리눅스 메모리 사용량 캐쉬메모리 정리

우분투 리눅스 메모리 사용량 메모리 정리 1) 메모리 사용량 (KB 단위) $ free 2) 메모리 사용량 (MB 단위) $ free -m 3) 메모리 사용량 (사람이 보기 편한 단위) $ free -h 4) 현재 메모리 사용정보 $ c..

oopaque.tistory.com

그리고 결과는 위 30일 그래프의 우측 부분이다.
스케줄 추가 전과 비교하면 증가폭이 둔화되긴 했지만 여전히 조금씩 증가하고 있었다.

이후 좀 흥미로운게 있었는데 docker를 사용하게 되면서 부터다.
어찌어찌 kernel 문제가 해결(?) 되어서 다시 docker를 사용하게 되었다.
아래는 도커 사용 전후다.

환경의 차이는 아래와 같다.

  docker 사용 전 docker 사용 후
공통점 특이점 host에서 메모리 관리 스케줄 적용
차이점 tomcat 서버 1개만 운영(prod) 총 3개의 컨테이너 운영중
prod : docker 사용전 작업을 모두 수행
dev : 단순 test용
docker 관리를 위한 컨테이너

이러한 차이라면 오히려 docker를 사용한 후 메모리 사용량이 더 늘어야 하는게 아닌가?
오히려 최저 사용량은 docker 사용 후에가 더 낮다.

그리고 3일간 모니터링 한 결과 조금씩 메모리 사용량이 증가하고 있다.
구글을 검색해봐도 docker가 메모리 관리를 아주 잘 하는것 같지는 않은데 말이다. 흠 =ㄴ=ㅋ

docker 사용 6일 후 현재

역시 구글 검색 결과가 맞는 모양이다.

아쉽게도 메모리 사용량은 점차 증가하고 있으며, 특정 머신시간(19~20시)에 대략 3%씩 증가하고 있다.

주기적으로 관리해 줄 방법 없나? 

728x90
반응형
728x90
반응형

문제 발생일 : 2022-06-10 13시 경

 

결론 부터 말하자면 ubuntu update시 문제로 보여진다.

 

나의 경우 정확히는 host 우분투에서 발생한 것은 아니다.

docker 컨테이너로 ubuntu를 실행 중 필요해서 서버를 리부팅하고 다시 컨테이너를 실행하려고 했더니 에러가 나는 상황.

한번 이미지를 만들어 놓으면 별다른 업데이트를 하지 않기 때문에 내가 업데이트를 진행한 케이스는 아니다.

내가 모르는 어떤 설정에 의해 컨테이너의 재시작 시 ubuntu가 자동으로 업데이트가 된 것으로 보인다.

(이미지에 update가 들어가면 재시작시 자동으로 update를 하나? ㅡㅡㅋ )

 

# 에러 메시지 =================================================================

Message from syslogd@server at Jun 10 13:32:35 ...
 kernel:[  129.502235] Internal error: Oops - BUG: 0 [#1] SMP

Message from syslogd@server at Jun 10 13:32:35 ...
 kernel:[  129.654261] Code: 91059283 52800020 1400016f 17ffffa0 (d4210000)
...

============================================================================

 

* 참고정보 1

 

서버포럼 - Oracle Cloud A1 서버 apt upgrade 실행 하지마세요 - 추가) 커널 업그레이드????

++ 추가 ++ 부트볼륨 백업을 적용 했다가 계속 이상해서 새로운 마음으로 다시 설치 중입니다. 아래 메시지가 뜨면서 커널 업그레이드 하네요. 기존 버전에서 매끄럽게 업그레이드가 안되는거 같

svrforum.com

 

* 참고정보 2 - 오라클 포럼 게시글 : https://community.oracle.com/customerconnect/discussion/634302/kernel-panic

포럼에 로그인을 안 하면 내용이 다 보이지 않는다.

요약하면 최근에 ubuntu를 업데이트 한 경우에 발생된 것으로 보여진다.

 

위 글들을 읽고 한참 후에야  '아~ docker의 ubuntu가 문제로 구나!' 라고 생각하고

다른 ubuntu 이미지를 받아 컨테이너로 실행해보니 다 동일한 에러가 나타나고 있다.

 

두개의 글 모두 최근 3일내이고, 구글 검색으로 확인되는 정보도 모두 3일내 정보다.

또한 docker hub의 ubuntu 최종 업데이트 일이 3일 전인 걸로 봐선.........

 

 

다행히도 당장 살려놔야 할 정도의 서버는 아닌지라 급하진 않은데...

이런 상태가 지속된다면 다른 OS로 갈아타는걸 생각해야 겠다.

 

 

220704 덧,

해결방법이 있다는 글이 있어 확인해 보려고 했으나 실수로 시도하지 않고 그냥 docker를 다시 살렸는데 잘 된다.

해결 방법이라는 글은 아래 글. (난 적용 안함.)

 

kernel:[ 15.642879] Code: 91059283 52800020 1400016f 17ffffa0 (d4210000) - Error when booting (Oracle cloud instance)

When I boot on my oracle cloud instance (running on the lastest ubuntu), since I installed the last update, my machine show me the error : Message from syslogd@ampere at Jun 9 18:45:43 ... kernel...

stackoverflow.com

그래서 내가 왜 해결된 건지, 뭔가 다른 패치가 된건지 잘 모르겠다.

그래도 혹시 몰라서 host는 업데이트를 안 하고 있다.

나의 경우 서슴없이 테스트 할 수 있었던 것도 어디까지나 docker 환경이기 때문이므로 아직은 쉽게 추천할 수 없다.

 

728x90
반응형
728x90
반응형

이전글에서는 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 미만의 실수를 입력하면 비율로 정해진다.

 

이후 자원 사용현황을 확인하면 아래와 같다.

자원 할당후 (cpu 할당 변화는 어떻게 보는걸까?)

 

2. 컨테이너는 host에 설치된 DB에 연결하고 싶다.

docker 컨테이너의 개념에서 실제 운영중인 DB를 컨테이너로 관리한다는 것은 무리가 있다고 생각했다.

그래서 host의 설치된 DB를 각 컨테이너가 연결하는 것이 맞다고 생각하고, 연결하기로 했다.

그럼 내부에서의 IP만 알면 되는 것인데 이건 어떻게 확인할 것인가?

ifconfig를 입력하면 확인되는 docker0의 ip로 접근하면 된다.

 

만약 ifconfig를 사용할 수 없다면 아래 명령어로 패키지를 설치하도록.

sudo apt-get update

sudo apt install net-tools 

 

자세한 docker 네트워크에 대해서는 아래 글 참고

 

Docker 네트워크 이해 - Voyager of Linux

Table of Contents1 Docker 네크워크 상태2 Docker0 브릿지 네트워크3 Docker 네트워크 특징4 Docker Network Namespace5 docker0 와 eth0 의 연결: iptables -t nat6 Inter-Container Communication7 docker0 브릿지 네트워크 ip 변경 Docke

linux.systemv.pe.kr

 

3. 컨테이너에서 업로드 또는 다운로드 되는 파일은 host 영역에 배치하고 싶다.

나는 host에 존재하는 폴더를 컨테이너에서 읽기, 쓰기, 삭제의 모든 권한이 필요하다.

그래서 내가 사용한 것은 bind mount다. 

현재 권장되는 것은 아니나(docker에서는 volume mount를 권장),

난 내가 지정한 위치에 폴더를 배치하고 싶어서 사용하기로 했다.

 

아래 순서로 진행하면 컨테이너에서 host의 폴더를 mount되는 것을 확인할 수 있다.

1) host에 mount 할 폴더를 만들고 테스트로 txt파일을 하나 배치한다.

 

2) 컨테이너를 만들면서 bind mount 한다.

bind mount와 함께 컨테이너 생성

docker run -d -it --name 컨테이너명 -v host의폴더명:컨테이너의폴더명 -p 이미지명

 

3) 컨테이너로 접속해서 파일 확인

컨테이너에 접속해 보면 mount된 폴더가 확인된다. 그리고 파일 삭제도 가능하다.

이렇게 하면 컨테이너에서 host의 폴더를 내 폴더인 처럼 바로 사용이 가능하다.

 

docker의 데이터 파일 mount에 관련해서 자세한 내용은 아래 글 참조

 

Docker 컨테이너에 데이터 저장 (볼륨/바인드 마운트)

Engineering Blog by Dale Seo

www.daleseo.com

 

번외1. docker를 이용하며 발생한 이슈 : 서버시간, 한글

이후 운영서버에서 서비스 오픈하고 상황을 모니터링하는 과정에서 몇가지 이슈가 발견 되었다.

 

1) 서버시간이다.

내 서버는 특정 시간마다 진행되는 스케줄이 있다.

나의 운영서버는 세팅한지 1년이 넘어가는 서버로 이미 세팅할때 서버시간을 한국시간으로 적용하고 있었다.

그래서 당연히 정해진 시간에 정해진 스케줄이 돌아가리라 생각하고 있었다.

그런데 실행되는 스케줄이 내가 정해 놓은 시간과 다르다.

이러한 이유는 컨테이너의 시간이 운영서버의 시간과 다를 수 있기 때문이다.

(사실 이 결론에 도달하는데 여러 삽질이 있긴 했지만 그건 그냥 넘어가기로 하고....)

 

컨테이너로 접속하고 아래 순서로 진행해 보자.

apt-get update && apt-get -y upgrade : tzdata을 사용할 수 없는 경우
apt-get -y install tzdata : 타임존 설정
6(Asia) -> 69(Seoul) 선택

 

그리고 터미널에 date를 입력하면 컨테이너가 적용되고 있는 시간이 변경된 것을 확인할 수 있다.

 

시간 변경에 대해서는 아래글 참조

 

docker container 컨테이너 시간 변경 방법

docker container 컨테이너 시간 변경 방법 docker에 Tomcat을 올려 사용하던 중 로그 시간이 안맞아 보기 불편하여 정리. docker 컨테이너 시간바꾸기 -컨테이너 접속 후 # dpkg-reconfigure tzdata - 한국 서울..

tptrmfwk.tistory.com

 

[solved] ubuntu 도커 이미지 빌드 시 timezone 설정 방법

최근 Docker를 이용한 작업이 많아지면서 여러 이슈들이 있었는데, 그 중에서 많은 삽질을 했던 도커 컨테이너 시간대 설정 방법을 공유한다.

stynxh.github.io

 

2) 한글이 안 나온다.

가끔 서버에서 log 메시지를 기록할 때가 있다. 근데 문제는 이게 깨져 나온다는 거다.

컨테이너 내부에서 변경하는 방법도 있긴하나 나는 컨테이너 생성시 지정하는 것을 선호한다.

docker run -d -it -e LC_ALL=C.UTF-8 --name 컨테이너명 이미지명

 

언어변경에 대해서는 아래 글 참조

 

도커(Docker) 컨테이너 로케일 설정: 데비안(Debian), 우분투(Ubuntu) 이미지에서 한글 입력 문제

도커 우분투, 데비안 이미지에서는 기본적으로 한글 입력을 지원하지 않습니다. 한글을 입력하기 위해서는 로케일 설정을 UTF-8로 지정할 필요가 있습니다. 이 글에서는 로케일 개념과 함께 도커

www.44bits.io

 

번외2. log파일을 관리해야 겠다.

내 운영서버는 무료 클라우드 서버다. 그래서 디스크 잔여 용량에 대해서 신경 쓰고 있다.

그래서 무한대로 늘어날 가능성이 있지만 매번 관리하기 어려운 log는 관리 대상인 셈이다.

 

이 내용은 단순하지 않아서 자세한 글을 링크해 둔다. 이 글을 참고해서 적용해 보길 바란다.

 

Logrotate와 Crontab을 활용한 Docker Log 관리

💡늘어나는 Docker log는 어떻게 관리할까??🤷‍♀️

velog.io

+ 덧

이걸로 완전히 해결되지는 않는다. 쓰다보면 점점 docker에 대한 파일 용량이 늘어난다.

그리고 뭔가 관리로 해결할 방법을 찾아봤는데 쉽지가 않다.

다행이라면 docker는 쉽게 설치, 삭제를 가능하게 하는 것이니 완전히 삭제하는 방법이 그나마 내가 찾은 차선책 이었다.

 

 

Cloud VM에 docker를 적용 후 sda 용량 100% 문제

Cloud VM에 docker를 적용 후 sda 용량 100% 문제 오늘 테스트를 하면서 해결한 듯 하면서도 찜찜하다. 이유는 시험한 내용을 설명 후 쓰도록 하겠다. 전반적인 내용을 확인하고자 하시는 분은 htt

shyash.tistory.com

 

번외3. docker file을 만든다.

docker file은 나만의 여러 환경설정이 지정되어 있는 docker 이미지를 만드는데 사용된다.

그러므로 동일한 환경을 자주 구성해야 한다면, 그리고 그 환경이 여러가지를 설정을 포함하고 있다면 docker file을 만드는 것을 추천한다.

 

역시 이 내용도 자세한 글을 링크해 두니 참고하시길.

 

emunhi

Programming > Docker [Tomcat] Dockerfile 로 설치하기 1) Dockerfile 만들기 ※  $ vi Dockerfile 설치할려는 tomcat버전은 바뀔수가 있으므로 tomcat 홈페이지에서 검색해서 사용하면 된다. ※ 내역 /usr/local/tomcat/webap

emunhi.com

 

 

 

728x90
반응형
728x90
반응형

이번에 내가 docker을 적용하면서 겪은 내용을 정리해 본다.
먼저 docker가 무엇이고 왜 사용하는지는 구글을 검색해보길 바란다.

ubuntu 서버 세팅은 아래 내 글을 참고하자.

[Oracle Cloud] ubuntu server setting

지난주 금요일 오후에 클라우드 서버에 수정된 내용을 반영하려고 보니 접속이 되지 않았다. 분명 전날까지 됐던것 같은데 안 되는 것이다. 무료 평가판이 종료되었다는 메일은 받았지만, 그래

deonggi.tistory.com


1. docker 설치 및 세팅은 이 글을 참고

Ubuntu 20.04 Docker 설치하기. - 달소씨의 하루

이번에는 Ubuntu 20.04 LTS Server 버전에서 Docker 설치를 한번 진행해보겠습니다. 설치방법은 매번 하던대로라서.. 크게 달라지지않지만 기록용으로 남겨봅니다. 설치하기전에 기본적으로 apt update & ap

blog.dalso.org

이 글을 따라면 docker를 설치할 수 있다.
그리고 해당글의 portainer는 docker의 이미지, 컨테이너, 네트워크 관리에서 유용하므로 설치하는 것을 추천한다.

2. 원하는 tomcat 이미지를 받자.
docker hub에 접속하여 원하는 이미지를 검색한다.
그리고 docker pull 이미지명 으로 이미지를 받는다.
이미지 명의 콜론(:) 버전을 구분하기 위한 태그다. 원하는 특정 버전을 설치한다면 태그를 입력해 줘야 한다.

docker images로 현재 가지고 있는 이미지를 확인할 수 있다.

3. 이미지로 컨테이너 생성 및 실행

docker run -d -it --name con_test -p 8080:8080 tomcat:8.5.78-jre8-temurin-focal
입력된 명령어를 정리하면
1) -d : 백그라운드로 실행, 터미널을 빠져나와도 여전히 컨테이너는 실행됨
2) -it : 컨테이너를 종료하지 않고 계속 터미널에 입력
3) --name : 컨테이너의 이름을 지정 (길어 잘렸는데 위 스샷에서 맨아래 붉은줄에서 오른쪽 끝에 해당 이름이 표시됨)
4) -p : 포트지정, docker host 포트:docker 컨테이너 내부 포트로 바인딩
외부에서 8080포트로 서버에 접근하면 컨테이너 내부의 톰캣 기본 포트인 8080으로 연결해 주겠다는 의미
5) 맨 뒤의 tomcat:8.5.78-jre8-temurin-focal 은 2번에서 받은 이미지로 컨테이너를 생성

4. 톰캣 실행 결과
위 4번에서 두번째 빨간줄 docker ps -a 명령어로 이미 실행중임이 확인되고 있다.
그런데 브라우저로 접속하면 아래와 같다.

404 에러가 나고 있는데 이는 톰캣의 응답으로 정상이다.
call에 응답할 있는 war 파일을 넣어주면 된다
그러려면 설치된 컨테이너에 war 파일을 어디에 위치하고, 어떻게 넣어줘야 할까?

명령어를 docker exec -it con_test bash 라고 입력해준다.
con_test 컨테이너로 접속하여 명령어를 입력하겠다는 의미다.
붉은색 박스를 보면 컨테이너로 접속된 것을 알 수 있다.
컨테이너에 접속된 위치가 tomcat이 설치된 것으로 보여지는데 ls -la로 확인하면 맞는것을 알 수 있다.
그러므로 con_test 컨테이너의 /usr/local/tomcat/webapps 폴더에 ROOT.war 라고 war 파일을 넣어주면 되는 것이다.

exit로 컨테이너에서 나오고, docker 컨테이너에 파일을 복사해 넣는다.
docker cp /opt/HelloWorld.war con_test:/usr/local/tomcat/webapps/ROOT.war
docker host의 /opt 폴더에 HelloWorld.war 파일이 있는데 이걸 con_test 컨테이너의 /usr/local/tomcat/webapps 폴더에 ROOT.war로 파일로 넣어준다는 의미다.
에러 없이 복사 되었는지 확인해 준다. 파일명이 잘못된거나 폴더가 잘못 되었다면 에러가 난다.
(반대로 하면 컨테이너 파일을 docker host로 복사할 수 있다.)

그리고 잠시 후 다시 8080 포트로 접속해 보면 아래와 같이 정상 적용되는 것을 확인할 수 있다.


테스트를 위해 간단히 만든 war 파일로 Hello World라고 표시하고 있다.

5. 톰캣 컨테이너 삭제

docker stop con_test (또는 container id) : 컨테이너를 정지
docker rm con_test (또는 container id) : 컨테이너 삭제

6. docker 이미지 삭제

docker rmi tomcat:8.5.78-jre8-temurin-focal (또는 image id)


728x90
반응형

+ Recent posts