SantaBPF / santabpf

MIT License
6 stars 1 forks source link

docker 기본 사용법 #17

Open dongho-jung opened 3 years ago

dongho-jung commented 3 years ago

1. docker를 왜 쓰나

host에 패키지를 직접 설치할 경우 설치/삭제/배포가 까다롭다. 운이 좋으면 명령어 한줄일때도 있지만 의존성 문제, 라이브러리 버전 문제, distro별 차이, port remapping등 뭔가 잘 안될때도 있다. docker는 linux의 cgroup과 namespace 기능을 기반으로 돌아간다. 전자는 컴퓨터 자원을 제한하는거고 후자는 말그대로 namespacing을 해준다. 이 namespacing은 process network disk memory 등에 적용될 수 있다. 그래서 docker를 쓰면 다른 서비스가 어떤 파이썬 버전을 사용중인지, 자바 기반이라면 jre 버전 몇에 의존하고 있는지, 로깅 경로나 의존하고 있는 다른 패키지가 충돌나진 않는지 고민할거리가 줄어든다.

요약: docker 쓰면 설치/삭제/배포가 쉬워진다.

2. docker의 작업흐름은 어떻게 되는가

  1. docker pull <설치/배포 하고 싶은 무언가 eg grafana, netdata, prometheus, httpd, named, ...> : 이건 생략가능하다.
  2. docker run <1에서 받은 이미지 이름>: 사실 1안해도 여기서 알아서 이미지를 받아준다.

요약: 프로그래밍에 빗대면 도커 이미지는 코드고 도커 컨테이너는 프로세스라고 보면 된다.

3. docker 어떻게 쓰나

명령어는 엄청 많은데 서너개만 알아도 충분하다. 이미 repo에 올라가있는 스크립트를 기반으로 예를 들어보자.

docker run -d --name=netdata   -p 29999:19999   -v netdataconfig:/etc/netdata   -v netdatalib:/var/lib/netdata   -v netdatacache:/var/cache/netdata   -v /etc/passwd:/host/etc/passwd:ro   -v /etc/group:/host/etc/group:ro   -v /proc:/host/proc:ro   -v /sys:/host/sys:ro   -v /etc/os-release:/host/etc/os-release:ro   --restart unless-stopped   --cap-add SYS_PTRACE   --security-opt apparmor=unconfined   netdata/netdata

너무 길다고, 이걸 어떻게 배워서 쓰냐고 할 수 있다. 사실 나도 못한다. 이건 공식문서 보고 한거다. 공식문서보고 쉘에서 apt 같은 패키지매니저로 설치하는것과 비슷하다.

문서 찾는것도 일이라 생각할 수 있지만 구글만 있으면 간단하다. grafana를 예를 들면 구글에 grafana docker를 쳐보면 각자 위치나 쿠키에 따라 순서는 조금 바뀔수있겠지만 top 1~3 안에서 grafana 공식 문서를 찾을수 있을것이다.

docker run -d -p 3000:3000 grafana/grafana 너무 간단하다. 이 한줄이면 grafana가 어떻게 설치되는지 신경 안써도 자동으로 grafana 이미지가 받아져서 돌아간다. 다른 시스템과 충돌날일 없이!

docker run

뭔가 배포할때 쓴다. 몇가지 알아두면 좋은 옵션들에는 아래와 같은것들이 있다:

-d: daemon으로 띄운다. 대충 백그라운드에서 유저와 별다른 상호작용 없이 띄우는 옵션이다.
-p: container와 host의 network는 서로 분리되어 있다. 그래서 -p a:b 는 host의 a번 포트를 container의 b번 포트로 연결해준다.
-v: network와 마찬가지로 container와 host는 file system도 분리되어 있다. 그래서 -v 호스트절대경로:컨테이너절대경로 또는 -v 호스트상대경로:컨테이너절대경로 또는 -v 볼륨명:컨테이너절대경로 이런식으로 컨테이너의 file system을 설정할 수 있다.
위의 netdata docker로 띄우는 긴 스크립트를 보면 -v netdataconfig:/etc/netdata 는 netdata라는 docker volume을 만들어서 container의 /etc/netdata에 마운트하겠단거고 v /etc/passwd:/host/etc/passwd:ro 는 host의 /etc/passwd를 container의 /etc/passwd에 마운트하고 :ro는 readonly로 마운트하겠단 뜻이다.
--name: 컨테이너의 이름을 지정해줄수 있다. 안해주면 무작위 이름이 부여되니 가급적이면 명시해주자
--restart: 컨테이너의 lifecycle을 지정해줄수 있다. 나는 prometheus나 netdata가 계속 돌아가길 원해서 unless-stopped 옵션을 줬다. 아니라면 systemd같은 service에 등록해주거나 서버가 재부팅될때마다 docker run을 쳐줘야 할것이다. 
--rm: 컨테이너가 stop되거나 kill되면 자동으로 컨테이너를 삭제한다.

docker ps

뭐가 띄워져 있는지 확인할때 쓴다. stop 상태인 컨테이너까지 보고 싶으면 -a 옵션을 붙이면 된다.

docker exec

이미 띄워져 있는 컨테이너에서 뭔가 작업할때 쓴다. 보통 docker exec -it <컨테이너명> <실행할파일> 로 쓰는데 -it는 interactive와 pseudo-tty를 활성화하는 옵션이다. docker exec -it netdata bash 이렇게 하면 netdata 컨테이너에서 bash를 실행시킬 수 있다. container에서 나오려면 host와 마찬가지로 exit 하거나 ctrl+D 하면 된다. 컨테이너를 죽이지 않고 살려두고 싶으면 ctrl+p -> ctrl+q 하면 된다.

docker logs

docker logs <컨테이너명> 으로 쓴다. 보통 컨테이너 내 foreground process의 stdout fd가 docker 가상 터미널로 리다이렉션되어 있는데 대충 docker logs netdata라고 하면 netdata 컨테이너에서 남긴 로그들을 조회할 수 있다.

docker stop & docker kill

컨테이너를 중단할때 쓴다. stop은 SIGTERM 시그널을 보내 컨테이너에게 정리할 시간을 주고 kill은 SIGKILL 시그널을 보내 그냥 없애버린다.