RUN 

Dockerfile에서 리눅스의 명령어를 실행하고 싶을 때 사용한다.

 

실습1. Dockerfile 작성

  1 FROM ubuntu
  2
  3 RUN apt-get update
  4 RUN apt-get install -y nginx
  5
  6 WORKDIR /var/www/html
  7
  8 COPY ./webapp/index.html ./index.nginx-debian.html
  9
 10 ENTRYPOINT ["nginx", "-g", "daemon off;"]

 

RUN 명령어 실습을 위한 Dockerfile 작성

 

FROM ubuntu

다른 실습과 다르게 ubuntu를 base로 해서 처음부터 설치하는 방식으로 실습하는게 특징. (RUN명령어 실습을 위해서 그러신듯)

 

RUN apt-get update

RUN apt-get install -y nginx

컨테이너 실행될 때 리눅스 명령어를 실행하는 것이다.

 

 

WORKDIR

작업 디렉토리를 파라미터로 넘겨받은 경로로 설정한다. 

COPY, BASH 같은 명령어도 모두 해당 경로부터 시작된다.

 

 

COPY

HOST내용물을 CONTAINER로 복사한다.

(호스트)./webapp/index.html →  (컨테이너) /var/www/html/index.nginx-debian.html 로 복사한다.

 

 

ENTRYPOINT : 컨테이너가 실행될 때 무조건 실행되는 명령어

(ENTRYPOINT는 CMD로 대체가능하다고 하심.)

 

ENTRYPOINT에 쓰인 daemon off;는 중요하다! 백그라운드로 실행하지말고 포그라운드로 실행하라는 의미인데 nginx를 백그라운드로 실행하면 컨테이너가 실행하자마자 죽어버린다고 함. (더 이상 실행할 명령어가 없다고 판단하고...) nginx command인 "nginx -g 'daemon off;'" 가 COMMAND로 떠있어야 죽지않음!

 

실습2. 빌드하기 및 확인하기

작성된 Dockerfile을 기반으로 image를 빌드하자.

docker build -t nginx-server:2.0 ./

docker build -t [생성할이미지명][생성할태그] [Dockerfile 위치] 

 

빌드가 다되었다면 이미지가 생성되었는지 확인하자.

docker images

 

실습3. 빌드된 이미지 실행하기

docker run -d -p 8080:80 nginx-server:2.0

결과확인

1. Dockerfile 작성

FROM openjdk:11-jdk-slim
WORKDIR /app 
COPY build/aws-v3-0.0.3.jar ./application.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "application.jar"]
#CMD ["--server.port=8080"]

 

WORKDIR 

  • 모든 작업이 해당 디렉토리에서 진행되도록 처음 시작 디렉토리를 지정.
  • 사용자가 터미널로 접근 했을 때도 /app 디렉토리로 바로 접근된다. (docker attach, docer exec -it ~ bash)
  • COPY와 같이 상대경로로 설정되어있다면 처음 시작지점이 WORKDIR에서 지정한 폴더가 된다.
    (  ./application.jar === /app/application.jar)

COPY (vs ADD)

  • build/aws-v3.0.0.3.jar를 복사하는데 파일명은 application.jar로 변경
  • ADD와의 차이점 : ADD는 압축도 풀린다고함. ADD 압축파일.zip ./ #이렇게 하면 압축풀림

ENTRYPOINT

  • 명령어를 실행해주는 것.
  • CMD와 비슷하다.
  • 파라미터로 넘겨받은 것들을 합쳐서 컨테이너 실행 시 실행시켜 준다.
  • Dockerfile을 빌드해서 컨테이너가 실행되면 java -jar -Dspring.profiles.active=dev application.jar 명령어가 자동으로 실행된다. (물론 /app 디렉토리에서)

ENTRYPOINT vs CMD

  • ENTRYPOINT는 컨테이너가 실행될 때 무조건 실행되는 명령어
  • CMD도 컨테이너가 실행될 때 실행되는 명령어 이지만 외부의 값에 따라서 대체가 가능하다. (옵셔널) CMD는 ENTRYPOINT의 파라미터로 넘겨지기도 한다.
CMD ["--server.port=3000"]

이렇게 해놓아도

docker run -d -p 9097:5000 java-server --server.port=5000

컨테이너를 실행할 때 위와 같이 실행시키면 --server.port=5000 으로 실행된다. (Dockerfile에 있는 CMD 대체)

 

