호스트에서 Docker 이미지로 디렉터리 복사

David Mbochi Njonge 2023년6월20일
  1. 익스프레스 애플리케이션 만들기
  2. ADD 명령어 사용
  3. COPY 명령어 사용
  4. ADD 명령에 대한 대안 사용
호스트에서 Docker 이미지로 디렉터리 복사

Docker 설명서는 Docker를 개발자가 가능한 가장 빠른 방법으로 애플리케이션을 개발, 배송 및 실행하는 데 도움이 되는 인프라 독립적인 도구로 정의합니다.

이러한 이점 외에도 DevOps 개발자는 지속적인 통합, 제공 및 배포에 Docker를 사용합니다. 이 개발 접근 방식을 일반적으로 CI/CD라고 하며 개발자는 컨테이너를 사용하여 변경 사항 또는 기능을 개발, 테스트 및 프로덕션에 배포합니다.

응용 프로그램의 버그는 개발 환경에서 수정됩니다. 이 작업이 완료되면 테스트 환경에서 자동화 테스트가 실행됩니다. 마지막으로 모든 테스트를 통과하면 새 변경 사항이 있는 이미지가 프로덕션에 배포됩니다.

이 자습서에서는 호스트 컴퓨터에서 도커 이미지로 디렉터리를 복사하는 방법을 알려줍니다. 이를 실현하기 위해 API를 반환하는 익스프레스 애플리케이션을 사용할 것입니다.

익스프레스 애플리케이션 만들기

Intellij IDEA를 엽니다. 파일 -> 새로 만들기 -> 프로젝트를 선택합니다. 열리는 창에서 왼쪽의 Node.js를 선택하고 프로젝트 이름을 untitled에서 employee-api로 변경합니다. 마지막으로 만들기 버튼을 눌러 프로젝트를 생성합니다.

애플리케이션에 Express를 설치하려면 View > Tool Windows > Terminal을 선택하여 Intellij IDEA에서 새 터미널 창을 열고 다음 명령을 사용하여 Express를 설치합니다.

~/WebstormProjects/employee-api$ npm install express

express를 설치한 후 employee-api 폴더에 main-app이라는 폴더를 만듭니다. 그런 다음 API를 생성하려면 main-app 폴더에 index.js라는 파일을 생성하고 다음 코드 펜스를 복사하여 파일에 붙여넣습니다.

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.json(
        [{
            name: 'Bob',
            email: "bob@gmail.com"
        },
            {
                name: 'Alice',
                email: 'alice@gmail.com'
            },
        ])
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

이 파일에서 우리는 포트 3000을 노출하는 익스프레스 애플리케이션을 만들었고 / 경로에 대한 모든 요청은 직원 배열을 반환합니다. 다음 섹션에서 다루는 모든 예제에서 이 애플리케이션을 사용할 것입니다.

ADD 명령어 사용

기본 폴더인 employee-apiDockerfile이라는 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD main-app /com/employee/main-app
CMD node main-app/index.js

애플리케이션의 사용자 지정 이미지를 생성하기 위해 일반적으로 이 예제와 같이 Dockerfile이라는 파일을 사용합니다. 다음 섹션에서는 파일에서 사용되는 각 명령의 의미를 정의합니다. 우리의 관심사는 두 번째 마지막 줄에 있는 ADD 명령입니다.

이전 코드 예제에서 사용된 모든 명령은 아래에 간략하게 설명되어 있습니다.

  • FROM - Dockerfile에서 선언되는 첫 번째 명령이며 주요 목적은 이미지를 빌드하는 데 사용할 기본 이미지를 선언하는 것입니다. 기본 이미지는 공용 리포지토리에서 가져옵니다.
  • WORKDIR - 작업 디렉토리를 설정하며, 다른 명령어에서 설정하지 않아도 작업 디렉토리가 생성됩니다.
  • ADD - 원본에서 대상으로 파일 또는 폴더를 복사합니다. 소스는 일반적으로 호스트 시스템이고 대상은 컨테이너의 파일 시스템입니다.
  • RUN - 기존 이미지 위에 제공된 명령을 실행하고 실행 결과를 포함하는 새 이미지를 반환합니다. 이 경우 명령은 현재 이미지에 대한 종속성을 설치합니다. 그리고 결과 이미지에는 종속성이 포함됩니다.
  • CMD - 컨테이너를 가동할 때 이 명령은 실행 파일 또는 진입점 명령을 포함하여 컨테이너의 기본값을 제공합니다. 이 경우 명령의 쉘 형식을 사용했습니다. 또한 컨테이너의 기본값으로 실행 파일을 제공했습니다.

ADD 명령을 사용하여 main-app 디렉토리를 호스트 시스템에서 작업 디렉토리 /com/employee/main-app에 생성된 새 디렉토리로 복사했습니다. 이를 실제로 보려면 다음 명령을 사용하여 employee-api 태그가 있는 이미지를 생성하십시오.

