728x90
Docker 이미지는 Dockerhub를 통해 다운받아 사용할 수 잇따. 이 Docker 이미지들고 누군가 만들어서 Dockerhub에 올려놓은 것이다. 그럼 도대체 이 Docker 이미지는 어떻게 만드는 것일까!?
바로 Dockerfile이라는 것을 활용해 Docker 이미지를 만들 수 있다.
Dockerhub에 올려놓은 Docker 이미지가 아닌, 나만의 Docker 이미지를 만들고 싶을 수 있다. 예를 들어, 내가 만든 Spring Boot 프로젝트가 있는데 내가 만든 Spring Boot 프로젝트 자체를 Docker 이미지로 만들고 싶을 수 있다.
이럴 때에도 Dockerfile을 활용하면 나만의 Docker 이미지를 만들 수 있게 된다.
요약 :
Dockerfile이란 Docker 이미지를 만들수 있게 해주는 파일이다.
- Dockerfile을 작성 할 땐 실제 파일의 이름을 'Dockerfile'로 해야한다.
- ubuntu에 아파치 서버를 설치하는 Dockerfile을 작성해보도록 해봄
- Dockerfile을 담을 디렉토리를 생성 한 후 Dockerfile을 생성한다
mkdir apache-dockerfile && cd apache-dockerfile vi Dockerfile
- Dockerfile의 내용은 아래와 같다.
# server image는 ubunutu 20.04를 사용
FROM ubuntu:20.04
# Dockerfile 작성자 이제는MAINTAINER보다 LABEL을 많이씀
LABEL email="minino0220@gmail.com"
LABEL name="minwoo"
LABEL version="1.0"
LABEL description="This is Minwoo Docker Test version 1.0"
# image가 올라갔을 때 수행되는 명령어들
# -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
RUN \
apt-get update && \
apt-get install -y apache2
# apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다.
EXPOSE 80
# 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
# apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다.
CMD ["apachectl", "-D", "FOREGROUND"]
FROM : 베이스 이미지 생성
의미 : FROM은 베이스 이미지를 생성하는 역할. Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 셋팅을 할 수 있다. 여기서 얘기한 '특정 초기 이미지'가 곧 베이스 이미지이다. (어느 이미지에서 시작할 것인지를 이야기한다 )
✔️사용법
# 문법
FROM [이미지명]
FROM [이미지명]:[태그명]
- 태그명을 적지 않으면 해당 이미지의 최신(latest) 버전을 사용
CMD / ENTRYPOINT : 컨테이너를 생성 및 실행 할 때 실행할 명령어
- 보통 컨테이너 내부에서 항상 돌아가야하는 서버를 띄울 때 사용.
- CMD
- 컨테이너를 생성할 때만 실행된다. (docker run)
- 컨테이너 생성 시, 추가적인 명령어에 따라 설정한 명령어를 수정할 수 있다.
- MAINTAINER : 이미지를 생성한 개발자의 정보 (1.13.0 이후 사용 X)
- LABEL : 이미지에 메타데이터를 추가 (key-value 형태)
- RUN : 새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성한다.
- RUN 명령을 실행할 때 마다 레이어가 생성되고 캐시된다.
- 따라서 RUN 명령을 따로 실행하면 apt-get update는 다시 실행되지 않아서 최신 패키지를 설치할 수 없다.
- 위 처럼 RUN 명령 하나에 apt-get update와 install을 함께 실행 해주자.
- WORKDIR : 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성한다.
- 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
- cd 명령어와 동일하다.
✔️사용법
#문법
WORKDIR [작업 디렉토리로 사용할 절대 경로]
#예시
WORKDIR /usr/src/app
- EXPOSE : Dockerfile의 빌드로 생성된 이미지에서 열어줄 포트를 의미한다.
- 호스트 머신과 컨테이너의 포트 매핑시에 사용된다.
- 컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야한다.
- 따로 기능은 없고 문서화 역할만 함. 없어도 되지만 실무나 협업에서 작성하는것을 권장한다.
✔️사용법
# 문법
EXPOSE [포트 번호]
# 예시
EXPOSE 3000
- USER : 이미지를 어떤 계정에서 실행 하는지 지정
- 기본적으로 root에서 해준다.
- COPY : 호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달한다.
✔️사용법
# 문법
COPY [호스트 컴퓨터에 있는 복사할 파일의경로] [컨테이너에서 파일이 위치할 경로]
# 예시
COPY app.txt /app.txt
원하는 파일만 제외하고 복사 하고 싶을때
#앞에 .꼭 넣어줘야함 오타 아님
.dockerignore라는 도커파일을 생성후 복사하기 싫은 txt파일을 입력해주면 된다.
- ADD : build 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 것
- ADD 명령문은 좀 더 파워풀한 COPY 명령문이라고 생각할 수 있다.
- ADD 명령문은 일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용할 수 있다.
- 이렇게 특수한 파일을 다루는 게 아니라면 COPY 명령문을 사용하는 것이 권장된다.
- ENV : 이미지에서 사용할 환경 변수 값을 지정한다.
- path 등
- ENTRYPOINT
- 컨테이너를 시작할 때마다 실행된다. (docker start)
- 컨테이너 시작 시, 추가적인 명령어 존재 여부와 상관 없이 무조건 실행된다.
- 컨테이너를 시작하자마자 실행시키고 싶은 명령어를 작성해주면 된다.
- 명령어 형식
- CMD ["<커맨드>", "<파라미터1>", "<파라미터2>"]
- CMD <커맨드> <파라미터1> <파라미터2>
- ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
- ENTRYPOINT <커맨드> <파라미터1> <파라미터2>
✔️사용법
#문법
#ENTRYPOINT ["/bin/bash","-c","sleep 500"] # 500초 동안 시스템을 일시정지 시키는 명령어
#ENTRYPOINT ["/bin/bash","-c","echo hello"] #hello 출력
#위 명령어를 추가하면 컨테이너가 바로 종료되는 걸 막을 수 있다.
CMD ["<커맨드>", "<파라미터1>", "<파라미터2>"]
CMD <커맨드> <파라미터1> <파라미터2>
ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
ENTRYPOINT <커맨드> <파라미터1> <파라미터2>
생성한 Dockerfile을 Image로 빌드
- 이미지 빌드 명령어
docker build -t [이미지 이름:이미지 버전] [Dockerfile의 경로docker build -t apache-image .
'DOCKER' 카테고리의 다른 글
[비전공자의 Docker ] Docker Compose로 MYSQL실행 (1) | 2024.12.16 |
---|---|
[비전공자의 Docker ] Docker Compose (도커컴포즈) (0) | 2024.12.12 |
[비전공자의 Docker ] Volume을 이용한 MySQL 실행시켜보기 (1) | 2024.12.11 |
[비전공자의 Docker ] Docker로 MySQL 실행시켜보기 및 오류 (1) | 2024.12.11 |
[비전공자의 Docker ] Docker Volume(도커 볼륨) (0) | 2024.12.10 |