docker
도커 사용하기
파란배개
2025. 1. 12. 10:28
플랫폼
Docker 이미지를 빌드하면 기본적으로 호스트 시스템의 아키텍처에 맞는 플랫폼으로 빌드된다.
예를 들어, amd64 아키텍처를 가진 EC2에서 arm64 아키텍처를 가진 이미지를 pull하여 실행하면 에러가 발생한다.
이를 해결하려면 --platform 옵션으로 아키텍처를 설정해 빌드하면 된다.
docker build --platform linux/amd64 --push --tag user/study
이 방식 외에도 '멀티 플랫폼 빌드'를 사용하면 여러 플랫폼에서 실행할 수 있는 단일 이미지를 만들 수 있다.
이를 위해 Docker의 빌드 엔진인 BuildKit을 사용해야 하며, Docker 엔진 19.03 이상에서는 기본적으로 설치되어 있다.
설정
docker buildx create \
--name container-builder \
--driver docker-container \
--use --bootstrap
사용
docker buildx build --platform linux/amd64,linux/arm64 --push --tag user/study
위 명령어로 하나의 단일 이미지에 여러 아키텍처를 설정할 수 있다.
도커의 두 가지 환경변수: ARG와 ENV
- ARG: Dockerfile에서 이미지를 빌드하는 시점에만 유효하며, 이미지 내부의 환경변수를 설정하는 옵션이다.
- ENV: Dockerfile로 생성된 이미지가 컨테이너로 실행될 때 사용되는 환경변수를 설정하는 옵션이다.
즉, ARG는 이미지 빌드 시에만 필요하며, ENV는 컨테이너 실행 중에 사용된다.
네트워크
도커는 컨테이너 간 통신을 관리하고, 컨테이너와 외부 네트워크 간의 연결을 제어한다.
세 가지 네트워크 종류가 존재한다:
- bridge: 컨테이너 시작 시 기본으로 할당되는 네트워크.
- 각 컨테이너마다 IP 주소를 할당하며, 포트 매핑을 통해 외부와 통신 가능하다.
- 컨테이너 간 혹은 외부와 연결되는 '다리' 역할을 한다.
- host: 컨테이너가 호스트 네트워크 환경을 그대로 사용하는 방식.
- NAT로 인한 오버헤드가 없어 빠른 통신이 가능하지만, 보안에 주의해야 한다.
- 원래는 Linux 호스트에서만 사용 가능했으나, Docker Desktop 4.29 버전 이후 Mac과 Windows에서도 베타 버전으로 사용할 수 있다.
- none: 네트워크를 사용하지 않는 방식.
- 컨테이너가 완전히 격리된 환경에서 실행된다.
컨테이너 데이터 관리
도커 컨테이너는 기본적으로 휘발성을 갖는다.
컨테이너에서 생성된 데이터는 컨테이너 내부에만 존재하며, 컨테이너 삭제 시 데이터도 사라진다.
데이터를 영구적으로 보존하거나 백업하려면 마운트(mount) 기능을 사용해야 한다.
마운트의 세 가지 타입
- Bind Mount:
- 호스트가 지정한 디렉토리에 컨테이너 데이터를 저장한다.
- Docker CLI로 관리할 수 없으며, 사용자가 경로를 명시적으로 알아야 한다.
- Volume Mount:
- 도커가 생성 및 관리하는 호스트의 특정 디렉토리(/var/lib/docker/volumes)에 저장된다.
- 보안이 유지되며, Docker CLI로 관리 가능하다.
- 도커 공식문서에서 추천하는 방식이다.
- Tmpfs Mount:
- 호스트 메모리에 상주하며, 컨테이너 마운트가 제거되면 데이터가 사라진다.
Bind Mount와 Volume Mount의 비교
- Volume Mount는 보안과 관리 측면에서 유리하며, 도커가 데이터를 안전하게 관리하고 컨테이너와 데이터 공유가 가능하다.
- Bind Mount는 특정 데이터를 로컬 디렉토리에 저장하거나 로컬 설정 파일을 컨테이너에서 사용할 때 유용하지만 보안을 위해 root 권한을 부여하면 컨테이너가 접근할 수 없으므로 보안과 사용성을 양립할 수 없다.
Bind Mount가 유용한 상황
- 로컬에서 설정 파일을 관리하고 이를 컨테이너로 마운트해야 할 때.
- 로그 같은 특정 파일을 호스트의 특정 위치에 저장하고 싶을 때.