도커의 좋은 강의 영상을 찾아 게시글로 정리하였다.
영상에서는 좋은 이미지와 실습을 함께 보여주기 때문에 영상으로 전부 보기를 추천
영어 강의고 자막은 없지만, 영어 발음이 듣기에 아주 편해 영어를 잘 못하는 편이지만 쉽게 들을 수 있었다.
컨테이너 논리적 개념
- 어플리케이션을 필요한 모든 설정과 의존관계를 함께 패키징하는 방법이다.
- 쉽게 공유하고 움직일 수 있는 물체이다.
- 개발과 배포를 보다 효율적으로 만들어준다.
컨테이너는 어디에 저장되어 있을까?
- 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은 영상과 함께 실습하길 바란다.