도커파일(dockerfile)이란?
컨테이너에 설치해야하는 패키지와 소스코드 명령어와 환경변수등을 기록한 하나의 파일이다
이를 빌드하면 이미지가 생성된다
예를 들면 기존에 도커허브에서 ubuntu이미지를 받아서 그것으로 바로 컨테이너를 생성해서 실행한후
알맞는 패키지등을 추가하고 환경변수등을 기록했다면 (apt-get install등..)
도커파일을 이용하면 도커허브에서 받은 ubuntu이미지에 내가 원하는 패키지 설치와 환경변수등을 전부 커스텀한 후 새로운 이미지로 생성가능하다
기존 : 도커허브 -> 이미지다운로드 -> 이미지로부터 컨테이너 생성 -> 컨테이너실행 -> 패키지설치 및 환경설정등
도커파일사용시 : 도커허브 -> 이미지다운로드 -> 패키지설치 및 환경설정 -> 빌드 후 커스텀 이미지 생성 -> 이미지로 부터 컨테이너 생성 -> 컨테이너 실행
도커파일 예제
dockerfile 작성
ubuntu 이미지를 사용해서 apache환경을 만드는 이미지를 작성하는 예제
vscode의 docker확장 도구를 사용하면 쉽게 작성 가능
# 1. 우분투 설치 // 해당 이미지를 도커허브에서 pull한다 FROM ubuntu:18.04 # 2. 메타데이터 표시 LABEL "purpose"="practice" # 3. 업데이트 및 아파치 설치 // 이미지를 빌드할때 최초에 한번만 실행됨 RUN apt-get update RUN apt-get install apache2 -y # 4. 호스트에 있는 파일을 추가 // 로컬(호스트pc)의 test.html파일을 도커내부의 /var/www/html에 추가 ADD test.html /var/www/html # 5. 작업공간 이동(=cd) WORKDIR /var/www/html # 6. 거기서 test2.html 파일생성 RUN ["/bin/bash", "-c", "echo hello > test2.html"] # 7. 포트 80번 노출 지정 EXPOSE 80 # 8. 컨테이너 생성시 시작명령어 // 컨테이너가 시작되는 시점마다 실행됨 CMD apachectl -DFOREGROUND
도커파일의 명령어
FROM : 생성할 이미지의 베이스가 될 이미지를 뜻합니다. 반드시 한번 이상 입력해야 합니다. LABEL : 이미지에 메타데이터를 추가합니다. (나중에 원하는 조건의 컨테이너, 이미지 등을 쉽게 찾을 수 있도록 도와주기 때문에 기억해두는게 좋습니다) RUN : 이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행합니다. (여기서 주의할 점은 설치과정에서 별도의 입력이 불가능하기 때문에 apache2를 설치할 때 뒤에 -y를 붙여줘야 합니다. // 이미지를 빌드할때 최초에 한번만 실행됨 ADD : 파일을 이미지에 추가합니다. 여기서는 현재작업중인 폴더에 test.html 파일을 가져와서 이미지의 /var/www/html 디렉터리에 추가합니다. // 현재 로컬(호스트)에서 작업중이 파일을 컨테이너에 추가한다 WORKDIR : 명령어를 실행할 디렉토리. 배시 셸에서의 cd 명령어와 동일한 기능을 합니다. EXPOSE: 이미지에서 노출할 포트를 설정합니다. CMD : 컨테이너가 시작될 때마다 실행할 명령어. Dockerfile에서 한번만 사용할 수 있습니다. // 컨테이너가 시작되는 시점마다 실행됨 부가적으로 RUN ["/bin/bash", "-c", "echo hello > test2.html"] => /bin/bash 셸을 이용해 echo hello > test2.html를 실행하라는 뜻입니다.
도커파일 예제 파일의 해석
ubuntu18:04를 이용해 컨테이너를 생성합니다. 그리고 그 안에서 apt-get update를 하고 아파치를 설치합니다. 로컬(호스트pc)에 있는 test.html을 /var/www/html에 추가한다음, 그 폴더로 이동한 후에 test2.html을 생성합니다. 마지막으로 80번 포트를 노출시킬 포트로 설정한 다음 CMD 명령으로 이미지 빌드를 마칩니다.
작성한 dockerfile빌드해서 이미지 생성
-t 는 생성될 이미지의 이름을 설정
도커파일의 경로는 현재 작업 폴더 기준이면 ./
docker build -t <빌드후 생성할 이미지명> <dockerfile의 경로>
docker build -t mybuild:0.0 ./
생성한 docker image확인
docker images 입력후 생성된 이미지 확인
컨테이너 생성 및 실행
docker run -d -p 80:80 --name myserver mybuild:0.0
기타 dockerfile 명령어
1.ENV
환경변수를 설정할 수 있습니다.
// ENV test /home
// export test=/home이랑 같은 의미...
2.VOLUME
호스트와 공유할 컨테이너 내부의 디렉터리 설정
// VOLUME /home/volumn
3.ARG
build 명령어를 실행할때 추가로 입력받아 도커파일 내에서 사용될 변수의 값을 설정
4. USER
USER로 컨테이너 내에서 사용될 사용자 계정의 이름이나 UID를 설정하면 그 아래 명령어는 해당 사용자 권한으로 실행되도록 설정(권장)
5.ADD와 COPY
ADD와 COPY는 기능적으로 같은역할로써 이미지에 파일을 복사해줍니다. 다만 차이점은 COPY은 로컬의 파일만 이미지에 추가할 수 있지만, ADD는 URL 및 tar 파일에서도 파일을 추가할 수 있습니다. (권장되는 방법은 COPY라고 하는군요)
host.docker.internal이란?
host.docker.internal은 Docker Desktop에서 제공하는 특별한 DNS 이름입니다. 이 이름은 호스트 시스템(호스트 OS)의 IP 주소를 가리키며, 컨테이너 내부에서 호스트 시스템에 접근할 때 사용됩니다.
예를 들어, Docker 컨테이너에서 로컬 호스트의 웹 서버에 접근하려면 일반적으로 localhost나 127.0.0.1을 사용할 수 없습니다. 이 경우 host.docker.internal을 사용하여 호스트 시스템에 접근할 수 있습니다.
host.docker.internal은 Windows, macOS 및 Linux에서 모두 작동합니다. 다만, Docker가 설치되어 있지 않은 호스트 시스템에서는 사용할 수 없습니다.
즉 컨테이너에서 호스트PC(로컬PC)를 가리키는 DNS명 (컨테이너 -> 로컬pc )
참조
https://velog.io/@ckstn0777/%EB%8F%84%EC%BB%A4%ED%8C%8C%EC%9D%BCDockerfile