Docker

danbibibi·2022년 7월 9일
0

SKT FLY AI 🚀

목록 보기
2/5

Docker

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 다양한 프로그램, 실행환경을 컨테이너로 추상화하고, 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 더 간결하게 할 수 있다.


도커는 기존의 OS 전체를 가상화하던 방식에서 벗어남으로써 overhead를 줄일 수 있다.

Docker Image

Docker Image는 컨테이너 생성(실행)에 필요한 실행파일, 설정 값 들을 가지고 있다. 하나의 이미지로 여러 컨테이너를 생성할 수 있으며 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다. (이미지는 상태 값을 가지지 않고 변하지 않는다.)

Docker Container

Docker Container는 Docker Image를 실행한 상태로 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징(캡슐화)하여 격리된 공간에서 프로세스를 동작시키는 기술이다. (위 그림에서 도커 이미지를 실행하여 컨테이너를 만드는 것을 확인할 수 있다.)

Docker Hub

도커에서 제공하는 기본 이미지 저장소로 ubuntu, centos 등의 베이스 이미지와 java, python 등의 공식 이미지가 저장되어 있다.

Dockerfile

Dockerfile은 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경변수설정 등을 기록한 파일이다. Dockerfile을 build하면 자동으로 이미지가 생성된다. (Dockerfile을 이용하여 빌드, 배포를 쉽게할 수 있다.)

# FROM <image>[:<tag>] [AS <name>]
FROM ubuntu:18.04 # 생성할 이미지의 베이스가 되는 이미지 (우분투)

LABEL "purpose"="practice" # 메타데이터 표시

# RUN <command>
RUN apt-get update #운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트 (=설치가능한 리스트 업데이트)
RUN apt-get install apache2 -y # 설치한 패키지들을 최신 버전으로 업그레이드 / 아파치 설치

ADD test.html /var/www/html # 호스트에 있는 파일을 추가

# WORKDIR /path/to/workdir
WORKDIR /var/www/html # 작업공간 이동(=cd)

RUN ["/bin/bash", "-c", "echo hello > test2.html"] # test2.html 파일생성
 
# EXPOSE <port>/<protocol> (default protocol: TCP)
EXPOSE 80 # 포트 80번 노출 지정

# CMD <command>
CMD apachectl -DFOREGROUND # 컨테이너 생성시 시작명령어

FROM: 베이스 이미지 지정
LABEL: 이미지의 라벨 지정 (메타데이터)
RUN: 이미지를 지정하면서 실행할 명령 지정
ADD: 이미지 생성 시 파일 추가
EXPOSE: 컨테이너 포트 지정
COPY: 이미지 생성 시 파일 복사
WORKDIR: 컨테이너 작업 디렉토리 지정
CMD: 컨테이너의 어플 지정 (컨테이너 실행 , 하나의 CMD만 실행 가능)

Docker 기본 명령어

Docker pull

Docker image repository에서 도커 이미지를 가져오는 명령어 (태그를 지정해서 가져올 수 있음)

docker pull ubuntu:18.04

Docker images

로컬에 존재하는 도커 이미지 리스트를 출력하는 명령어

docker images

Docker run

도커 컨테이너를 실행시키는 명령어

# -it : 컨테이너를 실행시킴과 동시에 interactive한 terminal로 접속
# --name : 컨테이너 id 대신 구분하기 쉽도록 지어주는 이름 
docker run -it --name ubuntu ubuntu:18.04

(exit를 입력하고 나오면 된다.)

Docker ps

현재 실행 중인 도커 컨테이너 리스트를 출력하는 명령어

docker ps 
docker ps -a

Docker exec

도커 컨테이너 내부에서 명령을 내리거나, 내부로 접속하는 명령어

docker start
docker exec -it ubuntu bin/bash

Docker logs

도커 컨테이너의 로그를 확인하는 명령어

docker logs ubuntu

Docker stop

실행 중인 도커 컨테이너를 중단 시키는 명령어

docker stop ubuntu

Docker rm

도커 컨테이너를 삭제하는 명령어

docker rm ubuntu

Docker rmi

도커 이미지를 삭제하는 명령어

docker rmi ubuntu

Dockerhub에 이미지 올리기

  1. 다음과 같이 Dockerfile을 만들어 준다.
# Dockerfile
FROM ubuntu:18.04 
RUN apt-get update
CMD ["echo", "Hello"]
  1. Docker Hub에서 Create Repository를 클릭하여 repository를 하나 만들어준다.

  1. 아래 명령어를 이용해 터미널에서 Docker Hub에 계정을 연동한다.
docker login

  1. Dockerfile이 존재하는 디렉토리에서 build 명령어를 통해 이미지를 빌드한다.
# docker build -t <dockerhub username>/<레파지토리명:태그명> .
docker build -t sweetrain822/practice:v1 .

  1. 생성된 이미지를 다음과 같이 push 명령어를 통해 repository에 업로드한다.
# docker push <dockerhub username>/<레파지토리명:태그명> .
docker push sweetrain822/practice:v1 .

Docker Registry 구축

  1. 다음과 같이 Dockerfile을 만들어 준다.
# Dockerfile
FROM ubuntu:18.04 
RUN apt-get update
CMD ["echo", "Hello"]
  1. Dockerfile을 build한다. (Docker image를 build 할때는 반드시 Dockerfile이 있는 위치에서 build 명령어를 실행해야 한다!)
docker build -t practice:v1 . # 뒤에 점은 현재 경로를 의미
docker images | grep practice # 정상적으로 build되었는지 확인

빌드한 이미지로 도커 컨테이너를 run해보면 hello가 출력되는 것을 확인할 수 있다.

 docker run practice:v1

  1. 이제 build한 이미지를 registry에 push해보자. 아래 명령어를 통해 해당 이미지를 이용하여 로컬 레지스트리를 구축할 수 있다.
# -d : 컨테이너를 백그라운드로 실행
# -p : 호스트와 컨테이너의 포트를 연결 (포트포워딩) <호스트 포트>:<컨테이너 포트>
docker run -d -p 5000:5000 --name registry registry

  1. practice:v1을 방금 생성한 registry를 바라보도록 tag한다.
docker tag practice:v1 localhost:5000/practice:v1
docker images | grep practice # 확인

  1. 마지막으로 practice를 registry에 push한다!
docker push localhost:5000/practice:v1
profile
블로그 이전) https://danbibibi.tistory.com

0개의 댓글