출처:Docker development best practices
이미지를 작게 유지하는 방법
컨테이너 나 서비스를 시작할 때 작은 이미지는 네트워크를 끌어 당기고 메모리에 더 빨리로드됩니다. 이미지 크기를 작게 유지하는 몇 가지 규칙이 있습니다.
- 적절한 기본 이미지로 시작하십시오. 예를 들어, JDK가 필요한 경우 일반 우분투 이미지로 시작하고 Dockerfile의 일부로 openjdk를 설치하는 대신 공식 openjdk 이미지를 기반으로 이미지를 고려하십시오.
- 다단계 빌드를 사용하십시오. 예를 들어, maven 이미지를 사용하여 Java 애플리케이션을 빌드 한 다음 Tomcat 이미지로 재설정하고 Java 아티팩트를 올바른 위치로 복사하여 동일한 Dockerfile에 앱을 배치 할 수 있습니다. 즉, 최종 이미지에는 빌드에서 가져온 모든 라이브러리와 종속성이 포함되어 있지 않으며 아티팩트와 환경 만 실행하면됩니다.
- 다단계 빌드가 포함되지 않은 Docker 버전을 사용해야하는 경우 Dockerfile에서 별도의 RUN 명령 수를 최소화하여 이미지의 레이어 수를 줄이십시오. 여러 명령을 하나의 RUN 라인으로 통합하고 쉘 메커니즘을 사용하여 이를 결합하여 이를 수행 할 수 있습니다. 다음 두 조각을 고려하십시오. 첫 번째는 이미지에 두 개의 레이어를 만들고 두 번째는 하나의 레이어 만 만듭니다.
RUN apt-get -y update RUN apt-get install -y python
RUN apt-get -y update && apt-get install -y python
- 다단계 빌드가 포함되지 않은 Docker 버전을 사용해야하는 경우 Dockerfile에서 별도의 RUN 명령 수를 최소화하여 이미지의 레이어 수를 줄이십시오. 여러 명령을 하나의 RUN 라인으로 통합하고 쉘 메커니즘을 사용하여 이를 결합하여 이를 수행 할 수 있습니다. 다음 두 조각을 고려하십시오. 첫 번째는 이미지에 두 개의 레이어를 만들고 두 번째는 하나의 레이어 만 만듭니다.
- 공통점이 많은 이미지가 여러 개인 경우 공유 구성 요소를 사용하여 고유 한 기본 이미지를 만들고 고유 한 이미지를 기반으로하는 것이 좋습니다. Docker는 공통 레이어를 한 번만 로드 하면 캐시됩니다. 즉, 파생 이미지는 Docker 호스트의 메모리를 보다 효율적으로 사용하고 더 빠르게 로드 합니다.
- 프로덕션 이미지를 간결하게 유지하면서 디버깅을 허용하려면 프로덕션 이미지를 디버그 이미지의 기본 이미지로 사용하십시오. 프로덕션 이미지 위에 추가 테스트 또는 디버깅 툴링을 추가 할 수 있습니다.
- 이미지를 작성할 때는 항상 버전 정보, 대상 (예 :
prod
또는test
), 안정성 또는 다른 환경에 응용 프로그램을 배포 할 때 유용한 기타 정보를 체계화하는 유용한 태그로 이미지에 태그를 지정하십시오. 자동으로 생성 된latest
태그를 사용하지 마십시오.
애플리케이션 데이터를 유지할 위치 및 방법
storage drivers
를 사용하여 애플리케이션 데이터를 컨테이너의 쓰기 가능한 계층에 저장하지 마십시오. 이는 컨테이너의 크기를 늘리고volumes
또는 바인드 마운트를 사용하는 것보다 I/O 관점에서 비효율적입니다.- 대신
volumes
을 사용하여 데이터를 저장하십시오. - 바인드 마운트를 사용하는 것이 적합한 경우는 개발 중에 소스 디렉토리나 컨테이너에 빌드 한 바이너리를 마운트하려는 경우입니다. 프로덕션 환경에서는 개발 중에 바인드 마운트를 마운트한 위치와 동일한 위치에
volumes
을 마운트하십시오. - 프로덕션의 경우
secrets
을 사용하여 서비스에서 사용하는 민감한 응용 프로그램 데이터를 저장하고 구성 파일과 같은 중요하지 않은 데이터에 대한 구성을 사용하십시오. 현재 독립형 컨테이너를 사용하는 경우 단일 서비스 서비스를 사용하도록 마이그레이션하여 이러한 서비스 전용 기능을 활용할 수 있습니다.
테스트 및 배포에 CI/CD 사용
- 소스 제어 변경을 확인하거나 풀 요청을 작성할 때 Docker Hub 또는 다른 CI/CD 파이프 라인을 사용하여 Docker 이미지를 자동으로 빌드하고 태그를 지정하고 테스트하십시오.
- Docker Engine-Enterprise를 사용하면 개발, 테스트 및 보안 팀이 이미지를 프로덕션에 배치하기 전에 서명해야하므로 훨씬 더 발전 할 수 있습니다. 이러한 방식으로 이미지를 프로덕션에 배포하기 전에 개발, 품질 및 보안 팀과 같은 이미지를 테스트하고 서명했는지 확인할 수 있습니다.
개발 및 프로덕션 환경의 차이점
Development | Production |
---|---|
컨테이너에 소스 코드에 대한 액세스권한을 부여하려면 바인드 마운트를 사용하십시오. | 컨테이너 데이터를 저장하기 위해 볼륨을 사용하십시오. |
Mac 용 Docker Desktop 또는 Windows 용 Docker Desktop을 사용하십시오. | 호스트 프로세스에서 Docker 프로세스를보다 효과적으로 분리하기 위해 사용자 맵핑이 가능한 Docker Engine-Enterprise를 사용하십시오. |
시간 변동에 대해 걱정하지 마십시오. | Docker 호스트 및 각 컨테이너 프로세스 내에서 항상 NTP 클라이언트를 실행하고 모두 동일한 NTP 서버에 동기화하십시오. 스웜 서비스를 사용하는 경우 각 Docker 노드가 시계를 컨테이너와 동일한 시간 소스에 동기화해야합니다. |