본문 바로가기
Docker

docker 기초

by 차가운개발 2024. 9. 1.

※ 유튜브 어라운드 허브 스튜디오 채널의 도커 기초 강의를 참고하여 작성했습니다.

https://www.youtube.com/watch?v=p1-wm-ThnTI&list=PLlTylS8uB2fDLJRJCXqUowsOViG-ZKnWy

 

ㅇ docker 기초

도커(docker)란

    컨테이너 기반의 오픈소스 가상화 플랫폼이다.

    어떤 프로그램을 외부 환경과 격리시켜 구동할 수 있게 해주는 소프트웨어다.

 

컨테이너(container)란

    os 상에 논리적인 영역(컨테이너)를 구축하고, 애플리케이션이 작동하는데 필요한 요소들을 모아 별도의 서버처럼 작동      하는 것 필요한 요소만으로 구성되어 오버헤드(특정 작업이나 기능을 수행하는 데 추가적으로 필요한 시간, 메모리, 처        리 능력 등의 리소스)가 적음

 

Infrastructure : 컨테이너를 실행하고 관리하는 데 필요한 모든 하드웨어 및 소프트웨어 자원

Host Operating System : 운영체제

 

docker는 리눅스 환경을 기반으로 하며, 격리된 환경으로 A의 동작환경과 B의 동작환경이 달라도 영향을 주지않는다.

docker는 운영체제가 가지고 있는 커널의 중요기술들을 일부분만 가져와 os처럼 보여지게끔 환경을 구성해서 애플리케이션이 동작하게 해준다.


ㅇ 컨테이너 구조 및 커맨드 사용법

도커 컨테이너는 컨테이너 레이어와 이미지 레이어로 구성되어 있다.

  • 컨테이너 레이어 : 읽기/쓰기가 가능한 계층 최상단 레이어에 추가 컨테이너의 실행, 변경사항은 이 계층에 저장됨
    컨테이너 레이어는 컨테이너가 서로 공유하지 않는 계층이고 이미지 레이어를 공유하고 각 컨테이너는 떨어져 있다.
  • 이미지 레이어 : 읽기 전용 계층으로 다른 컨테이너와 공유할 수 있는 레이어
# 도커의 명령어 구조
docker {대상} {커맨드} {옵션} {인자}

# 대표적인 커맨드 대상

docker container
#docker container의 커맨드 대상과 주요 옵션
docker container start -i (컨테이너 실행)
docker container stop (컨테이너 정지)
docker container create --name, -e, -p, -v (컨테이너 생성)
docker container run --name, -e, -p, -v, -d, -i, -t (이미지를 내려받고 컨테이너를 생성 및 실행)
docker container rm -f, -v (컨테이너 삭제)
docker container exec -i, -t (컨테이너에서 프로그램 실행)
docker container ls -a (컨테이너 목록 출력)
docker container cp (컨테이너와 호스트 간 파일 복사)
docker container commit (컨테이너를 이미지로 변환)

docker image
# doker image의 커맨드 대상과 주요 옵션
docker image pull (이미지 내려받기)
docker image rm (이미지 삭제)
docker image ls (이미지 목록 출력)
docker image build -t (이미지 생성)

# 옵션의 의미
--name (컨테이너 이름)
-p (포트번호 지정)
-v (볼륨 설정)
-e (환경 변수 설정)
-d (백그라운드 실행)
-i (컨테이너에 터미널 연결)
-t (특수 키를 사용가능하게 설정)

docker volume
docker network

 

컨테이너와 이미지목록을 각각 확인해보기

 

# 명령어를 입력하여 컨테이너 실행하기(이미지가 존재하지 않는다면 최초 실행시 자동으로 이미지를 다운받아준다.)
docker container run httpd
docker container run -d httpd

# -d(detach) 옵션을 사용하지 않고 명령어를 실행하면 커서가 묶인다.
# -d 옵션을 사용하지 않으면 포그라운드 모드에서 실행되기 때문에 실행된 프로세서가 현재 터미널 세션과 연결된 상태로 남아있기 때문이다.
# -d 옵션을 사용하면 컨테이너를 백그라운드에서 실행하고 즉시 컨테이너 id를 반환 후 터미널을 사용자에게 돌려준다.

 

-d 옵션을 사용하지 않았을 경우 새로 터미널 창을 열어 ls명령어로 이름을 확인한 뒤 컨테이너를 종료시키면 터미널이 사용자에게 다시 돌아온다.

 

옵션을 적용해서 컨테이너 실행해보기, ls -a는 중지된 컨테이너 목록도 확인할 수 있다. 컨테이너를 삭제할 땐 중지 하고 삭제해야한다.


ㅇ 컨테이너 통신

도커 컨테이너는 독립적인 환경에서 실행되기 때문에 컨테이너 밖에서 접근할 수 없다.

# 컨테이너와 통신하기 위해서는 컨테이너를 가동 시키면서 -p 옵션을 사용하요 호스트와 컨테이너의 포트를 연결해줘야 한다.
-p 호스트 포트:컨테이너 포트