~/WebstormProjects/employee-api$ docker build --tag employee-api:latest.

빌드가 성공할 때까지 콘솔의 처음 5개 지침을 준수하십시오. 그런 다음 아래와 같이 실행되는 명령을 볼 수 있는지 확인하십시오.

 => [1/5] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6997b                         0.0s
 => [internal] load build context                                                                                                                    0.1s
 => => transferring context: 137B                                                                                                                    0.0s
 => CACHED [2/5] WORKDIR /com/employee                                                                                                               0.0s
 => CACHED [3/5] ADD package*.json ./                                                                                                                0.0s
 => CACHED [4/5] RUN npm install                                                                                                                     0.0s
 => CACHED [5/5] ADD main-app /com/employee/main-app  

이미지에서 컨테이너를 실행할 때 마지막 명령이 실행됩니다. 예를 들어 다음 명령을 사용하여 이미지에서 컨테이너를 실행합니다.

~/WebstormProjects/employee-api$ docker run --name employee-service -d -p 3000:3000 employee-api:latest 

이 명령은 분리 모드 -d에서 employee-api 이미지를 사용하여 employee-service라는 컨테이너를 실행하고 포트 -p 3000localhost의 포트 3000에 매핑합니다.

애플리케이션이 예상대로 작동하는지 확인하려면 localhost:3000(http://localhost:3000/)으로 이동하여 직원 데이터를 가져옵니다. 다음은 요청에서 반환된 JSON 배열입니다.

[
    {
    "name": "Bob",
    "email": "bob@gmail.com"
    },
    {
    "name": "Alice",
    "email": "alice@gmail.com"
    }
]

COPY 명령어 사용

Dockerfile 파일의 지침에 주석을 달고 주석 뒤에 다음 코드를 복사하여 파일에 붙여넣습니다.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
COPY main-app /com/employee/main-app
CMD node main-app/index.js

이러한 지침은 이전 예제의 지침과 동일합니다. 유일한 변경 사항은 마지막 두 번째 줄의 ADD 명령을 COPY 명령으로 바꾸는 것입니다.

COPY - 원본에서 대상으로 파일 또는 폴더를 복사합니다. 소스는 일반적으로 호스트 시스템이고 대상은 컨테이너의 파일 시스템입니다.

COPY 명령은 동일한 목표를 달성한다는 점에서 ADD 명령과 유사합니다. 이를 실제로 보려면 이전 예제에서 사용한 명령을 사용하여 이미지를 만들고 이미지에서 컨테이너를 실행하십시오.

새 이미지를 만들거나 기존 이미지를 다시 만들 수 있습니다. 기존 이미지를 다시 생성하려면 실행 중인 컨테이너를 중지하고 컨테이너를 제거한 다음 이미지를 제거해야 합니다. 다음 명령을 사용하여 단계를 각각 실행합니다.

~/WebstormProjects/employee-api$ docker stop employee-service 
~/WebstormProjects/employee-api$ docker rm -f employee-service 
~/WebstormProjects/employee-api$ docker rmi -f employee-api:latest 

ADD 명령에 대한 대안 사용

Dockerfile 파일의 지침에 주석을 달고 주석 뒤에 다음 코드를 복사하여 파일에 붙여넣습니다.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD . .
CMD node main-app/index.js

이 예제는 이전 예제와 유사하며 COPY 명령을 ADD 명령으로 바꾼 유일한 변경 사항입니다. 이 예에서 ADD 명령어는 두 개의 점 을 사용합니다. . 소스와 대상을 지정합니다.

현재 디렉토리의 모든 내용을 작업 디렉토리에 복사하려고 함을 나타냅니다. 예를 들어, 이 명령을 사용하여 main-app 폴더와 그 내용을 이미지의 작업 디렉토리 /com/employee에 추가할 수 있습니다. 이는 다른 예제보다 훨씬 쉽습니다.

.dockerignore 파일을 사용하여 이미지에 추가하지 않으려는 파일과 폴더를 추가할 수 있습니다. 그런 다음 이전 예제에서 사용한 명령을 사용하여 이미지를 빌드하고 이미지에서 컨테이너를 실행합니다.

익스프레스 애플리케이션에서 코드를 변경하지 않았기 때문에 출력은 여전히 동일합니다.

따라서 호스트 시스템에서 이미지의 파일 시스템으로 디렉토리를 복사하는 방법을 배웠습니다. ADDCOPY 명령을 사용하여 한 디렉토리를 다른 디렉토리로 복사할 수도 있습니다.

두 개의 점 COPY 와 함께 COPY 명령을 사용할 수도 있습니다. . 여전히 동일한 효과가 있습니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

관련 문장 - Docker Directory