개인적으로 공부한 내용이므로 틀린 내용이 존재할 수 있습니다.
오류내용은 댓글을 통해 알려주시길 바랍니다.
indy-node의 dockerfile 분석
하단의 링크에 작성된 node-pool 관련 분석입니다.
dockerfile 분석을 통해 node-pool의 동작 구성을 이해해보고자 합니다.
분석코드(node-pool) - https://github.com/hyperledger/indy-sdk/blob/master/ci/indy-pool.dockerfile
우분투 버전 설정
# ubuntu 버전 작성, 유저id 설정
# uid : 특정 컴퓨터 사용자에게 부여되는 숫자 또는 이름
# ARG : 변수 선언
FROM ubuntu:16.04
ARG uid=1000
기초적인 우분투 버전을 선언하고, uid 유저 아이디를 선언합니다.
환경 설정 1
# git, python 등 실행에 필요한 패키지 설치 및 업데이트 실행
RUN apt-get update -y && apt-get install -y \
git \
wget \
python3.5 \
python3-pip \
python-setuptools \
python3-nacl \
apt-transport-https \
ca-certificates \
supervisor
동작을 위한 패키지 파일들을 설치한다.
동작 중 동의 메시지를 띄우지 않기 위해 -y를 통해 모두 동의를 표시한다.
환경 설정 2
# 파이썬 코드 실행을 위한 pip setup 설정
RUN pip3 install -U \
pip==9.0.3 \
setuptools
작성한 pip 버전과 우분투 환경에 맞도록 설정을 합니다.
apt 인증
#ubuntu 키서버를 통한 키 다운로드
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CE7709D068DB5E88 || \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CE7709D068DB5E88
키 서버에서 키를 신뢰할 수 있는 키목록 모음으로 직접 다운로드.
GNU 프라이버시 가드에 저장된다.
apt로 가져오는 패키지의 인증을 위해 사용.
stream 설정
# 인디의 동작을 master에서 하겠다고 선언
ARG indy_stream=master
# node 동작을 위한 데비안의 소프트웨어 패키지 포맷 파일 저장 위치를 소스 리스트에 추가
RUN echo "deb https://repo.sovrin.org/deb xenial $indy_stream" >> /etc/apt/sources.list
indy_stream에서 설정한 경로의 라이브러리 파일들을 /etc/apt/sources.list에 추가한다.
sources.list : apt가 패키지를 가져 올 수 있는 위치 정보를 담고 있다.
우분투 계정 생성
# ARG uid=1000이라고 지정했었음. uid 추가
RUN useradd -ms /bin/bash -u $uid indy
-ms /bin/bash : 홈폴더 지정 및 쉘 활경 설정
수동설정을 통한 uid기준(-u, 현재 udi는 1000)으로 우분투 유저 추가.
버전 설정
# 각종 버전 지정
ARG indy_plenum_ver=1.12.1~dev989
ARG indy_node_ver=1.12.1~dev1172
ARG python3_indy_crypto_ver=0.4.5
ARG indy_crypto_ver=0.4.5
ARG python3_pyzmq_ver=18.1.0
ARG python3_orderedset_ver=2.0
ARG python3_psutil_ver=5.4.3
ARG python3_pympler_ver=0.5
사용할 프로그램들의 버전을 변수로 지정해준다.
설정에 따른 프로그램 패키지 다운
# 상단에서 지정한 버전대로 업데이트 및 설치
RUN apt-get update -y && apt-get install -y \
python3-pyzmq=${python3_pyzmq_ver} \
indy-plenum=${indy_plenum_ver} \
indy-node=${indy_node_ver} \
python3-indy-crypto=${python3_indy_crypto_ver} \
libindy-crypto=${indy_crypto_ver} \
python3-orderedset=${python3_orderedset_ver} \
python3-psutil=${python3_psutil_ver} \
python3-pympler=${python3_pympler_ver} \
vim
상단에서 설정한 버전에 맞도록 설치 혹은 업데이트를 진행한다.
supervisord 설정
# 현재 지정한 설정에 대하여 /etc/supervisord.conf 에 저장
# supervisord : 프로세스를 daemon으로 위탁해주는 툴.
# Docker 데몬(daemon) : API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체 관리
# 현재 예시로 4개의 노드를 생성하였음.
RUN echo "[supervisord]\n\
logfile = /tmp/supervisord.log\n\
logfile_maxbytes = 50MB\n\
logfile_backups=10\n\
logLevel = error\n\
pidfile = /tmp/supervisord.pid\n\
nodaemon = true\n\
minfds = 1024\n\
minprocs = 200\n\
umask = 022\n\
user = indy\n\
identifier = supervisor\n\
directory = /tmp\n\
nocleanup = true\n\
childlogdir = /tmp\n\
strip_ansi = false\n\
\n\
[program:node1]\n\
command=start_indy_node Node1 0.0.0.0 9701 0.0.0.0 9702\n\
directory=/home/indy\n\
stdout_logfile=/tmp/node1.log\n\
stderr_logfile=/tmp/node1.log\n\
\n\
[program:node2]\n\
command=start_indy_node Node2 0.0.0.0 9703 0.0.0.0 9704\n\
directory=/home/indy\n\
stdout_logfile=/tmp/node2.log\n\
stderr_logfile=/tmp/node2.log\n\
\n\
[program:node3]\n\
command=start_indy_node Node3 0.0.0.0 9705 0.0.0.0 9706\n\
directory=/home/indy\n\
stdout_logfile=/tmp/node3.log\n\
stderr_logfile=/tmp/node3.log\n\
\n\
[program:node4]\n\
command=start_indy_node Node4 0.0.0.0 9707 0.0.0.0 9708\n\
directory=/home/indy\n\
stdout_logfile=/tmp/node4.log\n\
stderr_logfile=/tmp/node4.log\n"\
>> /etc/supervisord.conf
각 노드에 관한 정보 혹은 설정에 관련한 정보를 supervisord에 저장한다.
데이터 추출
# user를 indy로 설정
USER indy
# awk : 파일에서 데이터를 추출 하는 명령
# indy_config파일 셋팅 : 네트워크 네임이 설정되어있는가를 통해 출력 및 저장
RUN awk '{if (index($1, "NETWORK_NAME") != 0) {print("NETWORK_NAME = \"sandbox\"")} else print($0)}' /etc/indy/indy_config.py> /tmp/indy_config.py
# indy_config 파일 위치 변경
RUN mv /tmp/indy_config.py /etc/indy/indy_config.py
indy_config에 네트워크 관련 정보를 저장한다.
네트워크 설정
# pool을 돌릴 네트워크 주소 설정 : 현재 로컬
ARG pool_ip=127.0.0.1
# indy-pool 트랜젝션 발생 4개의 노드를 5명의 클라이언트에게 제공할 것이고, 노드의 번호는 1,2,3,4이다.
# 이 노드들은 pool_ip(현재 로컬)에서 돌릴거다.
RUN generate_indy_pool_transactions --nodes 4 --clients 5 --nodeNum 1 2 3 4 --ips="$pool_ip,$pool_ip,$pool_ip,$pool_ip"
# 호스트와 연결할 포트번호 설정
# node에 작성되어있는 포트와 동일
EXPOSE 9701 9702 9703 9704 9705 9706 9707 9708
1. 노드풀이 돌아갈 주소 지정
2. 노드풀을 생성
3. 마지막으로 작성된 9701~9708의 포트개방.
데몬 실행
# supervisord 실행으로 데몬 실행
CMD ["/usr/bin/supervisord"]
도커 파일이 돌아가게된다.
결론 : node-pool의 역할
- 노드 환경 구성을 위한 패키지 파일 설치 및 인증을 진행한다.
- 각 노드들의 정보를 설정한다.
- 데이터들을 필터링하여 환경 구성을 한다.
- 노드들이 구성될 네트워크 환경을 구성한다.
- 설정한 파일을 기준으로 도커 파일을 실행한다.
'기술 단어장 > Blockchain' 카테고리의 다른 글
[Mist] Mist 브라우저란? + 설치 (MAC) (0) | 2022.05.11 |
---|---|
[블록체인] Ubuntu용 Indy SDK 빌드 과정 분석 (0) | 2021.08.11 |
[블록체인] DID document는 무엇이고 어떤 내용이 들어갈까? (0) | 2021.08.03 |
[블록체인] 하이퍼레저 인디(Hyperledger indy)플랫폼과 SSI/DID (0) | 2021.07.06 |
[블록체인] 하이퍼레저 프로젝트(Hyperledger Project)의 배경 및 개요 (0) | 2021.07.05 |
댓글