host에 패키지를 직접 설치할 경우 설치/삭제/배포가 까다롭다. 운이 좋으면 명령어 한줄일때도 있지만 의존성 문제, 라이브러리 버전 문제, distro별 차이, port remapping등 뭔가 잘 안될때도 있다. docker는 linux의 cgroup과 namespace 기능을 기반으로 돌아간다. 전자는 컴퓨터 자원을 제한하는거고 후자는 말그대로 namespacing을 해준다. 이 namespacing은 process network disk memory 등에 적용될 수 있다. 그래서 docker를 쓰면 다른 서비스가 어떤 파이썬 버전을 사용중인지, 자바 기반이라면 jre 버전 몇에 의존하고 있는지, 로깅 경로나 의존하고 있는 다른 패키지가 충돌나진 않는지 고민할거리가 줄어든다.
요약: docker 쓰면 설치/삭제/배포가 쉬워진다.
2. docker의 작업흐름은 어떻게 되는가
docker pull <설치/배포 하고 싶은 무언가 eg grafana, netdata, prometheus, httpd, named, ...> : 이건 생략가능하다.
docker run <1에서 받은 이미지 이름>: 사실 1안해도 여기서 알아서 이미지를 받아준다.
끝
요약: 프로그래밍에 빗대면 도커 이미지는 코드고 도커 컨테이너는 프로세스라고 보면 된다.
3. docker 어떻게 쓰나
명령어는 엄청 많은데 서너개만 알아도 충분하다. 이미 repo에 올라가있는 스크립트를 기반으로 예를 들어보자.
너무 길다고, 이걸 어떻게 배워서 쓰냐고 할 수 있다. 사실 나도 못한다. 이건 공식문서 보고 한거다. 공식문서보고 쉘에서 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 시그널을 보내 그냥 없애버린다.
1. docker를 왜 쓰나
host에 패키지를 직접 설치할 경우 설치/삭제/배포가 까다롭다. 운이 좋으면 명령어 한줄일때도 있지만 의존성 문제, 라이브러리 버전 문제, distro별 차이, port remapping등 뭔가 잘 안될때도 있다. docker는 linux의 cgroup과 namespace 기능을 기반으로 돌아간다. 전자는 컴퓨터 자원을 제한하는거고 후자는 말그대로 namespacing을 해준다. 이 namespacing은 process network disk memory 등에 적용될 수 있다. 그래서 docker를 쓰면 다른 서비스가 어떤 파이썬 버전을 사용중인지, 자바 기반이라면 jre 버전 몇에 의존하고 있는지, 로깅 경로나 의존하고 있는 다른 패키지가 충돌나진 않는지 고민할거리가 줄어든다.
요약: docker 쓰면 설치/삭제/배포가 쉬워진다.
2. docker의 작업흐름은 어떻게 되는가
요약: 프로그래밍에 빗대면 도커 이미지는 코드고 도커 컨테이너는 프로세스라고 보면 된다.
3. docker 어떻게 쓰나
명령어는 엄청 많은데 서너개만 알아도 충분하다. 이미 repo에 올라가있는 스크립트를 기반으로 예를 들어보자.
너무 길다고, 이걸 어떻게 배워서 쓰냐고 할 수 있다. 사실 나도 못한다. 이건 공식문서 보고 한거다. 공식문서보고 쉘에서 apt 같은 패키지매니저로 설치하는것과 비슷하다.
문서 찾는것도 일이라 생각할 수 있지만 구글만 있으면 간단하다. grafana를 예를 들면 구글에 grafana docker를 쳐보면 각자 위치나 쿠키에 따라 순서는 조금 바뀔수있겠지만 top 1~3 안에서 grafana 공식 문서를 찾을수 있을것이다.
docker run -d -p 3000:3000 grafana/grafana
너무 간단하다. 이 한줄이면 grafana가 어떻게 설치되는지 신경 안써도 자동으로 grafana 이미지가 받아져서 돌아간다. 다른 시스템과 충돌날일 없이!docker run
뭔가 배포할때 쓴다. 몇가지 알아두면 좋은 옵션들에는 아래와 같은것들이 있다:
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 시그널을 보내 그냥 없애버린다.