Docker를 사용한 다중 lnd 셋업
Docker를 사용하여 한 머신 안에 복수 개의 라이트닝 네트워크 LND 데몬을 구동할 수 있다.
Docker를 위한 LND 빌드
docker build 명령을 사용하여 lnd 를 실행하는 docker image를 빌드한다. 디폴트인 Dockerfile 파일을 빌드하면 Production에서 사용할 docker image를 생성하며, dev.Dockerfile 파일을 빌드하면 개발/테스트 환경에서 사용할 docker image를 생성한다.
$ git clone https://github.com/lightningnetwork/lnd $ cd lnd // Dockerfile을 사용하여 빌드 $ sudo docker build --tag=lnd-0.16.3 . // dev.Dockerfile을 사용하여 빌드 $ sudo docker build --tag=lnd-0.16.3-dev -f dev.Dockerfile .
Docker Volume과 Network
LND가 사용할 데이타/작업 폴더를 외부에 만들기 위해 Volume을 생성하는데, 아래와 같이 미리 생성하거나 Container 생성시 -v 옵션으로 지정하여 만들수도 있다.
// Volume 생성 $ sudo docker volume create volA $ sudo docker volume create volB
Docker container에서 특정 Static IP 주소를 지정하기 위해서는 아래와 같이 별도의 사용자 정의 네트워크를 생성하여 사용한다. 아래 예의 lndnet 네트워크는 172.18.0.0 ~ 172.18.255.255 네트워크 범위를 갖게 된다.
// 별도의 사용자 정의 Network 생성 $ sudo docker network create --subnet=172.18.0.0/16 lndnet
Docker는 3개의 Built-in 네트워크(null, host, bridge)를 가지고 있는데, 디폴트로 bridge를 사용한다. bridge는 172.17.0.0/16 서브네트워크 범위를 갖는다.
Docker Container 생성
위에서 빌드한 Production용 lnd-0.16.3 이미지로부터 lndA 라는 Container를 생성하기 위해서는 아래와 같은 명령을 실행할 수 있다. 여기서는 볼륨 volA 를 Container 안의 /root/.lnd에 연결하고, 커맨드 라인 아규먼트들을 뒤에 지정하였다. 또한, 여기서 Static IP를 지정하기 위해 --net lndnet --ip 172.18.0.2 을 추가하였지만, 만약 디폴트 bridge 네트워크에서 동적으로 IP를 할당받기 위해서는 이를 생략할 수 있다. (아래 명령은 bitcoind가 192.168.4.101에서 실행되고 있다는 가정함). 이렇게 만들어진 Container를 시작하면 자동으로 lnd 데몬이 실행된다.
$ sudo docker create --name=lndA -v volA:/root/.lnd --net lndnet --ip 172.18.0.2 lnd-0.16.3 --alias=alice --accept-keysend --accept-amp --bitcoin.active --bitcoin.testnet --bitcoin.node=bitcoind --bitcoind.rpchost=192.168.4.101:18332 --bitcoind.rpcuser=user --bitcoind.rpcpass=pwd --bitcoind.zmqpubrawblock=tcp://192.168.4.101:28332 --bitcoind.zmqpubrawtx=tcp://192.168.4.101:28333
개발/테스트용 dev.Dockerfile를 사용하여 빌드한 lnd-0.16.3-dev 이미지를 사용하는 경우, Container 구동시 자동으로 lnd 데몬을 시작하지 않는다. 즉, Container 생성/구동 후 Linux Shell에서 /start-lnd.sh 을 실행하여 lnd를 구동할 수 있다. start-lnd.sh는 디폴트 값을 가지는데, 통상 스크립트에 사용하는 환경변수를 설정하거나 직접 스크립트 값을 수정한 후 lnd를 시작한다. start-lnd.sh를 사용하지 않고, 또다른 방식으로 /root/.lnd/lnd.conf 파일을 생성하여 여기에 lnd 옵션들을 넣고, 직접 "lnd" 명령을 실행할 수 있다. 아래의 --net 옵션과 --ip 옵션을 Static IP를 사용하지 않는 경우 생략할 수 있다.
$ sudo docker run -it --name lndB -v volB:/root/.lnd --net lndnet --ip 172.18.0.3 lnd-0.16.3-dev // lnd.conf를 사용하는 경우 # vi root/.lnd/lnd.conf # lnd
Container가 생성된 후, 재가동하기 위해 docker start 명령을 사용한다.
$ sudo docker start -i lndA $ sudo docker start -i lndB
lnd 데몬에 접속하여 lncli 를 사용하기 위해서는 아래와 같이 bash 터미널을 만들어 Shell 안에서 실행하면 된다. 물론 하나의 명령만 실행한다면, /bin/bash 대신 직접 lncli 명령을 수행한다.
// Shell에서 여려 명령 실행 $ sudo docker exec -it lndA /bin/bash # lncli --network=testnet create # lncli --network=testnet getinfo # ... // 하나의 명령만 실행 $ sudo docker exec -it lndA lncli --network=testnet create