본문 바로가기

Docker&Kubernetes 스터디

도커 스터디 1주차 - Docker 소개 & Docker 활용

[용어 정리]
- 이미지: 어떤 프로그램을 실행하기 위해 필요한 모든 것(코드, 라이브러리, 설정 등)을 하나로 묶은 패키지
- 컨테이너
: 이미지를 실행해서 만든 실제 실행 중인 인스턴스 (가상실행 환경)

 

도커란?

가상실행환경을 제공하는 오픈소스 플랫폼이다.

도커에서는 이런 가상실행환경을 컨테이너라고 한다.

 

전통적인 환경에서 현재로의 변화

  • 전통적인 환경에서는 OS 위에 바로 어플리케이션을 띄웠다면, 클라우드 환경으로 넘어오면서 하이퍼바이저가 생겨났다.
  • 하이퍼 바이저 : 서버에 하이퍼바이저를 설치, 가상 VM을 올림
  • 컨테이너가 생겨나며 하이퍼바이저의 필요성이 사라짐
  • OS 위에 컨테이너 런타임만 올려주면 컨테이너화된 프로세스를 바로 띄울 수 있도록 변화

도커의 장점

  • 도커 플랫폼이 설치된 곳이라면 어떤 어플리케이션이라도 실행할 수 있음
  • 하이퍼바이저에 비해 빠르기 때문에 어플리케이션의 실행도 빨라짐
  • 도커는 유닉스 도메인 소켓 통신을 이용. TCP/IP 통신이 아니라서 빠르다.

도커 아키텍처

클라이언트, 도커 호스트, 레지스트리로 이루어져있다.

  • 클라이언트 : 명령어를 치는 CLI
  • 도커 호스트 : 명령어를 받아 일련의 작업을 수행해주는 서버
  • 레지스트리 : 도커 이미지를 저장하고 공유하는 저장소

 

도커 설치

# 실행중인 프로세스를 보는 명령어
ps

# root 관리자 계정으로 전환
sudo su -
whoami

# 도커 설치
**curl -fsSL <https://get.docker.com> | sh**

# 도커 설치 정보 확인
docker info
docker version

 

권한 설정

도커를 설치하면 docker라는 사용자 그룹이 생성된다.

이 그룹에 해당 유저를 추가시켜줘야 함

# Ubuntu 사용자를 docker 그룹에 추가 (docker socket 접근 권한)
sudo usermod -aG docker Ubuntu

# 위 명령어 입력 후 SSH 재접속해야 함
exit

 

도커 기본 명령어

cker# 현재 컨테이너의 프로세스 조회
docker ps
# 실행 후 종료된 프로세스까지 조회
docker ps -a

# 이미지 다운로드
docker pull hello-world:latest

# 현재 로컬에 있는 이미지 조회
docker images

# 도커 실행 - 도커에 있는 이미지를 가지고 도커를 실행시키는 명령어
docker run --help
# 도커가 실행 되었다가 바로 종료
docker run --name first-docker hello-world:latest
#3000: 컨테이너 포트/ 80: nginx 포트번호
docker run --name nginx-docker -p 3000:80 -d nginx:latest

# 네트워크 상태 조회(호스트에 3000번 포트 열려있는 지 확인)
netstat -ntlp

# 컨테이너 프로세스 재조회
docker ps --help
docker ps
docker ps -a

# 컨테이너 로그 조회
docker logs --help
docker logs first-docker
docker logs -f nginx-docker

# 컨테이너 내부에서 sh 실행
docker exec --help

# 실행되고있는 컨테이너 안으로 들어가는 명령어
docker exec -it nginx-docker /bin/bash
# 이 환경에서 nginx 상태 확인 - 호출되는 지 확인
curl 

exit
# 위에서 서버의 3000포트에 80을 매핑 시켰으므로
curl 
# 현재  공인 IP 호출하는 명령어
curl <https://ipinfo.io/ip>

# 컨테이너 상세 정보 조회
docker inspect nginx-docker

# 컨테이너 네트워크 조회
docker network ls
docker network inspect bridge
docker network inspect bridge | grep 'Containers' -A8

# 실행중인 컨테이너 종료
docker stop nginx-docker
docker stop $(docker ps -aq)

# 컨테이너 제거
docker rm nginx-docker
docker rm $(docker ps -aq)

# 컨테이너 이미지 제거
docker rmi nginx:latest hello-world:latest

 

자주 사용하는 docker run 명령어 옵션

docker run --help

# 필수로 알아야 하는 옵션
-d        : [Detach] 백그라운드에서 컨테이너 프로세스 실행 (nohup &)
-i        : [Interactive] 표준입력 연결 (입력) (-it 는 세트)
-t        : [tty] 가상 터미널 생성 - 상호작용 (출력) (-it 는 세트)
--name    : 컨테이너 이름 지정
-p        : [Publish] 호스트 포트와 컨테이너 포트 매핑
--restart : 재시작 정책 [always 항상, on-failure 에러 코드 0이 아닌 경우, unless-stopped 수동으로 중지하지 않는 한]
-v        : [volume] 호스트 볼륨 마운트(호스트의 볼륨과 컨테이너의 볼륨 연결)

# 알아두면 좋은 옵션
-u        : [user] 컨테이너 내부 실행 유저
--rm      : 컨테이너 종료 시 자동 삭제, 임시 사용 [restart 와는 동시 사용 불가]

## 참고
# --restart 와 --rm 은 같이 사용할 수 없다.(--restart: 죽으면 어떻게 계속 살릴 지 , --rm: 죽었을 때 바로 제거)
# -d 와 -it 는 함께 사용할 수 없다. (docker exec -it 활용)

# 예시
mkdir ~/volume-mount && cd ~/volume-mount && touch hello.txt

docker run \\
	--name nginx-docker \\
	-d \\
	-p 3000:80 \\
	-v $(pwd):/tmp-dir \\
	--restart always \\
	nginx:latest
	
docker exec -it nginx-docker /bin/bash

 

컨테이너 네트워크

Bridge 모드

  • 기본 네트워크 모드로, Docker가 생성한 가상 브리지 네트워크(docker0)를 사용
  • 컨테이너는 자신만의 IP를 가지며, 브리지를 통해 호스트와 통신
  • 컨테이너 네트워크 인터페이스에서 나와서 VM의 IP를 달고 외부 통신 후 들어올 때 다시 VM을 타고 들어옴

Host 모드

  • 컨테이너가 호스트의 네트워크 네임스페이스를 그대로 사용
  • 즉, 컨테이너와 호스트가 같은 IP와 포트를 공유
  • 포트 포워딩이 필요 없으며, 네트워크 성능이 좋다. 격리 수준은 낮음

None 모드

  • 네트워크를 아예 사용하지 않는 모드
  • 컨테이너가 네트워크 인터페이스를 가지지 않으며, 외부와 통신이 불가능
  • 네트워크가 필요 없는 작업이나, 사용자가 커스텀 네트워크를 구성할 경우에 유용

 

도커 파일이란?

  • 도커 이미지 생성을 위한 일종의 설계도로, 일련의 스크립트가 작성된 파일이다.
  • 어떤 OS에서 실행되었는 지, 어떤 파일들이 컨테이너 내부로 복사되었는 지, 어떤 패키지가 설치되었는지, 컨테이너를 만들기 위해 어떤 명령어를 실행했는 지가 기술되어 있는 파일

이미지 빌드란?

사용자가 작성한 Dockerfile을 기반으로 컨테이너 실행에 필요한 모든 설정(운영체제, 패키지, 소스코드 등)을 포함한 도커 이미지(Docker Image)를 생성하는 과정