도커를 쓰는 이유
컨테이너를 실행하면 호스트 PC에 영향을 주지 않고 서로 다른 종속성을 동시 실행할 수 있다.
컨테이너 실행 과정
도커 파일로 도커 이미지를 만들고, 이미지를 실행하면 컨테이너가 된다.
(마치 프로그램을 메모리에 올리면 프로세스가 되듯, 이미지를 실행하면 컨테이너가 됨)
주요 명령어
- docker images : 조회
- docker pull {이미지 이름} : 이미지 다운로드
- docker run : 실행 (image -> container)
- docker ps -a : 실행 중인 도커 컨테이너 목록 조회
- docker exec : 실행 중인 컨테이너 내부에 들어가는 경우 (자주 쓰는 명령어)
- docker rm : stop, 컨테이너 삭제
- docker rmi : 이미지 삭제
- 컨테이너 내부로 들어가는 기본 명령어 : $ docker exec -it {컨테이너 이름} /bin/bash
도커파일과 이미지는 어떻게 생겼을까
❓<dockerfile>
# syntax=docker/dockerfile:1
FROM node:lts-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
설명
- FROM : node:lts-alpine 이미지를 기반으로 컨테이너 생성
- WORKDIR : 컨테이너 내에서 /app 디렉토리를 작업 디렉토리로 지정
- COPY : 현재 디렉토리(.)의 모든 파일을 컨테이너의 /app 디렉토리로 복사
- 로컬 프로젝트 파일들이 컨테이너 내부로 복사
- .dockerignore 파일을 활용하면 불필요한 파일을 제외할 수도 있음
- RUN : 컨테이너 이미지 빌드 시 해당 명령어를 실행하여 의존성 설치
- CMD : 컨테이너 시작 시 node src/index.js를 실행
- EXPOSE : 3000번 포트 노출
도커 파일 구성
명령어 | 동작 | |
FROM | 베이스 이미지 지정 | |
RUN | 컨테이너 이미지 빌드 시 실행할 명령어 지정 | 빌드 시 1번 |
ARG | 컨테이너 빌드 시 사용할 변수 설정 | |
CMD | 컨테이너 시작 시 실행할 기본 명령어 | 컨테이너 실행 시 n번 |
ENTRYPOINT | 컨테이너 시작 시 실행할 동작 지정 (CMD와 유사) | CMD와 유사하지만 ENTRYPOINT는 컨테이너 실행 시 param 값을 대체할 수 없음 |
LABEL | 이미지 메타데이터 | key-value 형식 |
ENV | 실행 시 환경변수 설정 (ARG와 유사) | key-value 형식, 실행 시 |
EXPOSE | 컨테이너가 외부와 통신하기 위해 사용하는 포트 지정 | |
COPY | 호스트 내 파일 및 디렉토리를 컨테이너의 파일시스템으로 복사 | |
ADD | 파일 및 디렉토리를 컨테이너로 복사 (COPY와 유사) | COPY와 달리 호스트 외에도 경로(URL)를 지정하여 remote 파일/디렉토리 복사 가능 |
USER | 컨테이너 안에서 명령을 실행할 유저명, 유저그룹을 설정 | |
WORKDIR | 작업 디렉토리 설정 | |
VOLUME | 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트(연결) |
❓<이미지>
Dockerfile을 기반으로 생성되는 이미지는 내부적으로 계층(layer) 구조로 되어 있어서 시각적으로 보기 어렵지만, 기본적으로 계층구조를 갖는다.
위의 dockerfile을 $docker build로 이미지화하고 $docker history로 이미지 생성 기록을 볼 수 있다.
$ docker history getting-started
IMAGE CREATED CREATED BY SIZE
d1f10f3b9d48 5 minutes ago CMD ["node" "src/index.js"] 0B
e74e9609e4c8 5 minutes ago RUN yarn install --production 62MB
8f19e633f763 5 minutes ago COPY . . 500kB
b4d2be07c6d7 5 minutes ago WORKDIR /app 0B
78f9f40d4d3a 6 weeks ago FROM node:lts-alpine 116MB
Docker 이미지는 여러 개의 레이어(layer)로 구성된다. 각 레이어는 베이스 이미지부터 시작해, 필요한 종속성과 애플리케이션 코드가 추가되면서 하나의 최종 이미지를 형성한다.
이미지는 어디서 어떻게 구하는가
직접 dockerfile을 작성해 이미지를 만들 수 있지만, 결국 nginx와 같은 환경요소는 기존에 있는 이미지를 불러와 사용해야하므로 제공되는 이미지를 외부에서 내려받아 사용한다.
클라우드 상의 저장소로부터 이미지를 다운로드 받을 수 있는데, 대표적인 레포지토리는 다음과 같다.
- Docker Hub
- Amazon ECR
- Github Container Repository
전반적이고 기본적인 배포과정 명령어
1. 배포할 소스코드 준비
도커 워크샵 공식문서를 기반으로, 이미 구현된 코드를 바탕으로 dockerfile를 구성하고 이미지화하여 컨테이너로 배포하는 과정을 기술한다.
$ git clone https://github.com/docker/getting-started-app.git
여기서 코드를 내려받으면 아래와 같은 디렉토리 구조로 파일이 로드된다.
├── getting-started-app/
│ ├── .dockerignore
│ ├── package.json
│ ├── README.md
│ ├── spec/
│ ├── src/
│ └── yarn.lock
2. dockerfile 생성
getting-started-app 디렉토리 하위에 Dockerfile을 생성한다.
📍 애플리케이션 코드가 위치한 최상위 폴더에 Dockerfile을 생성한다.
# syntax=docker/dockerfile:1
FROM node:lts-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
├── getting-started-app/
│ ├── Dockerfile # 👈🏻 Dockerfile을 여기에 위치
│ ├── .dockerignore
│ ├── package.json
│ ├── README.md
│ ├── spec/
│ ├── src/
│ └── yarn.lock
3. docker 이미지 빌드
getting-started-app/ 디렉토리에서 다음 명령어를 실행한다.
$ docker build -t getting-started .
4. docker 이미지 실행(=컨테이너화)
$ docker run -d -p 127.0.0.1:3000:3000 getting-started
5. 프로그램 실행 확인
http://localhost:3000에서 확인 가능!
6. 실행화면
'Cloud > Docker' 카테고리의 다른 글
[Docker] Multi-stage Build (0) | 2025.02.12 |
---|---|
[Docker] Node.js 경량 웹서버 컨테이너화 및 MySQL 연동 (0) | 2025.02.10 |
[Docker] Networking (0) | 2025.02.06 |
[Docker] 볼륨(Volume)을 이용한 데이터 영속성 관리 (0) | 2025.02.05 |