※ 유튜브 어라운드 허브 스튜디오 채널의 도커 기초 강의를 참고하여 작성했습니다.
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를 반환 후 터미널을 사용자에게 돌려준다.
ㅇ 컨테이너 통신
도커 컨테이너는 독립적인 환경에서 실행되기 때문에 컨테이너 밖에서 접근할 수 없다.
# 컨테이너와 통신하기 위해서는 컨테이너를 가동 시키면서 -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
컨테이너가 실행되는 순간부터는 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
메모장으로 도커 파일을 생성할때는 반드시 파일 형식을 모든 파일로 바꿔주고
이름을 "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
ㅇ 도커 컴포즈 파일 작성하기
컴포즈 파일은 도커 애플리케이션의 서비스, 네트워크, 볼륨 등의 설정을 yml 형식으로 작성 통합 관리하는 파일이다.
구성요소
- version (defrecated)
- services (가장 많이 사용됨)
- network
- volume
- config
- secret
위와 같이 파일을 작성했다면, '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개의 파일은 내용이 모두 동일하나 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 [생성될 이미지의 이름]:[생성될 이미지 태그]
컨테이너를 사용해서 이미지 만들기(도커 파일로 이미지 만들기는 도커파일 작성하기 단원에서 확인 할 수 있다.)
ㅇ 스프링부트 프로젝트 이미지로 만들기
'Docker' 카테고리의 다른 글
쿠버네티스(Kubernetes) (2) | 2024.12.23 |
---|---|
Docker MySQL 컨테이너 실행하기 (4) | 2024.09.23 |
docker를 사용하는 이유 (0) | 2024.09.09 |