2020. 3. 4. 01:14 ㆍ개발 이야기/오픈소스
안녕하세요.
오늘은 Docker에 대해서 간략한 소개를 하려 합니다.
Docker는 5년 전까지만 해도 엄청 뜨네 마네 말들이 굉장히 많는데요(물론 제 주변만 그랬을 수도..)
(외국은 엄청나게 사용했지만, 한국의 현업인들은 안 뜨네 어쩌네 했던 기억이 납니다)
(안 뜬다고 버럭버럭 우기는 사람 때문에 성질났던 기억이....)
아무튼 이 귀여운 도커를 지금은 거의 모르는 사람이 없을 정도로 많이 사용하고 있는데요(공공기관 제외)
그러면 왜 도커를 쓰는 걸까요?
이런 질문에서 가장 많이 비교되는 것은 바로 VM(Virtual Machine)입니다. VM과 도커의 차이를 모르는 사람이 이제는 없을 것으로 생각이 들긴 하지만 처음 공부하는 사람들은 잘 이해가 되지 않을 수도 있습니다. Docker 공식 홈페이지에 있는 그림을 가져와 보겠습니다.
Docker는 Docker engine 위에 컨테이너 형식으로 코드와 종속성을 패키징 하는 앱 계층의 추상화입니다. 여러 컨테이너가 동일한 머신에서 실행될 수 있고 OS 커널을 다른 컨테이너와 공유할 수 있으며, 각 컨테이너는 사용자 공간에서 격리된 프로세스로 실행됩니다(VM보다 적은 공간을 차지합니다)
반면에 VM은?
가상 머신 위에 Guest OS가 설치되고 이 위에 앱이 있는 형태로 단편적으로 생각해도 Server가 켜지고 가상 OS가 켜지기 때문에 부팅속도도 느릴 수밖에 없으며, 수십 GB가 소비됩니다.
그런데 우리는 VM으로도 잘 쓰고 있는데 굳이 Docker를 왜 써야 해요?
도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계없이 언제나 동일하게 실행될 것을 보증한다.
- 위키백과
도커는 App을 환경에 구애받지 않고 실행하는 기술입니다. 필요한 코드, 도구, 라이브러리 등 설명 그대로 필요한 모든 정모를 컨테이너에 담고 있기 때문에 어떤 환경에도 만들어놓은 Docker image가 있다면 30초 안에(용량이 지나치게 큰 경우 제외 ^^;) App을 올릴 수 있습니다.
서로 다른 서버에 같은 App을 올리게 됐을 때 시간이 지나 관리자가 다른 경우, 혹은 관리자가 바뀐 경우에 서로 다른 서버가 환경이 다른 경우가 많이 있습니다. 이런 경우를 눈송이 서버(Snowflakes Server)라 하는데요
이런 경우에도 손쉽게 같은 환경의 App을 올릴 수 있게 해 주는 게 바로 도커의 컨테이너 기술입니다. 좋은 일례로 gitlab이라는 도구를 설치하려면 우분투 따로 CentOS 따로 윈도우 따로 다 다르게 설치가 가능합니다.
Ubuntu의 gitlab 설치 과정
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" apt-get install gitlab-ee
CentOS의 gitlab 설치 과정
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ee
하지만 도커를 이용한다면 손쉽게 image를 pull 받아 빠르게 실행이 가능하게 됩니다.
Docker를 이용한 gitlab 설치 과정
$ docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
참고 : https://www.44bits.io/ko/post/why-should-i-use-docker-container
Docker image는 Dockerfile을 이용해서 만들게 되는데요
FROM alpine:latest as certs
RUN apk add --update --no-cache ca-certificates
FROM scratch
COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
EXPOSE 14270
EXPOSE 14271
대략 이런 식으로 되어 있습니다.
해석을 하자면 alpine 리눅스 base에 RUN 뒤에 오는 것들은 apt와 같은 명령어를 실행해주는 명령어입니다. COPY는 로컬에 있는 파일을 컨테이너 안으로 복사한다.
이런 내용으로 아주 직관적으로 이루어져 있기 때문에 어렵지 않게 만들 수 있습니다. 이렇게 도커 이미지를 만들어 놓으면 언제든 어디서든 같은 환경의 App을 실행할 수 있게 됩니다.
아래는 도커의 cheat sheet 입니다.
라이프 사이클
docker run 컨테이너를 생성한다.
docker stop 컨테이너를 정지시킨다.
docker start 컨테이너를 다시 실행시킨다.
docker restart 컨테이너를 재가동한다.
docker rm 컨테이너를 삭제한다.
docker kill 컨테이너에게 SIGKILL을 보낸다. 이에 관련된 이슈가 있다..
docker attach 실행중인 컨테이너에 접속한다. * docker wait 컨테이너가 멈출 때까지 블럭한다.
관련된 정보를 출력해주는 명령어
docker ps 명령어는 실행중인 컨테이너 목록을 보여준다.
docker inspect ip 주소를 포함한 특정 컨테이너에 대한 모든 정보를 보여준다.
docker logs 컨테이너로부터 로그를 가져온다.
docker events 컨테이너로부터 이벤트를 가져온다.
docker port 컨테이너의 특정 포트가 어디로 연결되어있는지 보여준다.
docker top 컨테이너에서 실행중인 프로세스를 보여준다.
docker diff 컨테이너 파일 시스템에서 변경된 파일들을 보여준다.
docker ps -a 실행중인 컨테이너와 멈춰있는 컨테이너를 모두 보여준다.
Import / Export
docker cp 컨테이너 내의 파일을 호스트로 복사한다.
docker export 컨테이너 파일 시스템을 tarball로 출력한다.
라이프 사이클
docker images 모든 이미지 목록을 보여준다.
docker import tarball 파일로부터 이미지를 생성한다.
docker build Dockerfile을 통해 이미지를 생성한다.
docker commit 컨테이너에서 이미지를 생성한다.
docker rmi 이미지를 삭제한다.
docker insert URL에서 이미지로 파일을 집어넣는다. * docker load 표준 입력으로 tar 파일에서 (이미지와 태그를 포함한) 이미지를 불러온다.(0.7부터 사용가능).
docker save 모든 부모 레이어와 태그, 버전 정보를 tar 형식으로 표준출력을 통해 @@@ (0.7부터 사용가능).
docker import와 docker commit 파일 시스템만 셋업하고 Dockefile과 같은 CMD, ENTRYPOINT, EXPOSE는 포함하지 않는다.. bug 참조.
관련된 정보를 출력해주는 명령어
docker history 이미지의 이력 정보를 보여준다.
docker tag 이미지에 이름으로 태그를 붙여준다(local 혹은 registry).
레지스트리(Registry) & 저장소(Repository)
docker login 레지스트리에 로그인한다.
docker search 레지스트리에서 이미지를 검색한다.
docker pull 이미지를 레지스트리에서 로컬 머신으로 가져온다(pull).
docker push 이미지를 로컬 머신에서 레지스트리에 집어넣는다(push).
명령어가 많지 않기 때문에 git을 적응하는 시간 정도면 충분히 적응하고 사용할 수 있을 것으로 생각이 듭니다.
구글은 모든 서비스를 무려 10만 개의 컨테이너로 운영하고 있다고 합니다.
이와 관련해서 Kubernetes 등 아주아주 유용한 오픈소스들이 있는데요 구글과 같은 대 IT 기업은 어떻게 이런 유용한 오픈소스를 이용해서 서버를 운영하고 개발 배포는 어떻게 하는지 조금이나마 맛보기를 하기 위해 기초 지식이 되는 도커를 소개하게 되었습니다. 다음 글에서는 Kubernetes를 소개해 보도록 하겠습니다.
'개발 이야기 > 오픈소스' 카테고리의 다른 글
# 오픈소스 분산형 NoSQL DBMS Cassandra(카산드라) (0) | 2020.03.17 |
---|---|
# Container Orchestration - 쿠버네티스(kubernetes - K8s) (0) | 2020.03.14 |
# 오픈소스 모니터링 시스템 Prometheus, 시각화 소프트웨어 Grafana (0) | 2020.03.06 |
비동기 B2C 서버 구축하기 - monit (0) | 2019.11.05 |
2TB 이상 하드디스크 포멧 방법 (0) | 2019.08.14 |