1. 플랫폼
docker 이미지를 build시 기본적으로 Host 시스템 아키텍처에 맞는 플랫폼으로 빌드
ex) mac북의 arm64
platform 옵션으로 아키텍처를 설정해 build시 원하는 아키텍처를 가진 이미지를 빌드 가능
docker build --platform linux/amd64
멀티 플랫폼 빌드(buildx 설치)
docker buildx create --name container-builder -- driver docker-container --use -- bootstrap
여러 플랫폼에서 실행할 수 있는 단일 이미지를 만들 수 있음(,로 구분하여 진행)
docker buildx build --platform linux/amd64,linux/arm64 --push ...
pull시 Host 아키텍처에 맞추는게 docker의 기본 동작이기 때문에 pull 받을 때는 아키텍처 지정하지 않아도 됨
2. 환경변수 (ARG와 ENV)
-e 옵션을 사용해 환경변수 주입 가능
환경 변수는 key-value 형식
ARG: 이미지가 빌드되는 시점에만 유효한 환경변수
이미지 파일 내부의 환경변수에 설정되는데 사용되는 옵션
ARG MYSQL_TRG
FROM mysql:$MYSQL_TAG
환경 변수 ENV: dockerfile로 생성된 이미지 실행 시킨 컨테이너에 사용될 환경 변수
ENV MYSQL_ROOT_PASSWORD=1234
ENV MYSQL_DATABASE=database
ENV MYSQL_USER=kaki
ENV MYSQL_PASSWORD=1234
3. 네트워크
컨테이너 간 통신을 관리하고 컨테이너와 외부 네트워크 간의 연결을 제어하는 시스템
bridge, host, none을 제공
Bridge
컨테이너 시작 시 기본으로 할당되는 네트워크
bridge 네트워크에 연결되어 있는 컨테이너 마다 IP 주소를 할당해줘 포트 매핑으로 외부와 통신 가능(다리 역할)
=> 여러 서비스를 독립적으로 실행하면서 서로 통신하거라 외부에서 접근이 필요할 때 사용
Host
별도의 격리 없이 Host의 네트워크 환경을 그대로 사용
컨테이너 내에서 사용하는 IP 주소는 로컬의 IP와 동일 Port는 실행되는 애플리케이션의 Port와 동일
docker run -d --name spring-web --network host ...
NAT로 인한 오버헤드가 없어 빠른 통신 가능 But 호스트의 네트워크 이므로 보안 주의
Linux 호스트만 사용 할 수 있었지만 Docker Desktop 4.29 버전 부터 Mac, Windows도 베타 버전으로 사용 가능(추가 설정 시)
None
네트워크를 사용하지 않아 컨테이너가 완전히 격리된 환경
(link 옵션은 레거시 기능으로 network를 사용한 연결을 권장)
4. 컨테이너 데이터 관리
기본적으로 도커 컨테이너는 휘발성을 갖는다
Mount
휘발되는 컨테이너의 데이터를 영구적으로 보존하고 백업하는 방법
volume mount
도커 공식문서에서 추천하는 마운트 타입
도커에 의해 생성되고 관리되어 docker의 CLI 등 docker의 기능 활용 가능
데이터는 호스트 파일 시스템의 /var/lib/docker/volumes에 저장
docker volume create my-vol
bind 마운트
호스트 머신의 지정된 디렉토리에 컨테이너 데이터 저장
-v 로 연결은 동일하지만 저장할 컨테이너의 디렉토리 경로를 지정해줘야 함
volume 마운트: docker에 의해 생성 관리, docker CLI 적극적으로 활용 가능, root 권한으로 보호 -> 보안 유지하면서 컨테이너와 데이터 공유 가능
bind 마운트
지정한 호스트의 디렉토리에 데이터 저장 -> 특정 경로들을 파악해야 함
docker과 독립적으로 관리 docker CLI 활용x, root 권한 부여 시 컨테이너 접근 x
로컬에서 설정 파일 관리 로그 같은 특정 파일을 호스트의 특정 위치에 저장하고 싶을 때
5. Labels
LABEL은 이미지나 컨테이너에 메타데이터를 추가할 수 있는 옵션
키-값 쌍으로 이뤄진 메타데이터, 이 메타데이터를 활용해 이미지에 대한 정보를 체계적으로 관리 가능
ex) 요구사항 Spring 애플리케이션 빌드, docker hub에 push 하려고 함, LABEL 이미지가 생성된 시간, 트리거가 된 커밋의 해쉬 코드 정보들이 담기도록 할 것
6. Docker Compose의 depends_on 사용 시 발생할 수 있는 문제
depends_on 으로 의존하는 서비스가 시작된 후 시작하도록 의도했는데 spring-web 서비스를 mysql-db 서비스에 연결 할 때 문제가 발생하지 않을까
depends_on은 mysql-db 서비스가 시작은 됐지만 완전히 연결 준비 후 spring-web이 시작되도록 보장x
때문에 spring-web 서비스가 mysql-db 연결 요청을 보내지 못해 에러 발생
depends_on의 condition 옵션
< service_started >
의존하는 서비스가 시작되기만 하면 다음 서비스 시작(서비스가 준비되지 않아도 시작 될 수 있다)
< service_healthy >
의존하는 서비스가 정상적으로 작동 중일 때만 다음 서비스가 시작(헬스 체크를 통과해야 시작)
< service_completed_successfully >
의존하는 서비스가 정상적으로 종료되었을 때 실행(성공적으로 종료 되었을 때)