지금까지 Docker 대한 전반적인 내용에 대해 알아보았으니, 간단하게 공식 문서를 보고 Docker를 사용하는 법을 따라해본다.
repository를 clone해서 node 프로젝트 복사하기.
$ git clone https://github.com/docker/getting-started-app.git
프로젝트는 다음과 같은 구조로 되어있음
├── getting-started-app/
│ ├── package.json
│ ├── README.md
│ ├── spec/
│ ├── src/
│ └── yarn.lock
Dockerfile
생성하고 다음과 같이 작성하기# node 18 apline 버전 이미지를 기반으로 시작
FROM node:18-alpine
# working directory를 /app 으로 지정
WORKDIR /app
# 빌드 컨텍스트에 있는 모든 파일을 컨테이너 파일시스템의 /app으로 복사
COPY . .
# 의존성 설치(배포에 필요한 의존성만)
RUN yarn install --production
# 컨테이너를 실행할 때 다음 명령어를 실행
CMD ["node", "src/index.js"]
# 3000번 포트를 오픈
EXPOSE 3000
$ docker build -t getting-started .
Docker는 여러 layer를 다운로드 합니다.
-t
플래그는 최종 이미지의 이름을 지정합니다. 이미지 이름은 getting-started라고 했기 때문에 컨테이너를 실행할 때 해당 이미지 이름으로 참조할 수 있습니다.
docker build
명령어 끝에 .
은 현재 디렉토리를 빌드 컨텍스트로 지정하며, 현재 디렉토리에서 Dockerfile을 찾아야 한다는 것을 알려줍니다.
$ docker run -dp 3000:3000 --name getting-started getting-started
-d or --detach
플래그를 사용하여 컨테이너를 백그라운드에서 실행합니다.
-p or --publish
플래그를 사용하여 호스트와 컨테이너 사이의 포트 매빙을 생성합니다.
-p
플래그는 HOST:CONTAINER 형식의 문자열 값이며, 여기서 HOST는 호스트의 주소이고 CONTAINER는 컨테이너의 포트입니다.
이 명령은 컨테이너의 포트 3000을 호스트의 127.0.0.1:3000(localhost:3000)에 게시합니다. 포트 매핑 없이는 호스트에서 애플리케이션에 접근할 수 없습니다.
$ docker ps -a
실행중인 컨테이너는 확인할 수 있습니다.
브라우저를 통해 확인할 수 있습니다.
$ docker build -t getting-started .
docker run -dp 3000:3000 --name getting-started getting-started
docker: Error response from daemon: driver failed programming external connectivity on endpoint blissful_shockley (cddfde8fe6720c9d803113b72d4195fe6587ecc08c4b4fd43a1e233dff67aa49): Bind for 0.0.0.0:3000 failed: port is already allocated.
이미 이전 컨테이너가 호스트의 3000번 사용 중이기 때문에 에러가 발생함
Docker 이미지를 공유하기 위해 Docker 레지스트리를 사용해야 합니다.
기본 레지스트리는 Docker Hub 입니다.
Docker Hub에 가입 후 리포지토리를 생성한다.(getting-started
이름으로 생성)
docker login -u <username>
로그인은 private token을 비밀번호를 사용해서 로그인 할 수 있습니다.(Docker Hub 프로필에서 생성 가능)
docker tag getting-started devmingyo/getting-started
tag
명령어로 getting-started 이미지 이름을 새로운 이름으로 변경합니다.
docker push devmingyo/getting-started
방금 도커 레지스트리에 푸시한 이미지를 Docker playground에서 컨테이너 실행을 해보겠습니다.
run
명령어로 컨테이너를 실행할 때, 이미지가 호스트 컴퓨터에 존재하지 않으면, 먼저 도커 레지스트리에서 이미지를 pull 해옵니다.
새 컨테이너가 잘 실행됐습니다.
Docker를 이용해서 이미지를 빌드하고 실행, 중지, 삭제, Docker Registry에 push 및 pull, tag
명령어를 이용하여 이미지 이름 변경까지 알아보았습니다.