Форум
Монеты: 12 733 Биржи: 1239
Рыночная капитализация: $2 451 177 725 555,11
Объём за 24 ч: $73 617 104 812,18
ETH Газ: 6 Gwei
Быстро
9 Gwei
Стандарт
6 Gwei
Медленно
6 Gwei

Скорее всего вы знаете о преимуществах контейнеров Docker. Применение контейнеров упрощает развертывание приложений. Контейнеры требуют мало ресурсов для своей работы, позволяют абстрагироваться от железа и операционной системы. С их помощью можно «упаковать» приложение со всем необходимым для его работы.

В этой статье мы поможем вам быстро установить Docker в ОС Debian 11, а также создать на базе готового контейнера собственный узел Ethereum основной сети. Вы увидите, насколько это просто.

Установка Docker в ОС Debian 11

Прежде всего обновите список пакетов и установите дополнительные пакеты:

# apt update# apt -y install ca-certificates curl gnupg lsb-release

Далее скачайте и добавьте ключ PGP репозитория Docker:

# curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg —dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# echo «deb [arch=$(dpkg —print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable» | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

После этого обновите пакеты и установите Docker при помощи следующих команд:

# apt update

# apt -y install docker-ce docker-ce-cli containerd.io

Теперь запустите сервис Docker и убедитесь, что он работает и находится в состоянии enabled:

# systemctl start docker

# systemctl status docker

Добавьте пользователя, от имени которого мы будем запускать контейнер с узлом Ethereum, например, с именем developer.

Далее нужно добавить этого пользователя в группу docker:

# usermod -aG docker developer

Теперь войдите как пользователь developer и загрузите тестовый контейнер hello-world:

# su — developer

$ docker run hello-world

Unable to find image ‘hello-world:latest’ locally

latest: Pulling from library/hello-world

2db29710123e: Pull complete

Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625

Status: Downloaded newer image for hello-world:latest

Hello from Docker!

This message shows that your installation appears to be working correctly.

Если вы увидите на консоли сообщение «Hello from Docker!», значит все установлено правильно.

Чтобы узнать версию Docker, воспользуйтесь такой командой:

$ docker -vDocker version 20.10.17, build 100c701

Команда docker ps позволяет получить список запущенных контейнеров. Несмотря на то, что мы запустили контейнер hello-world, список будет пуст:

$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Дело в том, что контейнер hello-world после вывода строки на консоль сразу завершил свою работу.

На этом установка Docker закончена. Как видите, это было совсем нетрудно. При необходимости вы можете обратиться к полному руководству по установке: https://docs.docker.com/engine/install/debian/. На этом сайте есть инструкции по установке Docker для разных ОС.

Промокод для получения скидки 15% на авторский курс «Создание смарт-контрактов Solidity для Ethereum»CRYPTOSOL

Установка контейнера Geth

Теперь нам нужно установить и запустить контейнер с программой Geth. Готовые контейнеры можно взять из репозитория https://hub.docker.com/.

Чтобы получить список контейнеров, имеющих отношение к Ethereum, введите команду:

$ docker search ethereum

На рис. 1. мы показали результаты поиска.

Рис. 1. Результаты поиска контейнеров Ethereum

Мы будем загружать официальную реализацию протокола Ethereum с названием ethereum/client-go. В репозитории Docker описание соответствующего контейнера находится здесь: https://hub.docker.com/r/ethereum/client-go/.

Загрузите образ контейнера из репозитория:

$ docker pull ethereum/client-go

Процесс загрузки можно наблюдать на консоли:

Using default tag: latestlatest: Pulling from ethereum/client-go213ec9aee27d: Pull completed5de12e53593: Pull complete9957676576c4: Pull completeDigest: sha256:afcdd3c881004066ca6f36cabb8df0948509e133bf4fe2e49d9f214a0f199610Status: Downloaded newer image for ethereum/client-go:latestdocker.io/ethereum/client-go:latest

Вы можете выбрать один из четырех образов для версии Geth, которая является стабильной, или предназначена для разработки:

  • ethereum/client-go:latest — самая новая версия Geth для разработки, устанавливается по умолчанию;
  • ethereum/client-go:stable — самая новая стабильная версия Geth;
  • ethereum/client-go:{version} — стабильная версия Geth с заданным номером версии;
  • ethereum/client-go:release-{version} — самая новая стабильная версия Geth с заданным семейством версии

Подробнее о версиях образов можно почитать здесь: https://geth.ethereum.org/docs/install-and-build/installing-geth#docker-container.

Запуск контейнера ethereum/client-go

Как известно, контейнеры Docker используются для запуска кода, но не для хранения данных. Для размещения данных узла Ethereum создайте отдельный каталог на сервере, принадлежащий созданному нами ранее пользователю developer:

$ mkdir /home/developer/.ethereum/

Путь к этому каталогу нужно будет указать при запуске контейнера в параметре -v:

$ docker run -it -p 30303:30303 -v /home/developer/.ethereum/:/root/.ethereum ethereum/client-go —syncmode light —http —http.api ‘web3,eth,net,debug,personal’

Здесь в параметре -p указано, что контейнер должен использовать порты 30303 как на хосте, где работает Docker, так и внутри контейнера.

Параметр -it нужен для того, чтобы мы могли подключиться к работающему образу контейнера через консоль.

Обратите внимание на параметры —syncmode, —http и —http.api.

Первый из них задает легковесный узел, а не полный, который был бы создан по умолчанию. Параметр —http нужен для предоставления доступа к узлу через протокол IPC. Параметр —http.api включает доступ к указанным в этом параметре API узла.

