해당 글은 Inflearn(인프런) ‘비전공자도 이해할 수 있는 Docker 입문/실전' 강의를 토대로 작성되었습니다.
1. Dockerfile이란?
Docker 이미지는 Dockerhub을 통해 다운받아서 사용할 수 있다. 이 Docker 이미지들도 누군가 만들어서 Dockerhub에 올려놓은 것이다. 그럼 도대체 이 Dcoker 이미지는 어떻게 만드는 걸까?
Dockerfile이라는 걸 활용해서 Docker 이미지를 만들 수 있다.
2. FROM : 베이스 이미지 생성
FROM은 베이스 이미지를 생성하는 역할을 한다. Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 셋팅을 할 수 있다. 여기서 얘기한 ‘특정 초기 이미지’가 곧 베이스 이미지이다.
# 문법
FROM [이미지명]
FROM [이미지명]:[태그명]
[실습] FROM : 베이스 이미지 생성
JDK 17 베이스 이미지로 컨테이너 띄워보기
1. Dockerfile 만들기
openjdk - Official Image | Docker Hub
Docker Official Images are a curated set of Docker open source and drop-in solution repositories. Why Official Images? These images have clear documentation, promote best practices, and are designed for the most common use cases.
hub.docker.com
Dockerfile
# JDK 17
FROM openjdk:17-jdk
2. Dockerfile을 기반으로 이미지 만들기
Dockerfile로 이미지(Image) 생성하는 문법
# docker build -t [이미지명]:[태그명] [Dockerfile이 존재하는 디렉터리 경로]
docker build -t my-jdk17-server
3. 이미지를 기반으로 컨테이너 띄우기
docker run -d my-jdk17-server
4. 컨테이너 조회하기
docker ps # 실행되고 있는 컨테이너가 없다.
docker ps -a # 확인해보니 컨테이너가 종료되어 있다.
Docker의 컨테이너는 내부적으로 필요한 명령을 다 수행하면 컨테이너가 저절로 종료된다.
5. 컨테이너 내부로 들어가서 jdk가 잘 깔렸는지 확인해보기
FROM openjdk:17-jdk
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
docker build -t my-jdk17-server . # 이미지 빌드
docker run -d my-jdk17-server # 컨테이너 실행
docker ps # 실행 중인 컨테이너 조회
docker exec -it [컨테이너 ID] bash # 컨테이너 접속
java -version # JDK 설치되어 있는 지 확인
Node 베이스 이미지로 컨테이너 띄워보기
1. Dockerfile 만들기
FROM node
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
2. 이미지 만들고 컨테이너 띄우기
docker build -t my-node-server . # 이미지 생성
docker run -d my-node-server # 이미지를 기반으로 컨테이너 생성
docker ps # 실행 중인 컨테이너 조회
docker exec -it [컨테이너 ID] bash # 컨테이너 접속
node -v # Node 설치되어 있는 지 확인
3. COPY : 파일 복사(이동)
COPY는 호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달한다.
✅ 사용법
# 문법
COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [컨테이너에서 파일이 위치할 경로]
# 예시
COPY app.txt /app.txt
파일 복사해보기
1. app.txt 파일 만들기
2. Dockerfile 만들어서 이미지 생성 및 컨테이너 실행
FROM ubuntu
COPY app.txt /app.txt
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드
docker build -t my-server .
docker run -d my-server
docker exec -it [Container ID] bash
ls
폴더 안에 있는 모든 파일들 복사
1. my-app 디렉터리 만들기, my-app 디렉터리 안에 파일 만들기
2. Dockerfile 만들어서 이미지 생성 및 컨테이너 실행
FROM ubuntu
COPY my-app /my-app/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드
docker build -t my-server .
docker run -d my-server
docker exec -it [Container ID] bash
ls
와일드 카드 사용해보기
1. app.txt, readme.txt 파일 2개 만들기
2. Dockerfile 만들어서 이미지 생성 및 컨테이너 실행
FROM ubuntu
COPY *.txt /text-files/
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] # 디버깅용 코드
- 주의) /text-files라고 적으면 안 되고 /text-files/라고 적어야 text-files라는 디렉토리 안에 파일들이 정상적으로 복사된다.
.dockerignore 사용해보기
특정 파일 또는 폴더만 COPY를 하고 싶지 않을 수 있다. 그럴 때 .dockerignore를 활용한다.
.dockerignore 파일 만들기
readme.txt
4. ENTRYPOINT : 컨테이너가 시작할 때 실행되는 명령어
ENTRYPOINT는 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어를 뜻한다.
# 문법
ENTRYPOINT [명령문...]
# 예시
ENTRYPOINT ["node", "dist/main.js"]
5. RUN : 이미지를 생성하는 과정에서 사용할 명령문 실행
RUN은 이미지 생성 과정에서 명령어를 실행시켜야 할 때 사용한다.
# 문법
RUN [명령문]
# 예시
RUN npm install
예제
미니 컴퓨터 환경이 ubuntu로 구성되었으면 좋겠고 git이 깔려있으면 좋겠다고 가정하자. 이런 환경을 구성하기 위해 Dockerfile을 활용해 ubuntu, git이 깔려있는 이미지를 만들면 된다.
FROM ubuntu
RUN apt update && apt install -y git
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
6. WORKDIR : 작업 디렉토리를 지정
WORKDIR으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다. 작업 디렉터리를 굳이 지정해주는 이유는 컨테이너 내부의 폴더를 깔끔하게 관리하기 위해서이다.
# 문법
WORKDIR [작업 디렉토리로 사용할 절대 경로]
# 예시
WORKDIR /usr/src/app
7. EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화하기
EXPOSE는 컨테이너 내부에서 어떤 포트에 프로그램이 실행되는 지를 문서화하는 역할만 한다.
# 문법
EXPOSE [포트 번호]
# 예시
EXPOSE 3000
'Docker' 카테고리의 다른 글
Docker : Docker Compose를 활용해 컨테이너 관리하기 (0) | 2024.12.02 |
---|---|
Docker : 도커 볼륨을 활용해 데이터 유실 방지하기 (0) | 2024.12.02 |
Docker : [실습] Docker(Nginx 설치 및 실행) (0) | 2024.12.02 |
Docker : Docker CLI 익히기 (1) | 2024.12.02 |
Docker : Docker란? (0) | 2024.12.02 |