blockbook-docker/README.md
Kumar Sahaj a9f569655c updated
2023-09-21 11:12:05 +00:00

7.2 KiB

Blockbook docker

Video-Demonstration For Mainnet

Video-Demonstration For Testnet

Pre-requisites

Should have sysbox installed on your machine

Main commands (For Both Mainnet and Testnet)

sudo docker run -d --runtime=sysbox-runc -P -p <hostport>:9166 --name blockbook ranchimallfze/blockbook:1.0.0

Requirements

Installation of Sysbox:


git clone --recursive https://github.com/nestybox/sysbox.git
make (For this step go to the sysbox directory)
make sysbox-static
sudo make install
make sysbox TARGET_ARCH=arm64
sudo ./docker-cfg --sysbox-runtime=enable (For this step go to the scr directory)
<!--If in step 6 command not found error comes then first install jq and then again run this command.-->

For Uninstalling:


sudo make uninstall
make clean

Installation of Docker:


sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/   
docker-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/
ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 
<!--Replace focal with your Ubuntu version (e.g., bionic, xenial, or hirsute) if you are using a different version-->
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo docker --version 
<!--If installed correctly the version will be displayed-->

How to see available ports ?

  • Open a new terminal on your Ubuntu system and copy the code given below:

  # Specify the range of ports you want to check (e.g., 8000 to 9000)
  start_port=8000
  end_port=9000

  # Use a loop to check each port in the specified range
  for port in $(seq "$start_port" "$end_port"); do
    # Use netstat or ss to check if the port is in use
    if ! ss -tuln | grep -q ":$port\b"; then
      echo "Port $port is available"
    fi
  done

Running Manually For Both Mainnet And Testnet

  • After the installation of docker and sysbox run the dockerfile. For running first we build its docker-image by the following command:

    
    docker build -t <IMG_NAME> .   
    <!--If the directory of the dockerfile and the present directory is same-->
    docker build -f <PATH_TO_DOCKERFILE> -t <IMG_NAME> <DOCKERFILE DIRECTORY> 
    <!--If the directory of the dockerfile and the present directory is not same-->
    
    
  • After building the docker-image use the following command to run it.

    
    docker run -d --privileged -p <HOST_PORT>:<CONTAINER_PORT> --name <CONTAINER_NAME> <IMG_NAME>
    <!--The container port for our docker file is 9166.-->
    docker run -d --privileged -p <HOST_PORT>:9166 --name <CONTAINER_NAME> <IMG_NAME>
    
    
  • Now access the blockbook by opening the following LINK: https://localhost:<HOST_PORT>/ Use xdg-open https://localhost:<HOST_PORT>/ to open the link through the terminal and can view the interface of Blockbook.

Testing

The code and steps required to run Docker version of Blockbook block explorer

sudo docker build -t blockbook-althelper -f Dockerfile-althelper .
sudo docker run -d --privileged -p 9166:9166 d5e56e218acd
docker buildx create --driver-opt image=moby/buildkit:master --use --name insecure-builder --buildkitd-flags '--allow-insecure-entitlement security.insecure'
docker buildx use insecure-builder
docker buildx build --allow security.insecure ...(other build args)...
sudo docker buildx build --allow security.insecure -t blockbook .
docker buildx rm insecure-builder


sudo docker run -v /var/run/docker.sock:/var/run/docker.sock -ti ubuntu:20.04
sudo docker run -d --runtime=sysbox-runc -P -p 9167:9166 5018bee64419

sudo docker run -d --runtime=sysbox-runc --net=host -P 5018bee64419

Code Explanation For Mainnet

  • We use the base image "nestybox/ubuntu-focal-systemd-docker," which is an Ubuntu-based image with systemd for managing system services.
  • We update the package list and installs necessary packages like wget, gnupg2,software-properties-common, and unzip.
  • The Dockerfile downloads a ZIP archive containing Debian (.deb) files from a GitHub repository and extracts them.
  • Within the extracted directory, it installs two Debian packages ("dind_backend-flo_0.15.1.1-satoshilabs -1_amd64.deb" and "dind_blockbook-flo_0.4.0_amd64.deb") using apt .
  • It exposes three ports (22, 80, and 9166) for potential network access.
  • The CMD instruction specifies the default command to run when a container is started based on this image. In this case, it starts the systemd initialization process.

Code Explanation For Testnet

  • This line specifies the base image for the Docker container. It starts with a base image called nestybox/ubuntu-focal-systemd-docker, which includes Ubuntu Focal Fossa (20.04) with systemd support.
  • We run a shell command inside the container during the image-building process. It updates the package list by executing apt update. The && operator is used to chain multiple commands in a single line.
  • We define an argument named TESTNET with a default value of false. Docker ARGs can be used to pass values at build time, and in this case, it's determining whether to set up the testnet or the mainnet environment.
  • Inside the if block, this line downloads a ZIP file containing testnet-related files from a GitHub repository using wget and then unzips it using unzip.
  • If the value of TESTNET is not "true," the else block is executed.Inside the else block, similar to the if block, we download a different ZIP file (likely containing mainnet-related files) and unzip it.
  • We change the working directory to the one where the mainnet ZIP file was extracted (blockbook-docker-main) and install the same two Debian packages as in the if block.
  • Use of 'fi' marks the end of the conditional statement, closing the if-else block.
  • Now we expose the ports 22, 80, and 9166 and make them accessible for communication with the host system or other containers.
  • The CMD instruction specifies the default command to run when a container is started based on this image. In this case, it starts the systemd initialization process.

Why Sysbox Is Used ?

  • When you run Docker containers inside a Docker container (DinD), the inner containers typically share
    the same Docker daemon as the host and other containers. This can lead to security and isolation concerns.
  • Sysbox allows you to run containers within an isolated environment, providing stronger separation between inner containers, the host, and other outer containers. This is achieved by creating separate container runtimes for each inner container using runc (the OCI runtime).
  • In our dockerfile we are able to execute systemctl command by using sysbox.