1. 개요
컨테이너 리소스를 호스트에 연결해야 할 때 Docker 볼륨 을 마운트 합니다. 명명된 볼륨 또는 바인드 마운트와 같은 다른 볼륨을 사용할 수 있습니다. 또한 영구적이든 아니든 로컬 또는 원격 리소스를 사용할 수 있습니다. 그러나 마운트할 때 필요하지 않은 일부 파일이나 폴더 등을 제외해야 할 수 있습니다.
이 사용방법(예제)에서는 일부 Docker Compose 예제 를 사용하여 볼륨을 탑재할 때 폴더를 제외하는 방법을 알아봅니다 .
2. Nodejs 도커 이미지 생성
그렇다면 왜 Docker 를 사용하여 일부 파일이나 폴더를 제외해야 합니까? 먼저 Docker 이미지에 대해 살펴보겠습니다.
이미지를 빌드할 때 일반적으로 애플리케이션 파일을 추가합니다. 데모를 위해 Nodejs 를 사용하여 Docker 샘플 애플리케이션 을 만듭니다 .
기본 애플리케이션을 설정했으면 Dockerfile 을 살펴보겠습니다 .
FROM node:12.18.1
ENV NODE_ENV=production
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install --production
COPY . .
CMD [ "node", "server.js" ]
이제 예를 들어 node-docker 라고 부르는 이미지를 빌드할 수 있습니다 .
$ docker build -t node-docker .
이 경우 빌드 컨텍스트는 로컬 /app 폴더입니다. 그러나 예를 들어 Git 리포지토리와 같이 지정된 경로 또는 URL에 있는 파일 집합일 수 있습니다.
Docker 이미지를 빌드할 때 이미지가 저장된 Docker 서버로 파일을 보냅니다. Docker는 copy 또는 run 과 같은 명령을 기반으로 계층화된 이미지를 생성합니다 .
docker history 명령을 실행하여 이미지의 다른 레이어를 살펴보겠습니다 .
$ docker history --format "ID-> {{.ID}} | Created-> {{.CreatedSince}} | Created By-> {{.CreatedBy}} | Size: {{.Size}}" e870a50eed97
–format 옵션을 사용하여 사용자 지정 출력을 만들고 관련 명령 또는 크기와 같은 정보를 표시할 수 있습니다 .
ID-> e870a50eed97 | Created-> 36 hours ago | Created By-> /bin/sh -c #(nop) CMD ["node" "server.js"] | Size: 0B
ID-> 708a43cd0ef2 | Created-> 36 hours ago | Created By-> /bin/sh -c #(nop) COPY dir:7cc2842dd32649457… | Size: 11.3MB
ID-> d49b84f48e41 | Created-> 36 hours ago | Created By-> /bin/sh -c npm install --production | Size: 14.7MB
ID-> a351be0717a1 | Created-> 36 hours ago | Created By-> /bin/sh -c #(nop) COPY multi:9959dc16241ba60… | Size: 80.7kB
ID-> 56b22d35f315 | Created-> 36 hours ago | Created By-> /bin/sh -c #(nop) WORKDIR /app | Size: 0B
ID-> c28b64493ce8 | Created-> 36 hours ago | Created By-> /bin/sh -c #(nop) ENV NODE_ENV=production | Size: 0B
ID-> f5be1883c8e0 | Created-> 2 years ago | Created By-> /bin/sh -c #(nop) CMD ["node"] | Size: 0B
3. 이미지 빌드에서 파일 및 폴더 제외
예를 들어 로그, zip 또는 jar 파일과 같은 큰 파일이 있는 상황을 생각해 봅시다. 또는 비밀 키나 암호와 같이 최종 빌드에서 노출하고 싶지 않은 파일이 있을 수 있습니다.
.dockerignore 파일을 사용하여 이러한 파일을 Docker 서버로 보내지 않도록 할 수 있습니다. .gitignore 파일 과 유사하게 작동 합니다.
프로젝트에 암호가 있는 파일이 있다고 가정합니다. 예를 들어 다음과 같이 만들 수 있습니다.
$ echo 'password' >secret.txt
이제 이미지에서 이 파일을 제외하려고 합니다. 에 추가할 수 있습니다. dockerignore 파일:
# Ignoring the password file
secret.txt
이렇게 하면 빌드 컨텍스트에서 리소스를 제외할 수 있습니다. 또한 모범 사례 에 따라 성능이 향상됩니다. 업로드할 이미지의 크기는 더 작아집니다.
또한 예를 들어 복사할 파일을 추가하는 경우 새 레이어의 캐시 무효화 문제가 발생하지 않습니다. 이 접근 방식을 사용하여 폴더를 제외할 수도 있습니다.
# Ignore the logs directory
logs/
. dockerignore 파일입니다. 그런 다음 컨테이너를 시작할 수 있습니다.
$ docker run -d --publish 8000:8000 node-docker
또는 Docker Compose를 사용 하는 경우 docker-compose.yml 파일 로 docker-compose up 을 실행할 수 있습니다. 예를 들면 다음과 같습니다.
services:
node-app:
image: node-docker:latest
ports:
- 8080:8080
컨테이너에서 bash 명령 을 실행하여 다시 확인할 수 있습니다 .
$ docker exec -it d8938bc93406 bash
컨테이너 내부에 들어가면 예를 들어 ls 명령 을 사용하여 콘텐츠를 확인하는 경우 실행 중인 컨테이너에 secret.txt 파일이나 기타 제외된 리소스가 없어야 합니다.
4. Docker 볼륨으로 파일 및 폴더 제외
이미지를 빌드하는 동안 파일과 폴더를 제외하는 방법을 살펴보았습니다. 볼륨 을 사용하는 컨테이너를 실행하는 경우에도 동일한 작업을 수행할 수 있습니다 .
그 이유 중 하나는 호스트에 있는 항목에 영향을 주지 않고 파일이나 폴더를 추가하는 것일 수 있습니다.
이제 Docker 컨테이너에 프로젝트 폴더를 추가한다고 가정해 보겠습니다. mount bind 를 사용하여 이를 달성할 수 있습니다.
Nodejs 애플리케이션을 사용하여 이에 대한 Docker Compose 예제를 만들어 보겠습니다. docker-compose.yml 파일 을 살펴보겠습니다 .
services:
node-app:
build: .
ports:
- 8081:8080
volumes:
- .:/app
프로젝트의 루트 디렉터리에서 컨테이너를 실행할 수 있습니다.
$ docker-compose up -d
컨테이너가 시작되고 예상대로 마운트할 컨테이너에 파일이나 디렉터리가 있으면 Docker가 콘텐츠를 볼륨에 복사합니다.
이제 어떤 이유로 컨테이너에서 파일이나 폴더를 삭제한다고 가정해 보겠습니다. 호스트에서도 동일한 결과가 발생하고 해당 리소스를 잃게 됩니다.
호스트에서 리소스 삭제를 방지하는 몇 가지 솔루션을 살펴보겠습니다.
4.1. 파일 제외
컨테이너에서 파일 마운트를 제외하여 시작할 수 있습니다. 볼륨을 설정하면 /dev/null 명령을 사용하여 해결 방법을 수행할 수 있습니다.
다시 docker-compose.yml 파일을 살펴보겠습니다.
services:
node-app:
build: .
ports:
- 8080:8080
volumes:
- .:/app/
- /dev/null:/app/secret.txt
/dev/null 을 사용할 때 파일에 기록된 모든 것을 버립니다. 이 경우에는 secret.txt 가 비어 있는 상태로 끝납니다. 또한 /dev/null 에 대한 바인딩으로 인해 파일을 수정할 방법이 없습니다 .
4.2. 폴더 제외
더 흥미롭게도 폴더와 하위 폴더를 제외할 수 있습니다. 특정 디렉터리 또는 하위 디렉터리에 대해 익명 또는 명명된 볼륨 을 생성하여 이를 달성할 수 있습니다 .
YAML 파일을 살펴보겠습니다.
services:
node-app:
build: .
ports:
- 8080:8080
volumes:
- .:/app
- /app/node_modules/
여기서 순서는 관련이 있습니다. 먼저, 이전에 생성한 /app 디렉토리에 대한 바인드가 있습니다. 그런 다음 제외할 볼륨(이 경우에는 /node_modules 하위 디렉터리 )을 마운트합니다 .
데이터를 유지하려면 명명된 볼륨을 사용할 수 있습니다.
volumes:
- .:/app
- my-vol:/app/node_modules/
volumes:
my-vol:
driver: local
마지막으로 컨테이너에서 /node_modules 디렉토리의 내용을 수정하려고 시도할 수 있습니다. 이 경우 호스트에 영향을 미치지 않습니다.
5. 결론
이 기사에서는 Docker를 사용하여 파일 또는 폴더와 같은 리소스를 제외하는 방법을 배웠습니다. 이미지 빌드부터 컨테이너 실행까지의 예를 살펴보았습니다. 컨테이너의 경우 Docker Compose를 사용하는 예와 볼륨을 사용하여 하위 폴더를 제외할 수 있는 가능성을 보았습니다.
항상 그렇듯이 GitHub에서 작업 코드 예제를 찾을 수 있습니다 .