Docker의 Dockerfile과 빌드

도커파일(dockerfile)이란?

컨테이너에 설치해야하는 패키지와 소스코드 명령어와 환경변수등을 기록한 하나의 파일이다

이를 빌드하면 이미지가 생성된다

예를 들면 기존에 도커허브에서 ubuntu이미지를 받아서 그것으로 바로 컨테이너를 생성해서 실행한후

알맞는 패키지등을 추가하고 환경변수등을 기록했다면 (apt-get install등..)

도커파일을 이용하면 도커허브에서 받은 ubuntu이미지에 내가 원하는 패키지 설치와 환경변수등을 전부 커스텀한 후 새로운 이미지로 생성가능하다

기존 : 도커허브 -> 이미지다운로드 -> 이미지로부터 컨테이너 생성 -> 컨테이너실행 -> 패키지설치 및 환경설정등

도커파일사용시 : 도커허브 -> 이미지다운로드 -> 패키지설치 및 환경설정 -> 빌드 후 커스텀 이미지 생성 -> 이미지로 부터 컨테이너 생성 -> 컨테이너 실행

도커파일 예제

  1. 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 명령으로 이미지 빌드를 마칩니다.

  1. 작성한 dockerfile빌드해서 이미지 생성

    • -t 는 생성될 이미지의 이름을 설정

    • 도커파일의 경로는 현재 작업 폴더 기준이면 ./

    docker build -t <빌드후 생성할 이미지명> <dockerfile의 경로>

    docker build -t mybuild:0.0 ./
  1. 생성한 docker image확인

    docker images 입력후 생성된 이미지 확인

  2. 컨테이너 생성 및 실행

    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

Apr 30, 2023 Views 148