Сразу после запуска контейнера ethereum/client-go на консоли появятся сообщения, аналогичные сообщениям при запуске Geth в виртуальной машине или на сервере (рис. 2).

Рис. 2. Сообщения на консоли после запуска узла Geth в контейнере

Чтобы обновить Geth, остановите контейнер, затем загрузите самую новую версию и репозитория и запустите контейнер снова:

$ docker stop [id контейнера]

$ docker pull ethereum/client-go:latest

$ docker run -it -p 30303:30303 -v /home/developer/.ethereum/:/root/.ethereum ethereum/client-go —syncmode light —http —http.api ‘web3,eth,net,debug,personal’

Здесь нужно ввести [id контейнера], полученный от команды «docker ps».

Подключение к работающему узлу

Чтобы подключиться к только что запущенному узлу и проследить процесс его синхронизации, а также добавить аккаунты, вам потребуется еще одно консольное окно.

Сначала получите список запущенных образов:

$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf0d7cd3cb67a ethereum/client-go «geth —syncmode lig…» 6 minutes ago Up 6 minutes 8545-8546/tcp, 30303/udp, 0.0.0.0:30303->30303/tcp, :::30303->30303/tcp quizzical_lumiere

Видно, что работает контейнер ethereum/client-go с идентификатором f0d7cd3cb67a (у вас будет другой идентификатор).

Запустите оболочку для этого контейнера:

$ docker exec -it f0d7cd3cb67a /bin/sh/ #

Теперь найдите файл geth.ipc, необходимый для подключения к работающему в контейнере узлу Ethereum:

/ # find / -name «geth.ipc»/root/.ethereum/geth.ipc

И, наконец, введите команду для подключения к узлу:

/ # geth attach /root/.ethereum/geth.ipcWelcome to the Geth JavaScript console!instance: Geth/v1.10.22-unstable-a50c006b/linux-amd64/go1.18.5at block: 15364318 (Thu Aug 18 2022 09:51:24 GMT+0000 (UTC)) datadir: /root/.ethereum modules: admin:1.0 debug:1.0 engine:1.0 eth:1.0 ethash:1.0 les:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 vflux:1.0 web3:1.0To exit, press ctrl-d or type exit>

Вы получили приглашение консоли JavaScript узла Geth, в котором можно выдавать команды.

Для начала проверьте, завершилась ли синхронизация узла при помощи команд eth.syncing и eth.blockNumber:

> eth.syncingfalse> eth.blockNumber15364323

Если синхронизация завершилась, первая из этих команд вернет значение false, а вторая — текущий номер блока.

В том случае, когда синхронизация еще идет, команда eth.syncing выведет на консоль информацию о ходе синхронизации:

{ currentBlock: 14846719, healedBytecodeBytes: 0, healedBytecodes: 0, healedTrienodeBytes: 0, healedTrienodes: 0, healingBytecode: 0, healingTrienodes: 0, highestBlock: 15371007, startingBlock: 14811135, syncedAccountBytes: 0, syncedAccounts: 0, syncedBytecodeBytes: 0, syncedBytecodes: 0, syncedStorage: 0, syncedStorageBytes: 0}

После завершения синхронизации для добавления аккаунта воспользуйтесь командой personal.newAccount:

> personal.newAccount()Passphrase:Repeat passphrase:»0x46c9167b72…873d9f81339″

На консоли появится идентификатор добавленного аккаунта.

Сохраните пароль так, чтобы его не потерять, и чтобы ни у кого к нему не было доступа. Восстановить забытый пароль не получится.

Для просмотра списка аккаунтов используйте команду eth.accounts:

> eth.accounts[«0x46c9167b72…873d9f81339»]

Обратите внимание, что этот аккаунт принадлежит основной, а не тестовой сети Ethereum.

Чтобы узнать версию Geth и API, воспользуйтесь командой web3.version:

> web3.version{ api: «0.20.1», ethereum: undefined, network: «1», node: «Geth/v1.10.22-unstable-a50c006b/linux-amd64/go1.18.5», whisper: undefined, getEthereum: function(callback), getNetwork: function(callback), getNode: function(callback), getWhisper: function(callback)}

Полезные команды

В интернете есть немало руководств по Docker помимо официальной документации https://docs.docker.com/.

Приведем несколько команд, которые будут вам полезны.

Посмотреть список запущенных контейнеров:

$ docker container ps

Посмотреть список всех контейнеров:

$ docker container ps -a

Удалить один или несколько контейнеров:

$ docker container rm [id контейнера]

Здесь id контейнера можно узнать с помощью команд «docker container ps» или «docker containerps-a». Можно указывать несколько идентификаторов, разделив их символом пробела, например:

$ docker container rm f7bd148bda96 acd7d664383b 6816ad09c697

f7bd148bda96

acd7d664383b

6816ad09c697

Для контроля использования ресурсов контейнером в реальном времени введите такую команду:

$ docker stats [id контейнера]

Остановить работу контейнера:

$ docker stop [id контейнера]

Запустить остановленный ранее контейнер:

$ docker start [id контейнера]

Сделать паузу в работе контейнера:

$ docker pause [id контейнера]

Запустить контейнер, ранее поставленный на паузу:

$ docker unpause [id контейнера]

Александр Фролов
Александр Фролов Автор курса про смарт-контракты Solidity
Комментариев пока нет
Поделитесь своими знаниями с другими пользователями!
Открыть свой блог
Получайте главные новости из мира криптовалюты прямо на почту