공통 프로젝트를 하면서 인프라를 할 줄 아느냐 모르느냐에 따라 편의성이 달라진다는 것을 깨달았다.
능숙하게 모든 것을 하기는 힘들지만, 기초적인 도커, Jenkins, 서버 배포 등을 공부해보고자 한다.
오늘은 그 첫 번째인 도커 기초이다.
1. 도커 기초 강의
- 도커(Docker)란?
- 컨테이너 기반의 오픈소스 가상화 플랫폼
- 어떤 프로그램을 외부 환경과 격리 시켜 구동할 수 있게 해주는 소프트웨어
- 개발 후 가동을 시킬 때 우리가 쓰고 있는 OS 환경에 영향을 많이 받지 않게 격리 시켜 구동할 수 있게 해주는 것
- 컨테이너(Container)란?
- OS 상에 논리적인 영역(컨테이너)을 구축하고, 애플리케이션이 작동하는데 필요한 요소들을 모아 별도의 서버처럼 동작하는 것
- 필요한 요소만으로 구성되어 있어 오버헤드가 적음
- Infrastrucure
- RAM, 메모리, CPU 등의 인프라
- Host Opearting System
- 운영체제(OS)
- Docker
- 도커를 하나 쌓음
- Application
- 겹쳐져 있지 않고 각각 독립적으로 마치 컨테이터처럼 배치
- 격리된 환경
- A가 동작하는 환경과 B가 동작하는 환경이 아예 달라도 영향을 받지 않음
- 리눅스 환경이 아닌 곳에서 리눅스 환경에서 구동하는 것처럼 구동 시킬 수 있게 하는 것
2. 컨테이너 구조 및 커맨드 사용법 - 이론편 -
- 도커 컨테이너 구조
- 컨테이너 레이어
- 이미지 레이어를 컨테이너에 올리게 되면 계층이 추가
- 이를 컨테이너 레이어라고 부름
- read와 write가 모두 가능
- 실행하고 진행되는 변경 사항은 이 계층에 저장됨
- 이미지 레이어를 컨테이너에 올리게 되면 계층이 추가
- 이미지 레이어
- 이미지
- 컨테이너를 가동하기 위해서 필요함
- 도커 허브나, 레포지토리에서 가지고 올 수 있는 형태
- 읽기 전용의 계층으로 다른 컨테이너와 공유할 수 있는 레이어
- 이미지
- 여러 컨테이너를 가동하게 되면, 이미지 레이어는 공유하되 각각의 컨테이너 레이어를 붙여 각기 다른 컨테이너가 공유하지 않는 계층을 만듦
- 동일한 이미지 레이어를 사용하고 있기 때문에 동일한 퍼포먼스를 낼 수 있음
- 컨테이너 레이어
- 도커 명령어 구조
- 도커의 컴포넌트를 제대로 사용하기 위해서는 명령어를 사용해야 함
- 도커의 모든 명령은 ‘docker’로 시작하며 어떤 대상에게 명령어를 실행할 것인지로 구분하면 보기 쉬움
- docker {대상} {커맨드} {옵션} {인자}
- 대표적인 커맨드 대상 docker - container, image, volume, network
- 도커 커맨드
- 도커에서 사용할 수 있는 커맨드 리스트 확인 방법
- ‘docker’ 입력
- image, container 등에서 사용할 수 있는 모든 명령어
- ‘docker [command 대상 컴포넌트] --help’ 입력
- 위와 같은 방법으로 커맨드 수준을 높이고 뒤에 --help 입력
- ‘docker’ 입력
- 도커에서 사용할 수 있는 커맨드 리스트 확인 방법
- Container 관련 커맨드
- start, stop, create, run, rm, exec, ls, cp, commit
- Image 관련 커맨드
- pull, rm, ls, build
- 주요 옵션 설명
- --name, -p, -v, -e, -d, -i, -t
3. 도커 커맨드 사용법 - 실습편 -
- 실습 완료
4. 도커 컨테이너 통신하기 - 이론편 -
- 도커 컨테이너와 통신하기
- 도커 컨테이너는 기본적으로 독립적인 환경에서 실행되기 때문에 컨테이너 밖에서 접근할 수 없음
- 컨테이너와 통신하기 위해서는 컨테이너를 가동시키면서 ‘p’ 옵션을 사용하여 호스트의 포트와 컨테이너의 포트를 설정해야 함
- -p ${host_port}:${container_port}
- 이 설정을 사용하기 위해서 호스트(서버 또는 PC)에서 사용 중인 포트와 번호가 겹치지 않는지 확인이 필요
- 도커 커맨드의 차이
- docker run --name test1 -d httpd
- test1이라는 이름으로 컨테이너 생성
- -d 백그라운드로 동작
- docker run --name test2 -d -p 8080:80 httpd
- 8080:80 → 호스트의 포트는 8080, 컨테이너의 포트는 80으로 세팅하여 네트워크 설정
- docker ps -a / cocker container ls -a를 사용하여 컨테이너 상태 확인
- 실습을 마치면 stop과 rm 커맨트로 실행을 중지하고 삭제하는 작업을 수행하는 것이 좋음
- docker run --name test1 -d httpd
5. 도커 컨테이너 통신하기 - 실습편 -
- 실습 완료
6. 도커파일(DockerFile) 작성하기 - 이론편 -
- dockerfile에서 사용되는 주요 인스트럭션
- FROM
- From 키워드를 사용하여 base가 되는 image를 지정
- 주로 OS 이미지나 런타임 이미지를 지정함
- RUN
- 이미지를 빌드할 때 사용하는 커맨드를 설정할 때 사용
- ADD
- 이미지에 호스트의 파일이나 폴더를 추가하기 위해 사용
- 만약 이미지에 복사하려는 디렉토리가 존재하지 않으면 docker가 자동으로 생성
- 이 원리는 검색해서 찾아보기
- COPY
- 호스트 환경의 파일이나 폴더를 이미지 안으로 복사하기 위해 사용
- ‘ADD’와 동일하게 동작하지만 가장 확실한 차이점은 URL을 지정하거나, 압축 파일을 푸는 것을 자동으로 하지 않음
- EXPOSE
- 이미지가 통신에 사용할 포트를 지정할 때 사용
- ENV
- 환경 변수를 지정할 때 사용
- 여기서 설정한 변수는 #name, #{name} 형태로 사용할 수 있음
- 추가로 아래와 같은 문법 사용 가능
-
- ${name:-else} : name이 정의가 안되어 있다면 else 사용
-
- CMD
- 도커 컨테이너가 실행될 때 실행할 커맨드를 지정
- RUN과 비슷하지만 CMD는 도커 이미지를 빌드할 때가 아니라, 컨테이너가 시작할 때 실행된다는 것이 다름
- ENTRYPOINT
- 도커 이미지가 실행될 때 사용되는 기본 커맨드 지정(강제)
- WORKDIR
- RUN, CMD, ENTRYPOINT 등을 사용한 커맨드를 실행하는 디렉토리를 지정
- -w 옵션으로 오버라이딩 할 수 있음(빌드 할 때)
- VOLUME
- Persistence 데이터를 저장할 경로를 지정할 때 사용
- 호스트의 디렉토리를 도커 컨테이너에 연결
- 주로 휘발성으로 사용되면 안되는 데이터를 저장할 때 사용
- 기타 옵션
- SHELL
- LABEL
- USER
- APG
- STOPSIGNAL
- HEALTHCHECK
- FROM
- docker build 커맨드
- dockerfile을 실행하기 위해 docker build 커맨드를 사용
- docker build ${option} ${dockerfile directory}
- docker build -t test
- 생성된 이미지를 컨테이너로 실행하기 위해서는 run 커맨드를 사용
- docker run —name test_app -p 80:80 test
7. 도커파일(DockerFile) 작성하기 - 실습편 -
- 실습 완료
8. 도커 컴포즈(Docker Compose) 작성하기 - 이론편-
- Compose 파일
- 도커 애플리케이션의 서비스, 네트워크 볼륨 등의 설정을 yml 파일 형식으로 작성한 것
- 큰 틀에서의 구성 요소
- version
- deprecated 되어 더 이상 설정하지 않아도 됨
- services
- network
- volume
- config
- secret
- version
- services는 여러 컨테이너를 정의하는데 사용됨
- frontend와 backend는 각 컨테이너를 정의하게 되며, 각 컨테이너의 이름이 됨
- 컨테이너를 설정할 때 사용되는 키워드
- docker-compose.tml 파일을 실행하기 위해서는 아래와 같은 커맨드 사용
- docker compose up
- 추가 주요 옵션
- -f 옵션
- docker-compose는 기본적으로 docker-compose.yml 또는 docker-compose.yaml의 이름을 사용,
- 만약 다른 이름으로 파일을 관리하고 사용할 때 사용
- docker compose -f docker-compose-custom.yml up
- -d 옵션
- 백그라운드에서 docker-compose를 실행하기 위해 사용
- docker compose up -d
- -d가 없이 실행하면 해당 cmd는 사용할 수 없게 되므로 백그라운드에서 실행함
- 백그라운드에서 docker-compose를 실행하기 위해 사용
- -f 옵션
9. 도커 컴포즈(Docker Compose) 작성하기 - 실전편-
10. 도커 이미지 생성 및 저장하기 - 이론편 -
- 도커 이미지 생성하기
- offcial 이미지가 아닌 이미지 생성 후 사용 가능
- 주로 이미지를 생성하는 경우
- 특정 이미지에 자주 사용하는 설정을 추가하여 편하게 사용하고 싶을 경우
- 본인이 개발한 애플리케이션을 이미지로 생성하고 싶을 경우
- 컨테이너로 이미지 생성하기
- 첫 번째 방법
- 추가 설정 내역이 포함된 레이어를 붙여서 쓰고 있었다면, 이 컨테이너를 그대로 가져와서 이미지로 만들 수 있음
- docker commit {container_name} {image_name}
- container_name : 이미지로 만들고자 하는 컨테이너 이름
- image_name : 생성할 이미지의 이름
- 두 번째 방법
- Dockerfile로 이미지 생성하기
- 첫 번째 방법
- 도커 이미지 파일로 저장
- 생성된 이미지는 파일로 저장할 수 있음
- 대체로 운영서버에서 이미지를 사용해야할 때 종종 사용됨
- 방법 2가지
- save/load 커맨드
- save를 이용한 이미지 저장은 원본 이미지와 레이어를 동일하게 가져가는 형식으로 동작
- save : 도커 이미지를 tar 파일로 추출
- load : 추출된 tar 파일을 이미지로 불러옴
- export/import 커맨드
- export를 이용한 이미지 저장은 원본 이미지와 다르게 하나의 레이러로 통합되어 추출
- 이렇게 추출된 이미지는 다시 컨테이너로 가동하기 위해 별도 작업 필요
- export : 도커 이미지를 tar 파일로 추출
- import : 추출된 tar 파일을 이미지로 불러옴
- save/load 커맨드
11. 도커 이미지 생성 및 저장하기 - 실전편 -
- 실습 완료
12. 스프링부트 Dockerfile 만들기
'개발' 카테고리의 다른 글
Spring Batch란? (0) | 2024.11.24 |
---|---|
[OAuth2] X(구 트위터) 로그인 API 사용기 (1) | 2024.11.17 |
JWT 심화 (1) | 2024.08.11 |
OAuth2.0 + SpringSecurity (0) | 2024.08.04 |
스프링 시큐리티(Spring Security) + JWT (0) | 2024.07.21 |