1. Docker란?
Docker는 컨테이너 기반 가상화 플랫폼으로, 애플리케이션과 그 종속성을 격리된 환경인 컨테이너로 패키징하여 실행할 수 있게 ㅐ준다. 이를 통해 다양한 환경에서 애플리케이션을 일관되고 실행할 수 있으며, 개발 환경과 운영 환경 사이의 차이로 인한 문제를 줄일 수 있다. Docker는 가상 머신보다 가볍고 빠르며, 호스트 운영체제의 커널을 공유하여 자원을 효율적으로 활용한다. Docker를 사용하면 애플리케이션을 신속하게 구축, 테스트, 배포할 수 있으며, 특히 마이크로서비스 아키텍쳐와 같은 복잡한 시스템을 관리하는 데 유용하다.
2. Docker 주요 특징
2 - 1. 컨테이너 기반 가상화
- 도커는 컨테이너라는 경량화된 가상화 환경을 제공한다.
- 컨테이너는 애플리케이션과 그 종속성을 포함하는 독립적인 실행 단위이다.
- 애플리케이션과 필요한 모든 것을 하나의 패키지로 묶어 어디서든 실행할 수 있다.
2 - 2. 이미지 기반 배포
- 도커는 이미지라는 템플릿을 사용하여 애플리케이션과 그 실행 환경을 패키징한다.
- 이 이미지를 기반으로 컨테이너를 생성하고 실행할 수 있다.
2 - 3. 경량화
- 가상머신은 Hypervisor를 통해 여러 개의 운영체제를 관리해야했다.
- 뿐만 아니라, Guest OS를 사용하기 위한 라이브러리, 커널 등을 전부 포함해서 용량을 많이 잡아먹었다.
- 도커는 운영 체제의 커널을 공유하므로, 가상 머신보다 훨씬 가볍고 빠르게 실행된다.
2 - 4. 이식성
- 도커 컨테이너는 어디서든 동일하게 실행된다.
- 로컬 환경, 테스트, 운영 환경 모두에서 동일하게 동작한다.
3. Docker 주요 키워드
3 - 1. 이미지(image)
애플리케이션과 모든 실행에 필요한 파일을 포함한 읽기 전용 템플릿.
코드, 런타임, 라이브러리, 환경 변수, 구성 파일등이 포함된다.
컨테이너를 생성하기 위한 설계도 역할을 한다.
3 - 2. 컨테이너(container)
이미지를 실행하여 동작하는 애플리케이션 인스턴스.
이미지가 정적인 설계도라면, 컨테이너는 실제로 애플리케이션이 실행되는 동적인 환경이다.
컨테이너는 격리된 격리된 공간에서 애플리케이션을 실행한다.
하나의 시스템에서 여러 개의 컨테이너를 독립적으로 실행할 수 있다.
3 - 3. Dockerfile
이미지를 생성하기 위한 명령어가 담긴 스크립트 파일.
이 파일에는 이미지를 빌드하는 데 필요한 명령어들이 포함되어 있다.
Dockerfile을 사용하면 이미지 생성 과정을 자동화하고 일관되게 만들 수 있다.
3 - 4. Docker Hub
Docker Hub Container Image Library | App Containerization
Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.
hub.docker.com
이미지를 저장하고 공유하는 중앙 저장소.
Docker Hub에서 다양한 공개 이미지를 다운로드하거나
자신만의 이미지를 업로드할 수 있다.
3 - 5. 볼륨(volume)
컨테이너 데이터를 지속적으로 저장하는 메커니즘.
컨테이너가 삭제되더라도 볼륨에 저장된 데이터는 유지된다.
볼륨을 사용하면 데이터를 컨테이너와 독립적으로 관리할 수 있다.
3 - 6. 네트워크
컨테이너 간의 통신을 관리하는 방식.
Docker는 여러 가지 네트워크 드라이버를 제공한다.
기본적으로 모든 컨테이너는 브리지 네트워크(Bridge Network)를 통해 통신할 수 있다.
네트워크 종류
- Bridge Network
- Host Network
- Overlay Network
4. 실습
Docker를 통해 PostgreSQL 컨테이너 2개를 실행해본다.
4 - 1. PostgreSQL 이미지 실행
docker run -d --name postgres-sample -p 5433:5432 -e POSTGRES_USER=admin1 -e POSTGRES_PASSWORD=admin2 -e PGDATA=/var/lib/postresql/data/pgdata -v ${로컬_바인딩_폴더}:/var/lib/postgresql/data:z postgres
이미지를 먼저 pull 해야 하지만, 로컬에 없는 경우 자동으로 pull 해온 뒤 run을 실행한다.
--name
컨테이너의 이름을 지정한다.
--p 5433:5432
PC의 port 5433과 도커 내부 컨테이너의 5432 port를 연결한다.
-e PGDATA=/var/lib/postgresql/data/pgdata
PostgreSQL의 데이터 디렉토리를 지정한다. PGDATA는 PostgreSQL의 모든 데이터베이스 파일, 설정 파일, 로그 파일 등이 저장되는 핵심 디렉토리이다. 여기서는 컨테이너 내부의 `/var/lib/postgresql/data/pgdata` 경로로 설정되어 있다.
-v ${로컬_바인딩_폴더}:/var/lib/postgresql/data:z
바인드 마운트를 설정한다. 바인드 마운트는 호스트 시스템의 디렉토리를 컨테이너 내부의 디렉토리와 공유하는 방식을 말한다. ":" 을 기준으로 앞 부분이 호스트 시스템의 디렉토리 경로이다. 뒷 부분이 컨테이너 내부에서 마운트될 경로이다. ':z'는 SELinux 레이블을 설정하는 옵션으로, 공유 콘텐츠에 대한 적절한 접근 권한을 부여한다.
이 설정을 통해 PostgreSQL의 데이터가 호스트 시스템의 지정된 폴더에 저장되므로, 컨테이너가 삭제되어도 데이터는 유지된다.
docker ps 명령어를 통해 "postgres-sample" 컨테이너가 실행중임을 알 수 있다.
4 - 2. 또 다른 PostgreSQL 인스턴스 실행
새로운 인스턴스는 "postgres-sample2" 라는 이름을 주었다.
로컬 바인딩 폴더는 "samle2"이다.
일부러, Host Port를 5433으로 주었다. 이전에 생성한 인스턴스와 동일하게 주었고, 결과를 확인해보자.
Port 5433이 이미 할당되어서 Binding에 실패했다고 한다.
아래 두 인스턴스만 보면 되는데,
맨 아래의 인스턴스가 "postgres-sample2"이다.
실행은 되지 않고 Created 상태임을 확인할 수 있꼬,
Port 가 "postgres-sample"과 동일하게 5433으로 되어 있다.
4 - 3. postgres-sample2 삭제하고 다시 생성
port가 겹치지 않게 삭제 후 5434:5432로 다시 생성하자
docker rm {컨테이너 ID} 명령어로 삭제를 했다.
위의 명령어에서 port만 5434:5432로 수정후에 명령어를 입력해주었다.
결과는 정상적으로 두 인스턴스가 실행중임을 확인할 수 있었다.
4 - 4. 바인드 마운트 확인하기
호스트 시스템의 바인트 마운트 폴더에 가보면 pgdata 폴더를 확인할 수 있고,
Postgres에서 사용되는 필수 파일들이 들어가 있다.
해당 파일들은 도커 컨테이너에도 존재하며, 서로 공유중인다.
실제로 해당 파일들이 도커 컨테이너 내부에도 있는지 확인해보자.
docker exec -it {컨테이너 ID} /bin/bash
컨테이너 터미널에 접속하는 명령어이다.
/var/lib/posgresql/data/pgdata 에 들어가보니 로컬 바인딩 폴더와 동일한 파일들을 확인할 수 있다.
컨테이너 터미널에서 빠져나오는 명령어는 exit 이다.
References
https://seosh817.tistory.com/345
'인프라 > docker' 카테고리의 다른 글
Kompose 로 docker-compose.yml 을 쿠버네티스용 yaml 로 변환하고, 쿠버네티스에 배포하기 (0) | 2025.01.17 |
---|---|
docker로 Spring Boot App, Postgres 이미지 만들어서 실행시키기 (0) | 2025.01.10 |
2024 12 4 TIL - Docker Compose (1) | 2024.12.04 |
2024 12 3 - Docker로 Spring Boot Application 실행하기(Feat. Dockerfile) (0) | 2024.12.03 |