Docker는 코드를 컨테이너에 패키징한 다음 실행하는 사실상의 표준 방법이 되었습니다. 이번 LAB 에서는 JIB를 사용하여 마이크로서비스를 도커 컨테이너에 패키징하여 코드에서 구성을 분리하고 컨테이너를 실행하고 저장소로 푸시하는 방법을 보여줍니다.
Task1: Jib - Docker 이미지 빌드 툴 Git
이 예제는 Java 11 Oracle GraalVM Community Edition Docker 이미지를 컨테이너의 기본 이미지로 사용할 것입니다. 더 나은 Just In Time 컴파일 성능과 가비지 수집을 제공하는 OpenJDK 대신 Graal을 사용하기로 결정했습니다. 서버 환경에서 실행할 때 둘 다 시작 오버헤드를 줄이고 호출자에게 보다 예측 가능한 응답을 만들기 때문에 중요합니다. Graal JVM은 다른 언어에 대한 지원도 허용하지만 이 랩에서는 해당 기능을 사용하지 않습니다. Java 11이므로 Java의 장기 지원 버전이기도 합니다. 물론 Graal JVM 대신 원하는 경우 다른 옵션이 있습니다.
도커 이미지를 빌드하기 위해 jib를 사용할 수 있습니다. Maven pom.xml 파일에는 jib 도구 및 설정에 대한 세부 정보가 포함되어 있습니다.
1. 프로젝트를 열고 최상위 레벨의 pom.xml 파일을 여십시오.
pom.xml 설정으로 사용할 기본 이미지를 포함하여 jib에 필요한 것을 정의합니다.
2. jib-maven-plugin 종속성을 찾습니다. Ctrl-F를 사용하여 Eclipse 검색 창을 불러오고 jib-maven-plugin을 검색할 수 있습니다.
베이스 이미지 사이즈:
기본 이미지에는 명령줄과 함께 기본 이미지를 사용하는 전체 명령줄 환경이 포함되어 있어 도커 이미지를 엄격하게 말해서 필요한 것보다 크게 만듭니다. 물론 원한다면 다른 Java 기본 이미지를 사용할 수도 있습니다. 사용할 수 있는 가능한 도커 기본 이미지가 많이 있지만(이 중 일부는 pom.xml 파일의 JIB 섹션에 나열되어 있음) 이 이미지의 명령줄 도구를 사용하면 이미지에 연결하고 다음과 같이 내부적으로 무슨 일이 일어나는지 볼 수 있습니다. 뿐만 아니라 명령을 수행합니다.
프로덕션 환경에서는 컨테이너 내부에서 작업할 필요가 없기 때문에 Java 11 기본 이미지의 축소 버전이 사용됩니다. 또한 기본 컴파일 기능이 있는 Graal 엔터프라이즈 버전을 사용하여 설치 공간이 더 작은 단일 실행 파일을 생성하는 것이 좋습니다
Task2: 구성 및 기타 변경 항목 처리
자체 포함된 이미지:
처음에는 도커 이미지를 생성할 때 가장 쉬운 방법이 모든 구성을 도커 이미지에 패키징하여 완전히 독립적으로 만드는 것이라고 생각할 수 있습니다. 하지만 문제는가 있습니다. 예를 들어 테스트와 배포 사이에 이미지가 빌드된 후 구성 정보가 자주 변경되고 각 구성에 대해 서로 다른 이미지를 만드는 것이 어렵다는 것입니다(다양한 구성 옵션이 있을 수 있으며 모두 정의하기 위해) 더 나쁜 것은 데이터베이스 액세스 또는 기타 보안 구성 정보와 같은 것을 도커 이미지에 포함시키는 결과를 초래할 수 있습니다. 후자는 누구라도 액세스할 수 있는 외부 또는 공개 저장소에 이미지를 저장하는 경우 특히 중요합니다.
Task 2a): 구성의 외부화
다음은 구성에서 실행 파일을 분리할 때 취한 접근 방식의 예입니다.
먼저 필요한 실행 요소가 포함된 도커 이미지를 만들어야 합니다. Maven 플러그인인 jib(Java Image Builder)를 사용하여 이를 지원하는 도구를 실제로 설정했습니다. 이 사실을 깨닫지 못했을 수도 있지만 이미 Maven을 사용하여 종속성을 관리하고 있습니다.
Maven 패키지 대상(mvn 패키지)을 사용하여 jib를 트리거하여 로컬 레지스트리에 도커 컨테이너를 생성합니다.
- storefront 프로젝트의 디렉토리 터미널로 이동 합니다.
- maven 을 실행합니다.
- mvn package
[MVNVM] Using maven: 3.5.2
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Detecting the operating system and CPU architecture
[INFO] ------------------------------------------------------------------------
[INFO] os.detected.name: osx
[INFO] os.detected.arch: x86_64
[INFO] os.detected.version: 10.15
[INFO] os.detected.version.major: 10
[INFO] os.detected.version.minor: 15
[INFO] os.detected.classifier: osx-x86_64
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building storefront 2.0.1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ storefront ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 3 resources
...
...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.595 s
[INFO] Finished at: 2020-08-17T19:02:38+01:00
[INFO] Final Memory: 41M/200M
[INFO] ------------------------------------------------------------------------
노트: Maven과 docker가 많은 것을 다운로드해야 하는 경우 특히 시간이 조금 걸릴 수 있습니다.(다운로드한 내용을 캐시하므로 실행 속도가 상당히 빨라집니다.)
이 작업은 로컬에 저장된 두 개의 도커 이미지를 생성합니다. mvn 패키지는 pom.xml 파일의 jib 섹션에 있는 속성을 기반으로 도커 이미지를 빌드하는 jib를 실행하도록 트리거합니다.
jib 도구는 pom.xml 파일을 사용하여 복사할 종속성을 알기 때문에 수동으로 도커 이미지를 만드는 것보다 많은 이점이 있으므로 종속성에 대한 변경 사항은 jib가 실행될 때 자동으로 처리됩니다.
jib는 Helidon이 필요로 하는 대로 모든 파일을 올바른 위치에 복사하지 않으므로 helidon에 대해 작동하는 도커 이미지를 얻기 위해 수행해야 할 두 번째 단계가 있습니다. 이것은 jib에 의해 생성된 이미지에 대해 도커 빌드를 실행하고, Dockerfile은 컨테이너 이미지의 파일을 리소스에서 클래스 디렉토리로 복사한 다음 원본을 제거하여 예상한 위치에 모든 것을 포함하는 도커 컨테이너를 생성합니다.
mvn 패키지를 사용하여 기본 이미지를 생성했으면 helidon-labs-stockmanager 디렉토리에서 docker 명령을 사용하여 올바른 위치에 있는 파일로 새 이미지를 수동으로 생성할 수 있습니다.
- 도커빌드를 합니다.
- docker build --tag stockmanager --file Dockerfile .
Sending build context to Docker daemon 229.4kB
Step 1/3 : FROM jib-stockmanager:latest
---> 21ff68d7abaf
Step 2/3 : RUN cp -r /app/resources/* /app/classes
---> Running in 530a1de6f032
Removing intermediate container 530a1de6f032
---> 507b37292b2f
Step 3/3 : RUN rm -rf /app/resources
---> Running in 0f5275ae4108
Removing intermediate container 0f5275ae4108
---> 47d8ca5574a1
Successfully built 47d8ca5574a1
Successfully tagged stockmanager:latest
--tag 플래그는 결과 도커 이미지에 stockmanager라는 태그가 지정됨을 의미하며, 이후에 해시코드(예: 2655bfee0d99)와 같은 이미지 ID가 아니라 이름을 사용하여 참조할 수 있으며 기억하기 훨씬 어렵습니다.
--file 플래그는 이미지를 빌드하기 위해 실행할 명령이 포함된 파일의 이름을 지정했습니다. Dockerfile이 docker 빌드 명령의 기본값이므로 이 경우에는 엄격히 필요하지 않습니다.
Sending build context to Docker daemon 110.6kB
Step 1/3 : FROM jib-storefront:latest
---> d04bbcb28160
Step 2/3 : RUN cp -r /app/resources/* /app/classes
---> Running in 5849e8889fc4
Removing intermediate container 5849e8889fc4
---> 23e336c810e5
Step 3/3 : RUN rm -rf /app/resources
---> Running in 8c8a4b0fc6ad
Removing intermediate container 8c8a4b0fc6ad
---> 90bd16d9e6bc
Successfully built 90bd16d9e6bc
Successfully tagged storefront:latest
향후 편의를 위해 mvn 빌드 및 적절한 도커 명령을 실행할 helidon-labs-stockmanager 및 helidon-labs-storefront 디렉토리에 buildStockmanagerLocalExternalConfig.sh 및 buildStorefrontLocalExternalConfig.sh 스크립트를 작성하였습니다.
관련 디렉토리 내에서 각 스크립트를 실행해야 합니다(helidon-labs-stockmanager 디렉토리의 buildStockmanagerLocalExternalConfig.sh 및 helidon-labs-storefront 디렉토리의 buildStorefrontLocalExternalConfig.sh).
docker가 적절한 기본 레이어를 다운로드해야 하는 경우 처음에는 스크립트를 실행하는 데 몇 분이 걸릴 수 있지만 일단 다운로드되면 속도가 빨라집니다. 이전 스크립트에서 다운로드한 콘텐츠를 재사용할 수 있으므로 다음 빌드를 시작하기 전에 한 빌드가 완료되도록 하는 것이 가장 좋습니다.
스크립트를 보면 jib를 사용하여 도커 이미지를 생성하기 위해 maven 패키지 프로세스를 실행하는 것을 볼 수 있습니다. 그런 다음 helidon을 실행하는 데 필요한 변경 사항이 포함된 새 도커 이미지를 만듭니다. 이것들은 여러분이 직접 실행했을 명령입니다.
컨테이너를 실행하여 셸 액세스 권한을 부여하여 컨테이너를 탐색할 수 있습니다(이것이 우리가 셸 및 기타 Unix 유틸리티를 포함하는 더 큰 도커 기본 이미지를 사용한 이유입니다. 프로덕션 환경에서는 최소 이미지를 사용하게 될 것입니다).
- 아래 명령은 터미널에 연결된 셸을 실행하는 도커 컨테이너를 만듭니다.
- docker run --tty --interactive --rm --entrypoint=/bin/bash stockmanager
- 컨테이너 내부를 살펴보기 위하여 컨테이너 컨터이너 안에서 아래와 같이 명령어를 타이핑하면:
- ls
app conf etc lib64 opt run sys var
bin confsecure home media proc sbin tmp Wallet_ATP
boot dev lib mnt root srv usr
- ls Wallet_ATP
-> 결과가 안나옵니다.
- ls conf
-> 결과가 안나옵니다.
- ls confsecure
-> 결과가 안나옵니다.
- 컨테이너에서 빠져 나옵니다.
- exit
보시다시피 /conf /confsecure 또는 /Wallet_ATP 디렉토리 .jib는 외부 구성을 마운트하는 데 사용된다는 구성의 일부로 알려졌으므로 자동으로 폴더를 생성했습니다.
다음은 도커 볼륨(docker --volume 플래그)을 사용하여 구성을 변경해 보겠습니다. 각 볼륨 인수는 호스트 파일 시스템 이름(절대 경로 이름이어야 함)과 마운트할 컨테이너 내부 위치입니다.
- 컨테이너를 볼륨과 함께 실행 합니다.
docker run --tty --interactive --volume `pwd`/Wallet_ATP:/Wallet_ATP --volume `pwd`/conf:/conf --volume `pwd`/confsecure:/confsecure --rm --entrypoint=/bin/bash stockmanager
이전과 마찬가지로 컨테이너에 있고 루트 디렉터리는 동일하게 보이지만 다른 디렉터리에는 이제 내용이 있습니다.
컨테이너 내부를 다시 한 번 살펴 봅니다.
- 컨테이너 내부를 살펴보기 위하여 컨테이너 컨터이너 안에서 아래와 같이 명령어를 타이핑하면:
- ls
root@bc7d4ae0666b:/# ls
Wallet_ATP app app.yml bin boot conf confsecure dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
- ls conf
root@bc7d4ae0666b:/# ls /conf
stockmanager-config.yaml stockmanager-network.yaml
- ls confsecure
root@bc7d4ae0666b:/# la /confsecure
stockmanager-security.yaml
- ls Wallet_ATP
root@bc7d4ae0666b:/# ls /Wallet_ATP
cwallet.sso ewallet.p12 keystore.jks ojdbc.properties sqlnet.ora tnsnames.ora truststore.jks
- 컨테이너에서 빠져 나옵니다.
- exit
컨테이너에 구성을 추가했지만 이미지에 하드 코딩할 필요는 없습니다. 물론 이것은 디렉토리에 있는 파일의 내용을 변경하면 해당 변경 사항이 컨테이너 내부에 반영된다는 것을 의미합니다.
Task 2b): 데이터베이스 컨피그레시션(설정)
Helidon 실습에서는 Java 시스템 속성을 사용하여 데이터베이스 구성을 지정 하였습니다.
-Djavax.sql.DataSource.stockmanagerDataSource.dataSourceClassName=oracle.jdbc.pool.OracleDataSource
Helidon 구성 시스템의 다양한 수준, 특히 구성 속성이 Java 시스템 속성에서 자동으로 사용될 수 있는 방법을 보여주기 위해 구성 파일 대신 그렇게 했습니다. 아래 내용은 약간의 다른 접근 방식을 보여줄 것입니다. 코드를 변경하지 않고 시스템 환경 변수를 통해 데이터베이스 연결 세부 정보를 가져올 것입니다. 이것은 Helidon이 먼저 Java 시스템 속성을 확인한 다음 보기 때문에 작동합니다. OS 환경 변수에서 자동으로 새 위치에서 값을 선택합니다(둘 다 사용하면 Java 시스템 속성이 환경 변수를 재정의함) 기본적으로 우리는 Helidon 구성 시스템이 얼마나 유연한지 보여주려고 합니다.
이미 제공된 데이터베이스를 사용하는 경우 데이터베이스 연결 값을 제공하거나 이미 가상 머신에 설정했을 수 있습니다. 자신의 데이터베이스를 설정했다면 사용자 이름과 비밀번호를 지정했을 것입니다(예를 들어 HelidonLabs의 사용자 이름과 H3lid0n_Labs의 비밀번호가 사용되는 경우) 연결 이름을 얻을 월렛 파일을 다운로드했습니다. (예 tg_high)
Docker는 이를 수행하는 여러 가지 방법을 제공합니다. 예를 들어 --env 플래그를 사용하여 명령줄에서 각 개별 변수를 지정할 수 있고, 다른 방법은 --env-file 플래그를 사용하는 것입니다. 이렇게 하면 키가 가득 찬 파일을 지정할 수 있습니다. /value 쌍(예: Java 속성 파일) 및 설정할 변수가 여러 개인 경우 또는 변수 또는 해당 이름에 와 같은 문자가 포함된 경우 이것은 명령 셸에 특별한 의미가 있는 가장 쉬운 방법입니다.
이 실습에서 stockmanager를 실행할 스크립트는 --env-file 접근 방식을 사용하므로 파일이 데이터베이스 연결 세부 정보를 반영하는지 확인해야 합니다.
- 터미널에서 stockmanager 프로젝트 디렉토리로 이동 합니다.
- database-env 파일을 수정합니다.
javax.sql.DataSource.stockmanagerDataSource.dataSourceClassName=oracle.jdbc.pool.OracleDataSource
javax.sql.DataSource.stockmanagerDataSource.dataSource.url=jdbc:oracle:thin:@?TNS_ADMIN=./Wallet_ATP
javax.sql.DataSource.stockmanagerDataSource.dataSource.user=HelidonLabs
javax.sql.DataSource.stockmanagerDataSource.dataSource.password=H3lid0n_Labs
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.hbm2ddl.auto=update
javax.sql.DataSource.stockmanagerDataSource.dataSource.url을 시작하는 라인에서 <database connection name>을 상위 연결의 이름으로 바꿔야 합니다. tg_high 당신의 연결 이름은 다를 것입니다.
- 다른 사용자 이름과 암호를 사용하여 데이터베이스 사용자를 만든 경우 해당 사용자도 바꿔야 합니다.
- 변경 된 내용을 저장합니다.
환경 변수가 올바르게 설정되었는지 확인하려면 helidon-labs-stockmanager 프로젝트에서 runBashContainer.sh 스크립트를 사용하십시오. 이것은 기본적으로 환경 변수와 볼륨을 사용하여 위의 docker run 명령을 수행합니다.
Run the container with the configuration attached:
- bash runBashContainer.sh
executing in /Users/tg13456/Development/helidon-kubernetes-labs/helidon-labs-stockmanager
zipkin ip 172.17.0.2
bash-4.2#
- 컨테이너에서 환경을 살펴봅니다.
- printenv | sort
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.hbm2ddl.auto=update
HOME=/root
HOSTNAME=cb3784c88b1f
JAVA_HOME=/opt/graalvm-ce-java11-20.1.0/
javax.sql.DataSource.stockmanagerDataSource.dataSourceClassName=oracle.jdbc.pool.OracleDataSource
javax.sql.DataSource.stockmanagerDataSource.dataSource.password=H3lid0n_Labs
javax.sql.DataSource.stockmanagerDataSource.dataSource.url=jdbc:oracle:thin:@tg_high?TNS_ADMIN=./Wallet_ATP
javax.sql.DataSource.stockmanagerDataSource.dataSource.user=HelidonLabs
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
TERM=xterm
_=/usr/bin/printenv
설정한 환경 변수를 확인할 수 있습니다.
- 컨테이너에서 빠져 나옵니다.
- exit
'2. 기본 인프라 IaaS' 카테고리의 다른 글
OCI 기본개념 이해하기 (0) | 2022.05.16 |
---|---|
오라클 클라우드 오브젝트 스토리지 활용 방법 (0) | 2022.04.25 |
Tomcat을 설치하고 ATP와 연동하기 (0) | 2022.04.25 |
스토리지 옵션 Storage option (Block Storage / Object Storage / File Storage) (0) | 2022.03.31 |
Kubernetes Ingress vs. Istio Ingress Gateway (0) | 2022.03.02 |
댓글