# 도커 커맨드를 실행시켜보고 차이에 대해 알아보기
docker run --name test1 -d httpd
docker run --name test1 -d -p 8080:80 httpd

#옵션의 의미
--nme test1 (test1이라는 이름으로 컨테이너를 생성)
-d (백그라운드에서 동작하기)
-p 8080:80 (호스트의 포트 8080, 컨테이너의 포트 80으로 네트워크 설정)

# 두개의 명령어 중 하나를 사용하여 상태를 확인해보기
docker ps -a
docker container ls -a

# 실습을 마무리 하면 실행을 중지하고 삭제하기
docker stop test1
docker rm test1

 

커맨드를 실행시키고 차이를 비교해본다. test2의 포트가 연결된 것을 확인 할 수 있다.

 

포트가 연결이 되면 웹브라우저(외부)를 통해서 접근이 가능하다.

 

컨테이너가 실행되는 순간부터는 docker를 통해 컴퓨터의 리소스가 소비되니 실습이 끝나면 정리를 해주는 것이 좋다.

# 사용을 마친 도커 컨테이너 정리하기
docker container stop test1
docker container rm test1

ㅇ 도커 파일 작성하기

도커 파일은 도커 이미지를 생성하기 위한 스크립트 파일이다.

여러 키워드를 사용하여 도커 파일을 작성하여 빌드를 쉽게 수행할 수 있게 한다.

 

도커 파일 주요 인스트럭션(키워드 정도로 생각하자)

  • FROM : From 키워드를 사용하여 base가 되는 image를 지정(주로 OS 이미지나 런타임 이미지를 지정한다.)
  • RUN : 이미지를 빌드할 때 사용하는 커맨드를 설정할 때 사용
  • ADD : 이미지에 호스트의 파일이나 폴더를 추가하기 위해 사용(이미지에 존재하지 않는 디렉토리는 자동생성)
  • COPY : 호스트 환경의 파일이나 폴더를 이미지 안으로 복사하기 위해 사용
    (ADD와 동일하게 동작하지만 URL을 지정하거나, 압축파일을 자동으로 풀지 않는 차이점을 가지고 있다.)
  • EXPOSE : 이미지가 통신에 사용할 포트를 지정할 때 사용
  • ENV : 환경변수를 지정할 때 사용 설정한 변수는 $name, ${name} 의 형태로 사용이 가능하다.
    (${name:-else} : name이 정의가 안되어 있다면 else가 사용된다.)
  • CMD : 도커 컨테이너가 실행될 때 실행할 커맨드를 지정
    (RUN과 비슷하지만 CMD는 도커 이미지를 빌드할 때 실행되는 것이 아닌 컨테이너를 시작할 때 실행된다.)
  • ENTRYPOINT : 도커 이미지가 실행될 때 사용되는 기본 커맨드를 지정(강제)
  • WORKDIR : RUN, CMD, ENTRYPOINT 등 사용한 커맨드를 실행하는 디렉토리를 지정 -w 옵션으로 오버라이딩 가능
  • VOLUME : 퍼시스턴스 데이터를 저장할 경로를 지정할 때 사용 호스트의 디렉토리를 도커 컨테이너에 연결
    (주로 휘발성으로 사용되면 안되는 데이터를 저장할 때 사용한다.)
  • 기타옵션: SHELL, LABEL, USER, ARG, STOPSIGNAL, HEALTHCHECK
# 도커 파일을 실행하기 위한 도커 빌드 커맨드
docker build [옵션] [이미지명] [도커파일 디렉토리]
ex : docker build -t test .

# 생성된 이미지를 컨테이너로 실행하기 위한 run 커맨드
ex : docker run --name test_app -p 8080:80 test

 

2개의 파일을 준비한다.

 

메모장에 html 코드를 작성하고 index.html로 저장한다.

 

메모장에 도커파일 스크립트를 작성하고 저장한다.

메모장으로 도커 파일을 생성할때는 반드시 파일 형식을 모든 파일로 바꿔주고

이름을 "Dockerfile" 로 작성하여 .txt 확장자를 없애줘야 한다.

 

터미널을 파일이 위치한 디렉토리로 이동시킨 후 명령어를 입력한다.

docker build -t test123:1.1 .
# test123뒤에 :1.1 형식을 입력하면 버전을 태그할 수 있다. 마지막 .은 디렉토리의 경로이다
# docker image ls를 확인해보면 TAG가 다른 test123이 2개가 존재하는 걸 확인할 수 있다.

# 생성된 이미지를 가지고 도커 컨테이너를 실행시키기
docker run --name test123_app -p 8080:80 test123

 

test123을 실행시켜 index.html이 표시된다.


ㅇ 도커 컴포즈 파일 작성하기

컴포즈 파일은 도커 애플리케이션의 서비스, 네트워크, 볼륨 등의 설정을 yml 형식으로 작성 통합 관리하는 파일이다.

공식 사이트에서 제공하는 예제 파일

구성요소

  • version (defrecated)
  • services (가장 많이 사용됨)
  • network
  • volume
  • config
  • secret

services : 여러 컨테이너를 정의하는데 사용