정리하자면 무조건 대체제없이 실행되어야할 것들은 ENTRYPOINT로 실행하면될거같고, 내가 run할 때마다 바꿀수도있는 값은 CMD로 설정해두면 될거같다.

 

2. 실습에 필요한 jar 파일 다운로드

https://github.com/codingspecialist/aws-v3/tree/release

 

GitHub - codingspecialist/aws-v3: elastic bean stalk

elastic bean stalk. Contribute to codingspecialist/aws-v3 development by creating an account on GitHub.

github.com

spring project가 jar로 압축되어있는 파일이다.

해당 파일을 build디렉토리에 넣어주자. (Dockerfile에 COPY build/aws-v3.0.0.3.jar 로 해놨으니까.)

2. Dockerfile build

docker build -t java-server:1.0 ./

docker build -t [생성할이미지명][생성할태그] [Dockerfile 위치] 

3. Docker image확인

docker images

빌드 결과가 제대로 생성되었는지 이미지를 확인해주자.

 

4. 컨테이너 실행

docker run -d -p 9097:8081 java-server:1.0

 

현재는 Dockerfile의 CMD 명령어가 없어서 spring.profiles.active=dev가 실행되어 8081이 기본포트로 잡힌다.

(ENTRYPOINT로 -Dspring.profiles.active=dev 를 설정하였기 때문에.)

 

만약에 Dockerfile에 CMD를 추가한다면?

FROM openjdk:11-jdk-slim
WORKDIR /app 
COPY build/aws-v3-0.0.3.jar ./application.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "application.jar"]
CMD ["--server.port=8080"]

이렇게 되면 8080 포트가 잡힌다. java -jar -Dspring.profiles.active=dev application.jar --server.port=8080 이라는 명령어가 실행된 것과 같기 때문에.

 

근데 Dockerfile에도 추가하고 run 옵션으로도 추가하면? run옵션으로 추가한 것이 Dockerfile의 CMD 명령어를 대체한다.

docker run -d -p 9097:8800 java-server:1.0 --server.port=8800

이렇게 되면 spring의 내장 tomcat은 8800으로 실행된다.

 

5. 컨테이너 로그 확인

컨테이너 내부의 로그를 보기 위해서는 아래와 같은 명령어로 확인한다.

docker logs [CONTAINER ID]

Dockerfile

도커이미지를 작성할 때 어떤 스크립트를 실행시키는 것을 dockerfile 이라고 한다.

 

Dockerfile 작성하기

vi에디터로 아래와 같이 작성 (파일이름을 Dockerfile로 저장해야한다.)

FROM httpd
COPY ./webapp /usr/local/apache2/htdocs
CMD ["httpd-foreground"]

FROM : 기본이 될 이미지를 지정해준다.

COPY : 복사명령어 (./webapp 디렉토리내용을 /usr/local/apache2/htdocs 에 복사하라는 의미 )

CMD : 실행할 명령어 (httpd를 실행시킨다.) → Dockerfile에서 한번만 작성할 수 있다. (여러 개의 CMD를 입력하면 맨 마지막 CMD만 유효하다.)

 

※ COPY와 -v (volume)의 차이

  • COPY는 Dockerfile에서 사용 / -v는 run 옵션 중 하나이다.
  • COPY는 복사이고 -v는 링크를 거는 것이기 때문에 COPY된 파일을 수정해도 원본은 수정되지 않지만 -v 로 지정된 파일을 컨테이너에서 수정하면 원본인 HOST에 있는 파일이 수정된다.

Dockerfile 빌드하기

docker build -t [생성할이미지명]:[태그명] [dockerfile위치]
docker build -t webserver ./

도커파일을 빌드하는 것은 이전 시간에 한 docker commit과 비슷한데 docker build의 경우 Dockerfile을 가지고 이미지를 만드는 차이가 있다고함.

 

두 번째 파라미터로 경로만 넘겨준다면 "Dockerfile" 이름을 가진 파일을 알아서 찾아서 빌드해준다고 함. 

(만약 Dockerfile이 Dockerfile 이름으로 저장되어 있지 않다면 -f 옵션으로 도커파일명 을 명시해주어야한다.)

docker build -t sample -f Dockerfile-base ./

 

Dockerfile 빌드한 이미지 확인하기

docker images

빌드결과가 이미지로 제대로 반영되었는지 확인한다.

+ Recent posts