목차
1. 컨테이너 기술
2. Docker의 개념
3. Docker 기본 사용법
4. Docker 활용
1. 컨테이너 기술
컨테이너(Container)란 가상화된 운영체제 위에서 애플리케이션의 독립적인 실행에 필요한 파일(소스코드, 라이브러리 등)을 모은 패키지를 의미한다. 컨테이너는 Cloud Native 소프트웨어의 가장 작은 단위가 되며 서버에 바로 배포하거나 가상머신 위에도 배포할 수 있다.
또한 컴퓨터 운영체제를 통해 관리되고 리소스 및 기능에 제약을 갖는 구동 프로세스를 의미한다.
기존 가상화 방식과 컨테이너 가상화 기술을 비교했을 때
서버 가상화는 하드웨어 레벨에서 이뤄지며, 물리 서버 자원 즉 CPU나 메모리 등을 분할해 논리적인 가상서버를 만들었다.
컨테이너 가상화는 OS 레벨에서 이뤄지며, 물리 서버 자원을 분할해 논리적인 컨테이너를 만들었다.
서버 가상화와 컨테이너 가상화의 가장 큰 차이점은 OS를 어떻게 사용하는지 이다.
서버 가상화는 복수의 OS 환경을 사용해 가상 서버가 각각 Guest OS를 갖는 것을 확인할 수 있다. 그러나 컨테이너 가상화는 하나의 OS 환경에 복수 실행환경을 사용한다.
2. Docker의 개념
도커는 리눅스 응용 프로그램들을 프로세스 격리 기술을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트를 의미한다.
하나의 물리 서버에서 호스트 os 기능을 그대로 사용하면서 프로세스를 격리해 여러 개의 독립된 환경인 컨테이너를 만들고, 구동하고, 배포할 수 있도록 하는 기술이다.
Docker는 이미지 빌드, 이미지 저장소, 컨테이너 실행환경으로 구성되어 있다.
(1) Docker 이미지
- 개발 바이너리와 환경 설정을 패키징
- 파일 시스템, 실행 파일 경로와 같은 메타데이터 포함
- Dockerfile로 정의
▼ Docker 파일 작성 예시
FROM openjdk:17
COPY ./build/libs/reserveserivce-0.0.1-SNAPSHOT.jar reserveserivce.jar
ENTRYPOINT ["java", "-jar", "reserveserivce.jar"]
(2) 이미지 저장소 (Registry)
- Docker 이미지 공유를 위한 저장소
- 개발자가 Docker 이미지를 업로드(push)하고 Docker 실행 시 다운로드(pull)
- 공개 Docker 저장소(Dockerhub, docker.com)와 사설 Docker 저장소 이용 가능
(3) 컨테이너 실행환경
- Docker 이미지를 기반으로 실행되는 일반 Linux 컨테이너
- 컨테이너는 Docker 실행 호스트에서 실행되는 하나의 프로세스
- 컨테이너는 호스트 및 타 프로세스와 격리
3. Docker 기본 사용법
단계는 다음과 같다.
(1) Dockerfile 작성
도커 이미지를 빌드하는데 필요한 모든 명령이 순서대로 포함된 텍스트 파일을 의미하는 Dockerfile을 생성한다. 파일은 일반적으로 프로젝트 루트 밑에 위치한다.
(2) 이미지 생성
Dockerfile을 build하며 Docker Image가 생성된다. 애플리케이션을 실행하는데 필요한 애플리케이션 코드, 바이너리, 런타임, 라이브러리 및 기타 파일 시스템 항목이 포함된 이미지를 의미한다.
(3) 컨테이너 생성 및 실행
특정 애플리케이션을 실행하는데 필요한 모든 구성 파일, 종속성, 시스템 도구, 라이브러리 및 소스 코드를 포함하는 소프트웨어 패키지로, Docker Image를 저장소로 부터 pull 받아 실행시키는 과정을 의미한다.
> 도커에서 컨테이너가 실행되는 과정 총정리
1. 개발자가 개발환경에서 개발하고 도커 이미지를 build 및 push
2. Docker가 이미지 생성
3. Docker가 이미지를 저장소에 등록
4. 개발자가 검증/운영 환경에서 Docker 이미지를 실행
5. Docker가 이미지를 저장소에서 pull 받음
6. Docker가 이미지를 컨테이너로 실행
4. Docker 활용
마지막으로 자주 사용되는 도커 명령어를 설명하고 마치려한다.
(1) docker run : 새로운 컨테이너를 생성하고 실행하는 명령어 ★★★
$ docker run -d --name my_container -p 8080:80 nginx
- -d : 컨테이너를 백그라운드에서 실행
- --name : 컨테이너 이름 지정
- -p : 호스트의 포트와 컨테이너의 포트를 매핑
- nginx : 사용할 이미지명
(2) docker ps : 현재 실행 중인 컨테이너 목록 표시 ★★★
$ docker ps
- -a : 모든 컨테이너(실행 중이지 않은 컨테이너 포함)를 표시
(3) docker images : 로컬에 저장된 도커 이미지 목록 표시 ★★
$ docker images
(4) docker stop : 실행 중인 컨테이너 중지 ★★
$ docker stop my_container
(5) docker rm : 중지된 컨테이너 삭제 ★★
$ docker rm -f my_container
- -f : 강제로 컨테이너를 중지하고 삭제
(6) docker pull : 도커 허브 또는 다른 저장소에서 이미지를 다운로드 ★★★
$ docker pull ubuntu
(7) docker build : Dockerfile을 사용해 이미지를 빌드 ★★★
$ docker build -t my_image:latest .
$ docker build -f Dockerfile.dev -t my_image:dev .
- -t : 생성할 이미지의 이름과 태그를 지정
- -f : 사용할 도커 파일을 지정
- --no-cache : 이미지 빌드 시 캐시를 사용하지 않음
(8) docker logs : 컨테이너의 로그 출력 ★★★
$ docker logs my_container
$ docker logs -f my_container
$ docker logs --tail 100 my_container
- -f : 실시간으로 로그 출력
- --tail : 마지막 N줄의 로그 출력
도커를 활용한 CI/CD 설정 방법은 이전에 포스팅한 글을 참고하길 바란다!
https://aeeazip.tistory.com/38