이 블로그에서는 지난 몇 달 동안 제가 본 10가지 컨테이너 안티 패턴에 대해 설명합니다:
- 컨테이너의 데이터 또는 로그 - 컨테이너는 상태 비저장 애플리케이션에 이상적이며 일시적인 용도로 사용됩니다. 즉, 컨테이너에 데이터나 로그를 저장하지 않으면 컨테이너가 종료될 때 손실됩니다. 대신 볼륨 매핑 를 사용하여 컨테이너 외부에 유지합니다. ELK 스택 를 사용하여 로그를 저장하고 처리할 수 있습니다. 초기 테스트 과정에서 관리 볼륨을 사용하는 경우 다음을 사용하여 제거합니다.
-v
스위치로도커 RM
명령을 사용합니다. - 컨테이너의 IP 주소 - 각 컨테이너에는 IP 주소가 할당됩니다. 예를 들어 애플리케이션 서버에 배포된 애플리케이션은 데이터베이스와 통신해야 하는 등 여러 컨테이너가 서로 통신하여 애플리케이션을 생성합니다. 기존 컨테이너는 종료되고 새 컨테이너가 항상 시작됩니다. 컨테이너의 IP 주소에 의존하면 애플리케이션 구성을 지속적으로 업데이트해야 합니다. 이렇게 하면 애플리케이션이 취약해집니다. 대신 서비스를 생성하세요. 이렇게 하면 컨테이너의 수 증가 및 감소에 관계없이 참조할 수 있는 논리적 이름이 제공됩니다. 또한 기본적인 로드 밸런싱도 제공합니다.
- 컨테이너에서 단일 프로세스 실행 - A
도커파일
하나를 사용했습니다.CMD
그리고엔트리포인트
. 종종 CMD는 이미지의 일부 구성을 수행한 다음 컨테이너를 시작하는 스크립트를 사용합니다. 해당 스크립트를 사용하여 여러 프로세스를 시작하려고 하지 마세요. 다음을 따르는 것이 중요합니다. 우려 사항 분리 패턴을 사용해야 합니다. 이렇게 하면 컨테이너 관리, 로그 수집, 각 개별 프로세스 업데이트가 훨씬 더 어려워집니다. 애플리케이션을 여러 개의 컨테이너로 분할하여 독립적으로 관리하는 것을 고려할 수 있습니다. - 사용하지 마십시오.
도커 실행
- 그리고도커 실행
명령은 실행 중인 컨테이너에서 새 명령을 시작합니다. 이 명령은 docker exec -it {cid} bash를 사용하여 셸을 연결할 때 유용합니다. 그러나 컨테이너가 이미 실행되어야 하는 프로세스를 실행하고 있다는 점 외에는 문제가 없습니다. - 간결한 이미지 유지 - 새 디렉터리를 만들고 해당 디렉터리에 Docker파일 및 기타 관련 파일을 포함합니다. 또한 이미지를 만들기 전에 .dockerignore를 사용하여 로그, 소스 코드, 로그 등을 모두 제거하는 것도 고려해 보세요. 다운로드한 아티팩트의 압축을 푼 후에는 반드시 제거하세요.
- 실행 중인 컨테이너에서 이미지 만들기 - 새 이미지는 다음을 사용하여 만들 수 있습니다.
도커 커밋
명령을 사용합니다. 이 명령은 컨테이너에 변경 사항이 있을 때 유용합니다. 그러나 이 방법으로 생성된 이미지는 재생산할 수 없습니다. 대신 Docker파일을 변경하고 기존 컨테이너를 종료한 후 업데이트된 이미지로 새 컨테이너를 시작하세요. - Docker 이미지의 보안 자격 증명 - 보안 자격 증명을 Docker파일에 저장하지 마세요. 보안 자격 증명은 일반 텍스트로 저장되며 리포지토리에 체크인됩니다. 이렇게 하면 완전히 취약해집니다. 사용
-e
를 사용하여 암호를 런타임 환경 변수로 지정할 수 있습니다. 또는--env-file
를 사용하여 파일에서 환경 변수를 읽을 수 있습니다. 또 다른 접근 방식은CMD
또는엔트리포인트
를 클릭하여 스크립트를 지정합니다. 이 스크립트는 타사에서 자격 증명을 가져온 다음 애플리케이션을 구성합니다. 최신
태그: 다음과 같은 이미지로 시작카우치베이스
가 유혹적입니다. 태그를 지정하지 않으면 이미지를 사용하여 컨테이너가 시작됩니다.카우치베이스:최신
. 이 이미지는 실제로 최신 버전이 아니며 이전 버전을 참조할 수 있습니다. 애플리케이션을 프로덕션 환경에 적용하려면 정확한 버전의 이미지가 있는 완전한 컨트롤러 환경이 필요합니다. 다음 내용을 읽어보세요. Docker: 최근의 혼란 동료 도커 캡틴의 게시물 @adrianmouat. 컨테이너를 실행할 때는 항상 태그를 사용해야 합니다. 예를 들어카우치베이스:엔터프라이즈-4.5.1
대신카우치베이스
.- 임피던스 불일치 - 개발, 테스트, 스테이징 및 프로덕션 환경에서 다른 이미지나 다른 태그를 사용하지 마세요. '진실의 소스'가 되는 이미지는 한 번만 만들어서 리포지토리에 푸시해야 합니다. 이 이미지는 앞으로 다른 환경에서 사용해야 합니다. 경우에 따라서는 maven 빌드의 일부로 WAR 파일에서 단위 테스트를 실행한 다음 이미지를 만드는 것을 고려할 수 있습니다. 그러나 모든 시스템 통합 테스트는 프로덕션에 푸시될 이미지에서 수행해야 합니다.
- 게시 포트 - 사용하지 마십시오.
-P
를 사용하여 노출된 모든 포트를 게시합니다. 이렇게 하면 여러 컨테이너를 실행하고 노출된 포트를 게시할 수 있습니다. 그러나 이는 모든 포트가 게시된다는 의미이기도 합니다. 대신-p
를 사용하여 특정 포트를 게시할 수 있습니다.
트위터에서의 토론을 바탕으로 더 추가 ...
- 루트 사용자 - 컨테이너를 루트 사용자로 실행하지 마세요. 호스트와 컨테이너는 동일한 커널을 공유합니다. 컨테이너가 손상되면 루트 사용자가 기본 호스트에 더 많은 피해를 줄 수 있습니다. 사용
RUN 그룹 추가 -r couchbase && 사용자 추가 -r -g couchbase 카우치베이스
을 클릭하여 그룹과 그 안에 사용자를 만듭니다. 그룹을 만들려면USER
명령어를 사용하여 해당 사용자로 전환합니다. 각USER
를 클릭하면 이미지에 새 레이어가 만들어집니다. 레이어 수를 줄이기 위해 사용자를 앞뒤로 전환하지 마세요. 덕분에 알렉산다르_78 이 팁에 감사드립니다! - 컨테이너 간 종속성 - 애플리케이션은 종종 컨테이너를 특정 순서대로 시작해야 하는 경우가 많습니다. 예를 들어, 애플리케이션이 데이터베이스 컨테이너에 연결하려면 먼저 데이터베이스 컨테이너가 가동되어야 합니다. 컨테이너는 언제든지 종료되거나 시작될 수 있으므로 애플리케이션은 이러한 변경에 탄력적으로 대응해야 합니다. 이 경우 계속 진행하기 전에 애플리케이션 컨테이너가 데이터베이스 연결이 성공할 때까지 기다리도록 하세요. 컨테이너가 특정 순서로 시작되도록 Docker파일에서 대기 스크립트를 사용하지 마세요. 특히 특정 컨테이너가 시작될 때까지 특정 시간(초)을 기다리는 것은 매우 취약합니다. 덕분에 @ratnopam 이 팁에 감사드립니다!
다른 어떤 안티 패턴을 따르고 있나요? Java 개발자를 위한 Docker 는 Java 개발자를 위한 Docker를 시작하는 방법을 설명하는 자기 주도형 실습 워크샵입니다. 더 심층적인 튜토리얼에 관심이 있으신가요? JavaOne에서 제공하는 2시간짜리 튜토리얼을 시청하세요! couchbase.com/containers 는 다양한 프레임워크에서 Couchbase를 실행하는 방법을 보여줍니다.