[K8s] 도커 기초

Aiden·2021년 6월 13일
0

K8S Study

목록 보기
1/9

쿠버네티스 스터디(DKOS; Docker & K8s Online Study)를 참여하며 공부한 내용을 기록한다.

매주 한번씩, 8주차까지 이어질 계획이다.

1. Docker 소개

1-1. Docker란?

  • Docker는 가상실행 환경을 제공해주는 오픈소스 플렛폼.
  • Docker에서는 이 가상 실행 환경을 컨테이너(Container)라 부른다.

1-1-1. 특징

  • 도커 플랫폼이 설치된 곳이라면 어디서든 실행할 수 있는 장점이 있다.
  • 표준화, 이식성, 가볍다

1-2. 컨테이너와 가상머신

1-2-1. 컨테이너

컨테이너는 운영체제를 제외한 나머지 애플리케이션 실행에 필요한 모든 파일을 패키징한다는 점에서 OS 레벨의 가상화를 지원한다.

1-2-2. 가상머신

가상머신은 기존의 서버에 하이퍼바이저를 설치한 후, 그 위에 가상 OS와 패키징한 VM을 만들어 실핸하는 방식인 하드웨어 레벨의 가상화를 지원한다.

1-2-3. 정리

컨테이너는 게스트OS와 하이퍼바이저가 없기때문에 이로인한 오버헤드를 줄임으로써 훨씬 더 가볍게 프로세스를 실행할 수 있다.

  • 컨테이너는 호스트의 커널을 공유하지만, 개별적인 사용자 공간(user space)을 가진다.
  • 가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, namespace, cgroup 을 사용함으로써 프로세스 단위의 격리 환경을 만든다.

2. Docker Management

2-1. Docker 상태

2-1-1. Created

컨테이너가 생성되고 시작하지 않은 상태

2-1-2. Running

컨테이너의 모든 프로세스가 실행중인 상태

2-1-3. Paused

컨테이너의 프로세스가 멈준 상태

2-1-4. Stopped

컨테이너의 프로세스가 종료된 상태

2-1-5. Deleted

컨테이너가 삭제된 상태

2-2. Docker 명령어

2-2-1. Pull

$ docker pull <image name>:<version>

2-2-2. Create

$ docker create --name <container name> <image name>

2-2-3. Start

$ docker start <container name>

2-2-4. Run

$ docker run -it --name <container name> <image name>
  • run 명령어는 pull, create, start를 모두 실행
  • pull 되어있는 이미지라면, create, start만 실행

2-2-5. Pause / Unpause

$ docker pause <container name>
$ docker unpause <container name>

2-2-6. Stop

$ docker stop <container name>
or
$ docker stop $(docker container ls –aq)

2-2-7. Delete (Container)

$ docker stop <container name>
$ docker rm <container name>
or
$ docker rm $(docker ps -aq)

2-2-8. Delete (Imange)

$ docker rmi <image name>

2-2-9. ps

$ docker ps
or
$ docker ps -a // 중지된 컨테이너까지 확인

3. Docker 설치

ubuntu 20.04 버전을 기준으로 작성

3-0. 패키지 목록 업데이트

$ sudo apt update

3-1. 필수 패키지 설치

$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

3-2. GPG Key 인증

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

3-3. docker repository 등록

sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) \stable"

3-4. docker 설치

sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io

3-5. docker 서비스 실행 / 부팅시 자동 실행 설정

sudo systemctl enable docker && service docker start

3-6. Docker 서비스 상태 확인

service docker status

4. 실습

Docker Hub와 Dockerfile을 이용해 이미지 생성/업로드 및 다운로드를 실습한다.

4-1. Docker Hub

4-1-1. Docker Hub 란?

  • 도커 허브(Docker Hub)는 도커 이미지 원격 저장소이다. (github 처럼, 소스가 아닌 이미지 저장)
  • 도커 허브에 이미지를 업로드하고, 다른 곳에서 자유롭게 재사용(다운로드)할 수 있다.
  • 여러 사용자가 자신이 만든 도커 이미지를 서로 자유롭게 공유할 수 있는 장을 마련해 준다.
  • 도커 허브는 누구나 이미지를 올릴 수 있기 때문에 공식(Official) 라벨이 없는 이미지는 사용법을 찾을 수 없거나 제대로 동작하지 않을 수 있다.
  • 또한, 보안에 취약할 수 있으니, 가급적(이라쓰고 반드시라고 읽는다) 공식 이미지를 사용하자.

4-2. Dockerfile

4-2-1. Dockerfile 이란?

  • Docker 이미지 빌드를 자동화하기 위해 이미시 생성 방법을 정의하는 문서

4-2-2. Dockerfile 설명

명령어을 명시한 뒤에 옵션을 추가하는 방식이며, Dockerfile 명령어는 위에서 한 줄씩 차례대로 실행된다.

  • FROM : 기반 이미지(base image)가 될 이미지. 이미지가 없다면 자동으로 pull 함
  • LABEL : 이미지에 '키:값' 형태의 메타데이터를 추가, 정보나 주석 표현. docker inspect 확인
  • RUN : 이미지 생성을 위해 컨테이너 내부에서 명령어를 실행. 빌드 과정에서 별도의 사용자 입력이 불가능. 입력 존재 시 오류로 간주하고 빌드를 종료.
  • ADD : 파일을 이미지에 추가. 파일은 Dockerfile 위치한 디렉터리인 컨텍스트(Context)에서 가져옴.
  • WORKDIR : 명령어를 실행할 디렉터리. 배시 셸에서 cd 명령어와 같음.
  • EXPOSE : 이미지에서 노출할 포트를 설정. EXPOSE는 컨테이너를 생성하는 run 명령어에서 모든 노출된 컨테이너의 포트를 호스트에 퍼블리시(Publish)하는 -P 플래그와 함께 사용.
  • CMD : 컨테이너가 시작될 때마다 실행할 명령어(커맨드)를 설정. Dockerfile 에서 한 번만 사용할 수 있음

4-3. 실습

4-3-1. Dockerfile 작성

cat <<EOT> Dockerfile
FROM ubuntu:14.04
LABEL maintainer "aiden<email@mail.com>"
LABEL "purpose"="practice"
RUN apt-get update
RUN apt-get install apache2 figlet -y
ADD test.html /var/www/html
WORKDIR /var/www/html
RUN ["/bin/bash", "-c", "echo Hello! DDaetMok!!! | figlet > /var/www/html/index.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND
EOT

4-3-2. 이미지 빌드

$ docker build <PATH> -t <IMAGE_NAME>:<TAG>
or
$ docker build -t <IMAGE_NAME>:<TAG> <PATH>
$ docker build -t helloweb:1 ./

4-3-3. Docker Hub 로그인

$ docker login
Username: *<자신의 ID>*
Password: *<암호>*
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
...
Login Succeeded

4-3-4. Docker Hub에 이미지 업로드

$ docker push *<도커 허브 계정>*/helloweb:1
$ docker push you1367/helloweb:1

4-3-5. Local 이미지 삭제 / 확인

$ docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q) -f && docker rmi $(docker images -q) -f
$ docker ps -a
$ docker images

4-3-6. 이미지 실행

빌드한 이미지는 삭제하여, 현재 로컬에 없는 상태.

따라서, 도커 저장소에서 다운받아 컨테이너를 실행한다.

$ docker run -d -p 8080:80 --name webserver *<도커 허브 계정>*/helloweb:1
$ docker run -d -p 8080:80 --name webserver you1367/helloweb:1

4-3-7. 확인

$ curl localhost:8080

profile
기억이 안되면 기록이라도🐳

0개의 댓글