콘텐츠로 이동

2024 09 18

2024-09-18

Dockerfile 만들기

참고: https://blog.naver.com/PostView.naver?blogId=cksgurwkd12&logNo=223586345785&parentCategoryNo=&categoryNo=44&viewDate=&isShowPopularPosts=false&from=postList

FROM openjdk:17-oracle
 ✘ joelonsw  ~/Desktop/TIL/2024-09/docker-learn   master ±✚  docker inspect joel-jdk17:latest
[
    {
        "Id": "sha256:2792c873aaf92da2c9da02fa233e714333006f158312f0d84f86f1b05d9f1a5e",
        "RepoTags": [
            "joel-jdk17:latest"
        ],
        "RepoDigests": [],
        "Parent": "",
        "Comment": "",
        "Created": "2022-04-27T23:29:54.241265971Z",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": null,
            "Cmd": null,
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "DockerVersion": "",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/java/openjdk-17/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "JAVA_HOME=/usr/java/openjdk-17",
                "LANG=C.UTF-8",
                "JAVA_VERSION=17.0.2"
            ],
            "Cmd": [
                "jshell"
            ],
            "Image": "",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "arm64",
        "Variant": "v8",
        "Os": "linux",
        "Size": 501295850,
        "VirtualSize": 501295850,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/0fdaeb093099c0fdfe76f79e39bcb9ee4d36b9aee5620f074fbf4aeb3c81b09b/diff:/var/lib/docker/overlay2/988f61c4765aef97beabe911dee4694d4e418df89d122861a1b677e8bda4311d/diff",
                "MergedDir": "/var/lib/docker/overlay2/1cb721dc0c3721f37e5001c85b65133ba6cbed91c447cd08e7aa7e2a3af1ced0/merged",
                "UpperDir": "/var/lib/docker/overlay2/1cb721dc0c3721f37e5001c85b65133ba6cbed91c447cd08e7aa7e2a3af1ced0/diff",
                "WorkDir": "/var/lib/docker/overlay2/1cb721dc0c3721f37e5001c85b65133ba6cbed91c447cd08e7aa7e2a3af1ced0/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:b0d4c4485e7e7fdd7cb6a595a4845c47e39fdfac598fde0fbd8f327423ceb5a0",
                "sha256:03ee828ef0e49649de4f809d41b8cb2c29e193269f809d3de2a5b6021bc44cec",
                "sha256:e017d39c755a5133aebbe26075334984cb9a3e18ff9a6790123072fd1f2d3c53"
            ]
        },
        "Metadata": {
            "LastTagTime": "2024-09-18T06:15:53.757736095Z"
        }
    }
]

  • ENTRYPOINT : 실행 이후 첫빠따로 돌아갈 명령어
    • 이미지 기반으로 생성된 컨테이너 실행 이후, 실행될 기본 명령어 지정
  • RUN : 이미지 생성 과정에서 생기는 명령어
    • Docker build를 하는 시점에 이미지 생성 과정에서 특정 명령어 수행

라운지용 도커파일

  • Dockerfile에 JDK를 설치하는 과정을 기입했을 때, 매번 Docker build 시 마다 재 설치 되지 않을까 했지만...
    • 이미지 레이어 재사용으로 인해 그러진 않음. 캐싱된 레이어를 그대로 재사용
    • 파일 시스템에 변경이 가해질 때마다 이미지 레이어에 변경이 생김 (늘어감)
  • Dockerfile
    # private 도커 레지스트리에서 rocky8 리눅스 가져오기
    FROM idock.dkao.io/kbase/rocky8:latest
    
    # 프록시 설정
    ## 기업용 네트워크 에서는 이걸 좀 쓰는 이유들이 있음 - 보안, 성능, 접근제어, 익명성
    ## 많은 HTTP/HTTPS 요청에 프록시를 사용할 것
    ### curl, wget 등에 사용, 다만 본인 고유의 프록시 세팅이 있는 어플리케이션은 무시할 수도
    RUN echo 'export http_proxy=http://proxy.joel.io' >> ~/.bashrc
    RUN echo 'export HTTP_PROXY=$http_proxy' >> ~/.bashrc
    RUN echo 'export https_proxy=$http_proxy' >> ~/.bashrc
    RUN echo 'export HTTPS_PROXY=$http_proxy' >> ~/.bashrc
    
    # 프록시 요청에서 제외할 도메인 설정
    RUN echo 'expo no_proxy="localhost, 127.0.0.1, 127.0.0.0/8, 192.168.0.0/16"' >> ~/.bashrc
    RUN echo 'export NO_PROXY=$no_proxy' >> ~/.bashrc
    
    # 필요한 패키지 설치
    RUN yum install gcc glibc glibc-common openssl wget unzip -y
    
    # Java 설치
    WORKDIR /usr/java
    RUN wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.24%2B8/OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz
    RUN tar zvxf OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz
    RUN rm -f OpenJDK11U-jdk_x64_linux_hotspot_11.0.24_8.tar.gz
    
    # 심볼릭 링크
    ## /usr/java/jdk11 -> usr/java/jdk-11.0.24+8
    ## usr/java/default -> /usr/java/jdk11
    RUN ln -s /usr/java/jdk-11.0.24+8 jdk11
    RUN ln -s /usr/java/jdk11 /usr/java/default
    
    # 환경 변수
    ## JAVA_HOME -> /usr/java/default
    ## PATH -> JAVA_HOME/bin
    ENV JAVA_HOME=/usr/java/default
    ENV PATH=$PATH:$JAVA_HOME/bin
    
    # SBT 설치
    WORKDIR /usr/local
    RUN wget https://github.com/sbt/sbt/releases/download/v1.3.13/sbt-1.3.13.zip
    RUN unzip -q sbt-1.3.13.zip;
    RUN mkdir /usr/local/src/sbt && cp -R -f /usr/local/src/sbt /usr/local/sbt-1.3.13;
    RUN ln -s /usr/local/sbt-1.3.13 /usr/local/sbt;
    RUN ln -s /usr/local/sbt/bin/sbt /usr/local/bin/sbt;
    
    # NODE 설치
    WORKDIR /opt
    RUN wget https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz
    RUN tar xvf node-v16.13.0-linux-x64.tar.xz
    RUN rm -f node-v16.13.0-linux-x64.tar.xz
    RUN ln -s /opt/node-v16.13.0-linux-x64/bin/node /usr/bin/
    RUN ln -s /opt/node-v16.13.0-linux-x64/lib/node_modules/npm/bin/npm-cli.js /usr/bin/npm
    ENV PATH=$PATH:/opt/node-v16.13.0-linux-x64/bin
    RUN npm install -g ncp
    RUN npm install -g rimraf
    

SpringBoot 테스트용 도커파일

# 경량화된 베이스 이미지
FROM apline:latest
# 필수 패키지 업데이트/설치
RUN apk update && apk add --no-cache bash curl
# OpenJDK 17 설치
RUN apk add --no-cache openjdk17
# 작업 디렉토리 설정
WORKDIR /app
# Jar 복사
COPY build/libs/test-0.0.1-SNAPSHOT.jar /app/app.jar
# Java 환경변수(이런건 하나하나 배시 들어가서 쳐도 될듯)
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk
ENV PATH="$JAVA_HOME/bin:${PATH}"
# SpringBoot 사용할 포트 노출
EXPOSE 8080
# SpringBoot app 실행
ENTRYPOINT ["java", "-jar", "/app/app.jar"]