본 포스팅은 인프런에서 강의하시는 John Ahn님의 '따라하며 배우는 도커와 CI환경'이라는 강의를 보며
제가 이해한 내용을 정리하는 포스팅입니다.
도커를 쓰는 이유?
결론: 프로그램을 다운 받는 과정을 간단하게 만들기 위해
- ex) installer는 운영체제, 서버, 패키지 버전에 의존한다..
- Redis를 wget 사용해 다운 / 도커를 사용해서 다운
- wget 명령어가 없는 운영체제는 못 다운 받는다..
- docker로 다운받으면 이미지 하나 다운으로 끝
- Redis를 wget 사용해 다운 / 도커를 사용해서 다운
도커란 무엇인가
- 컨테이너를 사용하여 응용프로그램을 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구
- 컨테이너 기반의 오픈소스 가상화 플랫폼
- 서버에서 컨테이너의 개념
- 다양한 프로그램, 실행환경을 컨테이너로 추상화하고,
- 동일한 인터페이스를 제공하여,
- 프로그램의 배포 및 관리를 단순하게 해준다.
- AWS, Azure, Google cloud 등 에서도 실행가능하게 해준다.
도커 이미지, 컨테이너
- 도커 이미지
- 프로그램을 실행하는데 필요한 설정과 종속성을 가짐
- 도커 컨테이너
- 이미지의 인스턴스로, 프로그램을 실행시킴
도커를 사용할 때의 흐름
- 도커 CLI에 커맨드 입력
- Windows는 Docker desktop 실행한 상태에서
- 도커 서버(= 도커 Daemon)이 그 커맨드를 받아서, 이미지 생성이나 컨테이너 실행과 같은 모든 명령 실행
도커 vs 기존의 가상화 기술
- 가상화 기술 전후
- 전:
- 한대의 서버를 하나의 용도로
- 하이퍼 바이저 기반의 가상화 출현 후:
- 논리적으로 공간을 분할하여 vm이라는 독립적인 가상환경의 서버 이용 가능해짐
- 하이퍼바이저란
- Host 시스템에서 다수의 guest os를 구동할 수 있게 해주는 SW
- HW를 가상화하면서 HW와 각각의 VM을 모니터링하는 중간 관리자
- 하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 HW자원(예를 들면 core)을 할당받는다. 논리적으로 분리되어있기 때문에, 한 VM에 오류가 발생하더라도 다른 VM으로 퍼지지 않는다.
- 전:
- 도커 vs 하이퍼바이저 기반의 가상화
- 공통점: hw에서 격리된 어플리케이션을 배치하는 방법
- 차이점
- 도커:
- 하이퍼바이저와 guest os가 필요하지 않기 때문에 더 가볍다.
- 이미지들이 동일한 커널을 공유한다(+), 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템에서 볼 수 있다.
- ex) 몽고 db 컨테이너를 실행하면, 호스트의 일반 쉘에서 [c]ps-e grep 몽고[\c]를 실행하면 프로세스가 표시된다.
- os를 내장하지 않기에 가볍고, 일반적으로 5-100MB
- 하이퍼바이저 기반의 가상화:
- VM은어플리케이션을 실행하기 위해, VM을 띄우고, 자원을 할당하고, 게스트 OS를 부팅하고, 어플리케이션을 실행하기 때문에 훨씬 복잡하고 무겁게 실행한다.
- 도커:
- 순서
- [c]docker run <이미지 kakaotalk>[\c]
- 도커 이미지에 있는 파일 스냅샷(kakaotalk) 을 컨테이너 하드디스크에 옮겨준다.
- 이미지에서 가지고 있는 명령어를(컨테이너가 실행될 때 사용될 명령어)를 이용해서 카카오톡을 실행시켜줌
- host os가 맥이나 윈도우더라도 어떻게 리눅스 환경의 관리체계를 사용할 수 있을까?
- 도커 클라이언트와 서버는 리눅스 환경에서 돌아가고 있고, 리눅스 커널이 있음.. (+)
도커 이미지 내부 파일
- 이미지 내부파일 시스템 구조 보기: [c]docker run <image_name> ls[\c]
- cli의 네번째 오는 건 원래 이미지가 가지고 있는 시작 명령어를 무시하고, 여기에 있는 커맨드를 실하게 하는 것.(여기서 ls)
- [c]docker run alpine ls[\c]
- [c]docker run hello-world[\c]
- hello-world 이미지에선 ls명령어 사용 불가
- → ls 명령어를 사용할 수 있게 하는 파일이 이미지 내에 없
컨테이너 나열: docker ps
- 꺼져있는 컨테이너까지 : [c]docker ps -a[\c]
도커 컨테이너 생명주기
- 생성: [c]docker create <image name>[\c]
- 시작: [c]docker start -a <container name/id>[\c]
- -a: attach, output을 보여주기
- 실행
- docker run <image name> == create + start
- 중지
- gracefully하게 중지(그동안 하던 작업 완료): [c]docker **stop** <container name/id>[\c]
- 어떤 것도 기다리지 않고 바로 중지: [c]docker **kill** <container name/id>[\c]
- 삭제: [c]docker rm <container name/id>[\c]
- 이미지 삭제: [\c]docker rmi <image id>[\c]
- 도커를 쓰지 않을 때 한번에 컨테이너, 이미지, 네트워크 삭제: [/]docker system prune[\c]
실행중인 컨테이너에 명령어 전달
- 이미 실행 중인 컨테이너에 명령어 전달: [c]docker exec <container id> <명령어>[\c]
- docker run 은 새로운 컨테이너 만들고 실행
Redis를 이용한 컨테이너의 이해
- 기본
- 레디스 서버를 작동시키기
- 레디스 클라이언트 실행 후, 명령어를 레디스 서버에 전달
- 레디스 클라이언트도 컨테이너 안에서 실행을 시켜야 함.
- -it: 명령어를 실행시킨 후, 계속 명령어를 적을 수 있게 해줌(redis-cli안에 들어가서 명령어 칠 수 있게 해줌)
실행중인 컨테이너의 터미널 들어가기
[c]docker exec -it <con id> sh/bash/powershell[\c]
- 터미널에서 빠져나오기: ctrl + D