본문 바로가기

Backend/DevOps

[Docker] 초보자를 위한 도커 튜토리얼

도커의 좋은 강의 영상을 찾아 게시글로 정리하였다.

영상에서는 좋은 이미지와 실습을 함께 보여주기 때문에 영상으로 전부 보기를 추천

영어 강의고 자막은 없지만, 영어 발음이 듣기에 아주 편해 영어를 잘 못하는 편이지만 쉽게 들을 수 있었다.

 

 

컨테이너 논리적 개념

- 어플리케이션을 필요한 모든 설정과 의존관계를 함께 패키징하는 방법이다.

- 쉽게 공유하고 움직일 수 있는 물체이다.

- 개발과 배포를 보다 효율적으로 만들어준다.

 

컨테이너는 어디에 저장되어 있을까?

- Container Repository

- Private Respositories

- Docker의 공식 저장소(Docker hub)

 

컨테이너는 어떻게 우리를 효율적으로 만들어주는가?

Before Container

- 협업 간에 개발자는 개발에 필요한 PostgreSQL, Redis 등을 OS가 다른 각자의 host(서버)에 각각 설치 및 설정해주어야했다.

- 누구는 Linux, 누구는 MAC을 사용하는 것처럼 OS가 다르고, 기본적인 python, JRE의 버전 및 설정 등이 다르기 때문에

설정이 까다로웠고 문제가 생길 일이 많았다.

- 개발자는 운영팀을 위해 배포 가이드를 문서 작성해야 하는 번거로운 일이 생겼다.

After Container

- 컨테이너에 모든 (설정, 디펜던시 포함한) 개발환경을 패키징

- 스스로의 환경에서 docker 파일을 실행하기만 하면 됨

- 명령 하나만으로 app을 구동할 수 있다.

- 모든 Operating System에 각각 설정할 필요가 없다.

 

컨테이너의 기술적 개념

- 이미지는 Layer의 계층 구조로 이루어져있다.

- 대부분 크기가 작은 linux base image를 사용한다.

 

ex) postgresql의 docker image 예시

postgres:10.10 Layer -2 application image
alpine:3.10 Layer -1 linux base image

 

Docker의 Image 다운로드

- Docker Hub의 이미지를 다운받을 때는 인증 및  로그인이 필요하지 않다.

- 이미지는 레이어 별로 다운로드 된다.

- 만약, 이전 버전이 설치된 이 후, 다음 버전을 설치하게 되면, 버전이 바뀌어도 같은 레이어는 다운로드 하지 않고 변경된 레이어만 다운로드되므로 효율적이다.

 

Docker Image vs Docker Container

Docker Image Dokcer Container
패키지 실제로 실행되는 어플리케이션
옮길 수 있는 Artifact Container 환경이 생성되어 있다.

=> Docker Image는 Program, Dokcer Container는 Process의 개념과 유사하다고 이해하였다.

 

Docker vs Virtual Machine

OS는 hardware위에 OS Kernel, Appications 두 레이어가 존재한다고 할 수 있다.

Docker Virtual Machine
가상화 툴
Application Layer를 가상화 OS Kernel과 Application 두 레이어를 가상화
크기가 더 작다. => 레이어를 하나만 가상화하기 때문에 크기가 더 크다.
속도가 더 빠르다. 속도가 더 느리다. => OS Kernel까지 boot해야되기 때문에
호환성이 더 나쁘다. => OS Kernel이 없기 때문에, Host가 Application과 호환이 되지 않는 OS Kernel을 가졌을 때 문제가 생김 호환성이 더 좋다.

=> 호환성의 문제는 older macOS와 windows를 지원해주는 Docker Toolbox로 해결할 수 있다.

 

Docker 기본 명령어

- docker run [Docker Image] : 새로운 컨테이너를 시작한다. 이미지를 pull하고 start하는 것과 같다.

옵션 -p: Detached 모드. 컨테이너가 백그라운드로 시작된다.

- docker pull [Docker Image]: 도커 이미지를 가져온다.(다운로드)

- docker stop [Docker Container] : 컨테이너를 중단시킨다.

- docker start [Docker Container] : 중단된 컨테이너를 다시 시작한다.

- docker ps : 실행되고 있는 컨테이너 목록을 보여준다.

옵션 -a : 실행되고 있는, 중단되어 있는 모든 컨테이너 목록을 보여준다.

- run은 새롭게 컨테이너를 시작하는 것이고, start는 중단된 컨테이너를 다시 시작

 

Container Port vs Host Port

- 여러 개의 컨테이너가 호스트에서 실행되고 있을 때, 서로 다른 컨테이너의 포트가 겹친다면 문제가 생길 것이다.

- Container의 port와 Host의 port는 별도로 구성된다.

호스트의 포트와 컨테이너의 포트를 연결해주어야 호스트의 포트로 수신된 데이터를 내가 원하는 컨테이너의 포트로 전달할 수 있다.

- 호스트에서 redis 이미지와 redis:4.0 이미지를 함께 실행시키면 서로 같은 포트를 사용하게 될 것이다.

이 때, 다음 예시와 같이

docker run -p6000:6379 -d redis
docker run -p6001:6379 -d redis:4.0

호스트의 6000번 포트에 redis 컨테이너의 6379 포트를 연결(binding)해주고,

호스트의 60001번 포트에 redis:4.0 컨테이너의 6379 포트를 연결해주면 적절한 포트 바인딩을 만들 수 있을 것이다.

 

도커 디버깅

- docker logs [Container ID or Name]

docker run 할때 name 정할수도 있다

docker run -d -p6001:6379 --name redis-older redis:4.0

- docker exec -it [container id or name] /bin/bash

실행되고 있는 컨테이너의 가상화된 파일 시스템에 접근할 수 있게 된다.

경량화된 리눅스를 사용하는 컨테이너라면 shell의 모든 명령어가 되지 않을 수 있다.

 

이 후, Docker Compose와 Dockerfile, Docker Volume은 영상과 함께 실습하길 바란다.