위와 같이 파일을 작성했다면, 'frontend'와 'backend'는 각 컨테이너를 정의하게 되며, 각 이름이 됨.

컨테이너를 설정할 때 사용되는 키워드
image 컨테이너의 이미지를 정의
build 위 image를 활용하는 방식이 아닌 dockerfile의 경로를 지정하여 빌드하는 사용 방법
dockerfile dockerfile의 이름이 'Dockerfile'이 아닌 경우 이름을 지정하기 위해 사용
ports 호스트와 컨테이너의 포트 바인딩 설정
volumes 호스트의 지정된 경로로 컨테이너의 볼륨을 마운트 하도록 설정
container_name 컨테이너의 이름을 설정
command 컨테이너가 실행된 후컨테이너의 쉘에서 실행시킬 쉘 명령어 설정 
environment 환경변수를 설정
env_file environment와 동일한 기능을 수행하지만 이 키워드를 사용하면 env 파일을 이용해서 적용 가능
depends_on 다른 컨테이너와 의존관계를 설정
restart 컨테이너의 재시작과 관련한 설정

 

# 도커 컴포즈 파일을 실행하기 위한 명령어
docke-compose up

# -f 옵션: 컴포즈 파일의 지정된 이름형식을 사용하지 않고 원하는 이름을 사용할 때 사용
# 도커 컴포즈 파일은 기본적으로 'docker-compose.yml' 또는 'docker-compose.yaml'을 이름으로 사용한다.
docker-compose -f docker-compose-custom.yml up

# -d 옵션: 백그라운드에서 도커 컴포즈 파일을 실행하기 위해서 사용
docker-compose up -d

 

2개의 yml 파일을 준비한다.
메모장에 작성한 yml 파일

2개의 파일은 내용이 모두 동일하나 ports의 3307만 3308로 바꿔준다.

docker-compose.yml = 3307

docker-compose-custom.yml = 3308

 

yml 파일은 탭(tab)을 허용하지 않고 일관적인 공백을 사용해야하니 주의하자.

 

# 터미널을 파일이 위치한 디렉토리로 이동시킨 후 도커 컴포즈 파일을 실행시키기 
docker-compose up

# 최초 실행시에는 이미지를 다운받아 설치하기 때문에 터미널 화면이 다를 수 있다.

정상 실행되었다면 도커 데스크탑에서 컨테이너를 확인 할 수 있다.

 

# 커스텀한 이름을 사용하는 컴포즈 파일 실행시키기
docker-compose -f docker-compose-custom.yml up

위의 이미지와 포트번호가 다른 것을 확인할 수 있다.


ㅇ 이미지 생성 및 저장하기

주로 이미지를 생성하는 경우

  • 특정 이미지에 자주 사용하는 설정을 추가하여 편하게 사용하고 싶은 경우
  • 본인이 개발한 애플리케이션을 이미지로 생성하고 싶을 경우
# 컨테이너로 이미지 생성하기
# 기존 이미지에 추가 설정이 반영되어 있는 컨테이너를 그대로 이미지로 생성하기
docker commit [컨테이너 이름] [이미지 이름]

# 도커파일로 이미지 생성하기
docker build [옵션] [도커파일 디렉토리]

이렇게 생성된 이미지는 파일로 저장이 가능하다.

대체로 운영 서버에서 이미지를 사용해야 할 때 종종 사용되기도 함

 

# save/load : save를 이용한 이미지 저장은 원본 이미지와 레이어를 동일하게 가져가는 형식으로 동작
# save : 도커 이미지를 tar 파일로 추출
docker save -o test123.tar test123:last

# load : 추출된 tar 파일을 이미지로 불러옴
docker load -i test123.tar

# export/import : export를 이용한 이미지 저장은 원본 이미지와 다르게 하나의 레이어로 통합되어 추출됨 추출된 이미지는 다시 컨테이너로 가동하기 위해서 별도의 작업이 필요
# exprot : 도커 컨테이너를 tar 파일로 추출
docker export test123 > test123.tar

# import : 추출된 tar파일을 이미지로 불러옴
docker import test123.tar [생성될 이미지의 이름]:[생성될 이미지 태그]

 

 

 

컨테이너를 사용해서 이미지 만들기(도커 파일로 이미지 만들기는 도커파일 작성하기 단원에서 확인 할 수 있다.)

컨테이너를 실행상태로 둔다.

 

컨테이너를 이용해서 이미지를 생성한다.
이미지가 생성된 걸 확인할 수 있다.

 

save로 tar 파일 추출하기
load를 이용해서 이미지에 추가시키기

 

export로 tar 파일 생성하기
import를 사용해 이미지 생성하기 생성된 이미지는 실행을 위해 별도의 설정이 필요


ㅇ 스프링부트 프로젝트 이미지로 만들기

프로젝트에 도커 파일 추가하기
도커 파일로 이미지 생성하기
등록된 이미지 파일 실행하기

 

'Docker' 카테고리의 다른 글

쿠버네티스(Kubernetes)  (2) 2024.12.23
Docker MySQL 컨테이너 실행하기  (4) 2024.09.23
docker를 사용하는 이유  (0) 2024.09.09