跳到主要内容

使用Docker构建与运行

介绍如何使用Docker构建和运行节点。

为了方便运维和管理,很多用户选择在容器化的环境中运行节点,包括Docker Compose以及Kubernetes等。MVC同样提供了Docker镜像的构建和下载,方便用户使用容器化的环境来安装和部署节点软件。

使用Docker还可以在非Ubuntu系统上运行节点,比如macOS和Windows系统。

构建Docker镜像

本章介绍如何从源码自行构建节点镜像,如果你希望直接拉取公共镜像仓库使用,可以直接跳过这部分内容。

Docker镜像的定义文件Dockerfile位于 mvc-dockerfile 项目中,你可以随时查阅源码。它从ubuntu:20.04 基础镜像构建,安装了节点软件的依赖库和运行环境,然后下载二进制文件和默认配置,并执行docker build

构建镜像对系统没有要求,只要能够运行docker并且执行bash脚本即可。这里所有测试在macos(arm chips)和ubuntu 20.04 LTS上通过。但是节点软件只能在x86架构的机器上运行。

首先clone项目到本地:

git clone https://github.com/mvc-labs/mvc-dockerfile.git
cd mvc-dockerfile

然后执行构建命令:

bash docker-build.bash 

脚本默认会下载构建并构建最新版本,如果你希望构建旧版本的节点软件,可以使用如下命令指定版本号.

注意,打包镜像使用的默认mvc.conf 是代码仓库中的配置文件,如果你需要修改配置文件,可以在构建之前修改配置文件。当然也可以在运行容器的时候指定配置文件。

bash docker-build.bash v0.2.0.0

你还可以将构建好的镜像打上latest标签,方便后续使用。

docker tag microvisionchain:v0.2.0.0 microvisionchain:latest

构建完成后,你可以使用docker images查看构建的镜像:

docker images

可以看到如下输出:

REPOSITORY         TAG        IMAGE ID       CREATED          SIZE
microvisionchain v0.2.0.0 35630de7b95e 22 minutes ago 967MB

表示构建成功,你可以直接在本地使用这个镜像来运行节点,或者根据你的需求将镜像推送到远端仓库进行管理。

从公开仓库拉取Docker容器

你可以根据上文的构建步骤构建Docker镜像,也可以直接拉取我们构建好的镜像。MVC labs还提供免费公开的ECR镜像仓库可供直接拉取构建好的镜像,方便用户快速部署节点。

# 拉取最新版本
docker pull public.ecr.aws/h8c8i3v2/microvisionchain:latest
# 打上latest标签
docker tag public.ecr.aws/h8c8i3v2/microvisionchain:latest microvisionchain:latest

成功后,你可以使用docker images查看拉取的镜像:

REPOSITORY                                 TAG        IMAGE ID       CREATED       SIZE
microvisionchain latest 35630de7b95e 2 hours ago 967MB
public.ecr.aws/h8c8i3v2/microvisionchain latest 35630de7b95e 2 hours ago 967MB
public.ecr.aws/h8c8i3v2/microvisionchain v0.2.0.0 35630de7b95e 2 hours ago 967MB

运行Docker容器

直接运行(非生产环境)

运行Docker之前,请确保你已经安装docker,并构建或者拉取了镜像(参考上文的内容)。

你可以使用如下命令直接运行节点容器:

docker run -d --name microvisionchain -p 9883:9883 -p 9882:9882 microvisionchain:latest

它会采用默认配置启动节点,数据和配置也会存放在容器默认路径/root/.mvc/下,另外由于容器环境不同,日志不是输出在mvcd.log中而是stdio,你可以通过docker logs -f microvisionchain查看节点日志。

节点容器启动之后,可以使用mvc-cli来查看节点信息:

docker exec microvisionchain mvc-cli getinfo

这样配置的好处是管理相对简单,但是缺点是持久化存储依赖于容器运行时,如果容器被删除,数据也会丢失,备份和恢复节点数据也很麻烦。所以不推荐生产环境直接执行docker。另外,默认配置无法修改config文件,如果你需要修改配置文件,可以使用下面的方法。

使用docker-compose运行

docker-compose是docker的一个管理工具,可以通过yaml文件来管理多个容器的启动和配置。在docker compose中,你可以指定节点的配置文件和数据目录绑定到主机,方便管理和维护。也可以设置节点网络桥接到主机等。

本教程中,我们将数据目录绑定到主机的~/mvc-data目录,并通过volume mount到容器内的/mvc/data路径下,然后引导容器使用/mvc/data来存储数据,这样即使容器被删除,数据和配置也不会丢失。

首先,在宿主机创建数据目录(你也可以绑定不同的硬盘到这个目录):

mkdir -p ~/mvc-data

clone项目到本地(其中包含config和docker-compose):

git clone https://github.com/mvc-labs/mvc-dockerfile.git
cd mvc-dockerfile

修改项目目录其中的mvc.conf文件,比如修改rpcuser和rpcpassword,以及其他配置项。具体配置项的含义和用法请参考配置文件说明

配置完成后,运行docker-compose:

docker compose up -d

这样就可以启动节点容器了,你可以通过docker compose ls查看容器状态:

NAME                STATUS              CONFIG FILES
mvc-dockerfile running(1) /home/ubuntu/mvc-dockerfile/docker-compose.yml

也可以用docker compose logs -f查看节点日志。

使用mvc-cli 与节点通信:

docker compose exec mvcd mvc-cli help

预期会看到节点的帮助信息,代表启动成功。

$ docker compose exec mvcd mvc-cli help
== Blockchain ==
checkjournal
getbestblockhash
getblock "blockhash" ( verbosity )
getblockbyheight height ( verbosity )
getblockchaininfo
getblockcount
getblockhash height
getblockheader "hash" ( verbose )
getblockstats blockhash ( stats )
getblockstatsbyheight height ( stats )
getchaintips

如果需要备份和恢复节点数据,只需要备份和恢复~/mvc-data目录即可。

附录

Ubuntu 安装和初始化Docker服务

#!/bin/bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Enable and start Docker
systemctl enable docker
systemctl start docker

Ubuntu 设置docker用户组

docker默认使用的是root用户访问unix socket,如果普通用户无需sudo来执行docker命令,可以将用户加入docker用户组。

# add docker group and add current user to docker group
sudo groupadd docker
sudo usermod -aG docker $USER
sudo newgrp docker

然后重启主机即可生效。