#docker
도커 파일 개념과 사용 방법을 간단하게 살펴보자!
Docker 이미지는 Dockerhub를 통해 다운받아 사용할 수 있다. 이때 사용되는 이미지를 만드는 기술이다.
Dockerfile을 활용해 Docker 이미지를 만들 수 있다.
Dockerhub에 올려놓은 Docker 이미지가 아닌, 나만의 Docker 이미지를 만들고 싶을 수 있다. 예를 들어 내가 만든 Django 프로젝트가 있다. 내가 만든 프로젝트 자체를 Dockerfile을 활용하여 Docker 이미지로 만들 수 있다.
FROM 베이스 이미지 생성FROM은 베이스 이미지를 생성하는 역할을 한다. Docker 컨테이너를 특정 초기 이미지를 기반으로 추가적인 세팅을 할 수 있다. 특정 초기 이미지가 곧 베이스 이미지이다.
윈도우 컴퓨터를 새로 사서 실행시키면 기본 프로그램들이 이미 설치돼있다. 베이스 이미지도 이와 똑같다. 컨테이너를 새로 띄워서 미니 컴퓨터 환경을 구축할 때 기본 프로그램이 어떤게 깔려있을지 선택하는 옵션이라고 생각하자.
누군가는 JDK가 깔려있는 컴퓨터 환경이 세팅되기를 바랄 수도 있고, 누군가는 Python이 깔려있는 컴퓨터 환경이 세팅되기를 바랄 수도 있다. 필요에 따라 베이스 이미지를 고르면 된다.
FROM [이미지 이름]
FROM [이미지 이름]:[태그 이름]
태그 이름을 명시하지 않으면 해당 이미지의 최신 버전을 사용한다.Dockerfile 만들기FROM openjdk:17-jdk
docker build -t [이미지 이름]:[태그 이름] [Dockerfile 디렉터리 경로]
# docker build -t my-jdk-server .
# docker build -t my-jdk-server:beta .
docker run -d my-jdk-server
docker ps # 실행되고 있는 컨테이너가 없다
docker ps -a # 컨테이너가 종료돼 있음
왜 종료돼있지? -> Docker 컨테이너는 내부적으로 필요한 명령을 다 수행했을 경우 자동으로 종료된다. 내부에 명령이 없기 때문에 자동으로 종료되었다.
COPY 파일 복사(이동)COPY 명령어는 호스트 컴퓨터에 있는 파일을 복사해서 컨테이너로 전달한다.
COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [컨테이너에서 파일이 위치할 경로]
# COPY app.txt /app.txt
COPY my-folder /my-folder/
/my-folder 형식으로 적으면 안 되고 /my-folder/ 형식으로 입력해야 my-folder 경로에 파일들이 정상적으로 복사된다.디렉터리에 여러 txt 파일을 만들어보자.
current working directory
- tmp.txt
- my_text.txt
- readme.txt
위와 같이 3개의 txt 파일이 있다고 가정하자. 이 모든 파일을 모두 COPY 하고자 한다면 와일드 카드 문법을 사용해 한번에 이동시킬 수 있다.
COPY *.txt /my_text_files/
txt 확장자를 가진 모든 파일들은 my_text_files 폴더로 이동된다.
.dockerignore 사용하기특정 파일 또는 폴더만 COPY 하고 싶지 않을 수도 있다. 그럴 때 .dockerignore를 사용한다.
.dockerignore 파일 만들기.dockerignore
readme.txt
COPY *.txt /my_text_files/
txt 확장자 파일 전부를 이동하는 명령어를 입력하고 실행한다.
이동된 파일을 살펴보면 readme.md 파일은 .dockerignore에 의해서 이동되지 않았음을 확인할 수 있다.
ENTRYPOINT 컨테이너가 시잘될 때 실행되는 명령어ENTRYPOINT는 컨테이너가 실행되고 최초로 실행되는 명령어를 의미한다.
ENTRYPOINT [명령문...]
FROM ubuntu
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
위와 같은 Dockerfile을 만들고 이미지 생성, 컨테이너를 실행시킨다.
docker build -t my-server .
docker run -d my-server
docker ps -a
docker logs [Container ID]
컨테이너는 종료되었지만 로그를 확인하면 hello 문자열을 확인할 수 있다.
RUN 이미지를 생성하는 과정에서 사용할 명령문 실행RUN은 이미지 생성 과정에서 명령어를 실행시켜야 할 때 사용한다.
RUN [명령문]
# RUN npm install
RUN 과 ENTRYPOINT?RUN 명령어와 ENTRYPOINT 명령어는 비슷한 동작을 수행하기 때문에 헷갈릴 때가 있다.
RUN : 이미지 생성 과정에서 필요한 명령어를 실행한다.ENTRYPOINT : 생성된 이미지를 기반으로 컨테이너를 생성한 직후에 명령어를 실행시킬 때 사용한다.미니 컴퓨터 환경이 ubuntu로 되어있고, git이 설치되어있으면 좋겠다고 가정해보자. 이런 환경을 구성하기 위해 Dockerfile을 활용해 ubuntu, git이 설치된 이미지를 만들면 된다.
FROM ubuntu
RUN apt update && apt install -y git
ENTRYPOINT ["/bin/bash", "-c", "sleep 500"]
docker build -t my-server .
docker run -d my-server
docker exec -it [컨테이너 id] bash
git -v # 컨테이너 내부에 git이 설치되었는지 확인
WORKDIR 작업 디렉토리 지정WORKDIR명령어로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행된다. 작업 디렉터리를 굳이 지정해주는 이유는 컨테이너 내부의 폴더를 깔끔하게 관리하기 위해서이다. 컨테이너도 작은 컴퓨터와 같기 때문에 Dockerfile을 통해 생성되는 파일들을 특정 폴더에 정리해두는 것이 추후에 관리가 쉽다.
WORKDIR [작업 디렉터리로 사용할 절대 경로]
# WORKDIR /usr/src/app