EnglishEnglish中文中文اَلْعَرَبِيَّةُاَلْعَرَبِيَّةُDeutschDeutschEspañolEspañolΕλληνικάΕλληνικάFrançaisFrançaisעִבְרִיתעִבְרִיתहिन्दीहिन्दीHrvatskiHrvatskiItalianoItaliano日本語日本語한국어한국어MalayMalayNederlandsNederlandsPortuguêsPortuguêsрусскийрусскийภาษาไทยภาษาไทยTürkTürkTiếng ViệtTiếng Việt粵語粵語
Learn
FAQs
Frequently asked questions by various stakeholders
Why Classic?
Start here to get the lowdown on Ethereum Classic's reason for being and unique value proposition
Knowledge
Further reading on the foundations that underpin ETC
Videos
A collection of videos and podcasts to keep you informed on ETC concepts and happenings
Support ETC by helping to translate this website!
Ethereum Classic Blog

Your First Ethereum Classic Node, Part 2: Run core-geth with Docker

Kevin Lord
Education, Guides, Series
Your first Ethereum Classic node, part 2: run core-geth with Docker
Your first Ethereum Classic node, part 2: run core-geth with Docker

In Part 1, I showed you how to set up core-geth by building it from the source we got from GitHub. This time, we're going to use Docker.

Docker is a containerization tool. In layman's terms, it lets you spin up little self-contained boxes called containers on your machine and run them separately, for as long as you need them. Each container comes with everything its software needs to run. So instead of building core-geth yourself, you just download a ready-made image of it and run it. For this guide, we'll use the image for v1.12.23 "Argos", the latest stable release of core-geth as of writing.

Here's why that's handy for running a node:

  • Nothing to build. core-geth comes ready-made in a Docker image, so you don't need to install Go or compile anything.
  • Kept separate. Your node runs in its own container, apart from the rest of your system, so it won't clutter up your machine.
  • Runs the same everywhere. The same image works the same way on any machine that has Docker.
  • Easy to update. Moving to a newer version of core-geth means changing the version number in one command.
  • Easy to clean up. When you're done, remove the container, and nothing is left behind except the chain data you chose to keep.

Docker can take a little more time to set up if you don't already have it installed. But once you do, starting core-geth takes one command, and talking to it takes one more.

This is part 2 of a three-part series. If you get stuck at any point, ask in r/EthereumClassic. The community is always happy to help.

Not covered here: waiting for a full sync, mining, or opening your node up to the internet. See Next steps.

Before you start

You need:

  • A Linux machine running Ubuntu or Debian. This guide was recorded on a cloud Linux machine over SSH, but a virtual machine (VM) or a spare computer at home works the same way.
  • An account that can run sudo (admin) commands.
  • A terminal, and about 20 minutes, plus however long Docker takes to install.

If you followed Part 1 and your node is still running, stop it first (Part 1, step 8). Both nodes use the same port, and the second one won't start while the first is running.

Hardware

Recommended hardware for running core-geth with a snap sync on ETC mainnet, as of October 2026:

RecommendedNotes
CPU4+ coresA synced node uses less than one core
RAM16 GB+The client itself uses about 4 GB once synced. The extra covers the memory spike during the initial sync. Less can work with swap, but the sync is slower
Disk500 GB SSD or NVMeA synced node uses about 85–100 GB today (chain data plus ethash caches). The rest leaves room for the chain to grow. Avoid spinning hard drives
Internet25+ Mbit/s downloadSlower connections work, but the initial sync takes longer

ETC's chain is much smaller than Ethereum's, so these numbers are well below go-ethereum's hardware requirements for Ethereum mainnet, which call for 2 TB or more of disk.

Step 1: Install Docker

Install Docker by following Docker's official guide for your Linux version: Install Docker Engine. Then do the first section of Docker's post-installation steps, so you can use Docker without typing sudo every time.

Check Docker works:

docker run hello-world

What you'll see (among a few other lines):

Hello from Docker!
This message shows that your installation appears to be working correctly.

What it means: Docker is installed and working, and your account can use it. If you see permission denied, log out and back in, then try again.

Running docker run hello-world

Step 2: Download and check the core-geth image

docker run --rm etclabscore/core-geth:v1.12.23 version

What you'll see: the download first, the first time only:

Unable to find image 'etclabscore/core-geth:v1.12.23' locally
v1.12.23: Pulling from etclabscore/core-geth
...
Status: Downloaded newer image for etclabscore/core-geth:v1.12.23

then a few lines of version details, including:

Version: 1.12.23-stable

What it means: you have the right image, and it's the version you expect.

  • etclabscore/core-geth is the image. core-geth's Docker images are published at hub.docker.com/r/etclabscore/core-geth.
  • v1.12.23 pins the exact version, so you always get the one this guide shows.
  • version is the same command you'd run with a geth you built yourself. Anything after the image name goes to geth.
  • --rm cleans up as soon as the command finishes.
Checking the core-geth image version
Checking the core-geth image version

Step 3: Start your node with one command

First make a folder for the node's data:

mkdir -p ~/etc-data

What you'll see: nothing. Then start the node with this one (long) command:

docker run -d --name coregeth -v ~/etc-data:/root/.ethereum -p 30303:30303 -p 30303:30303/udp etclabscore/core-geth:v1.12.23 --classic --syncmode snap

What you'll see: one long string of letters and numbers, then your prompt comes back.

What it means: that string is your container's ID. Your node is now running in the background, so your prompt comes straight back and you can keep using the same terminal.

What each part of the command does
PartWhat it does
-dRuns the node in the background
--name coregethNames the container, so later commands can refer to it
-v ~/etc-data:/root/.ethereumSaves the chain data in ~/etc-data on your machine, so it's kept even if the container is removed
-p 30303:30303 -p 30303:30303/udpOpens the port other nodes use to connect to you
etclabscore/core-geth:v1.12.23The image to run
--classic --syncmode snapEverything after the image goes to geth: join Ethereum Classic, and use the fastest sync. Part 1 explains the sync modes

Docker's own options always go before the image name. Anything after it goes to geth.

Starting the node with docker run

Step 4: Check it's running

docker ps

What you'll see: a table with one row for coregeth, with a STATUS like Up 2 minutes.

What it means: your node is up and running. That's it: one command and you have a node! To watch what it's doing:

docker logs -f coregeth

What you'll see: lines of text scrolling as your node starts up, finds peers and begins to sync. A few WARN lines in the first minutes are normal, and during a snap sync you'll also see some ERROR lines such as Expired request does not exist or Pending request exists for joining peer. These are harmless as long as the node keeps syncing.

Press Ctrl+C to stop watching. That only stops the display: the node keeps running in the background.

Checking the node with docker ps and docker logs

Step 5: Talk to your node

Wait about a minute after starting the node, then:

docker exec -it coregeth geth --classic attach

What you'll see: something like:

Welcome to the Geth JavaScript console!

instance: CoreGeth/v1.12.23-stable...
...
To exit, press ctrl-d or type exit
>

What it means: you're in your node's console, inside the container. From here, commands go to your node, not to Linux, until you type exit.

Type each of these after the > and press Enter:

CommandWhat you'll seeWhat it means
eth.chainId()"0x3d"61 in hexadecimal: ETC's chain ID. You're on Ethereum Classic
net.peerCountA number, such as 7How many other nodes you're connected to. Anything above 0 means you're part of the network
eth.syncingA block of details, including currentBlock and highestBlockHow far your node has synced. Shows false once it has caught up
eth.blockNumberA number, often 0 during a snap syncNormal at this stage. It jumps up near the end of the sync

Type exit or press Ctrl+D to leave the console. Your node keeps running in the background. Part 1, step 7 has more console commands and tips, and they all work here too.

Keep your IP address private: admin.nodeInfo shows your IP address, so keep its output out of posts and screenshots.

Attaching to the node with docker exec

Step 6: Stop, start and remove

To stop the node:

docker stop -t 120 coregeth

What you'll see: coregeth once it has stopped. -t 120 gives it up to 2 minutes to shut down cleanly. Without it, Docker forces the node to stop after 10 seconds, which can damage the data.

To start it again:

docker start coregeth

Once it's stopped, you can remove the container:

docker rm coregeth

Your chain data stays in ~/etc-data either way, so if you run the docker run command from step 3 again, your node carries on from where it left off.

Congratulations! You're running your own Ethereum Classic node with Docker. Once it's fully synced, you can query the blockchain directly, build your own block explorer, monitor the network, or create and deploy smart contracts and dApps, all without relying on a trusted third party or service.

Troubleshooting

Find the message you're seeing, then follow the fix. Still stuck? Ask in r/EthereumClassic, and include the command you ran and the message you saw.

Cannot connect to the Docker daemon… Is the docker daemon running? Docker's background service isn't running. Start it with sudo systemctl start docker, then try again. If it still won't start, your machine may not allow Docker: some cloud workspaces don't. For anything else Docker-related, check Docker's own documentation: Troubleshoot the Docker daemon.

permission denied while trying to connect to the Docker daemon socket. You haven't logged out and back in since doing Docker's post-installation steps. Do that, or put sudo in front of the command.

The container name "/coregeth" is already in use. You already created the container. Start it with docker start coregeth, or remove it with docker rm coregeth and run the docker run command again.

address already in use or port is already allocated. Something else is using port 30303: usually a node from Part 1 (address already in use) or another container (port is already allocated). Stop it, then start your node with docker start coregeth. Docker created the container before the error, so running the docker run command again gives the The container name "/coregeth" is already in use error.

Error response from daemon: container … is not running when you run docker exec. The node isn't running. Start it with docker start coregeth, wait a minute, then try again.

Next steps

  • Finish a full sync: leave the node running until eth.syncing shows false. Check you have the disk space listed under Hardware first.
  • Restart it automatically: add --restart unless-stopped --stop-timeout 120 to the docker run command (before the image name). Docker then starts your node again after a reboot, and --stop-timeout 120 gives it the same 2 minutes as step 6 to shut down cleanly when your machine restarts.
  • Update to a newer version: when a new release comes out, stop and remove the container (step 6), then run the step 3 command again with the new version number in place of v1.12.23. Your chain data in ~/etc-data carries over.
  • Free up the space: remove the container (step 6), delete the image with docker rmi etclabscore/core-geth:v1.12.23, then delete the chain data with sudo rm -rf ~/etc-data. The files were created inside the container, so deleting them needs sudo.
This page exists thanks in part to the following contributors:


developerkevin
developerkevin
  • EnglishEnglish
  • 中文中文
  • اَلْعَرَبِيَّةُاَلْعَرَبِيَّةُ
  • DeutschDeutsch
  • EspañolEspañol
  • ΕλληνικάΕλληνικά
  • FrançaisFrançais
  • עִבְרִיתעִבְרִית
  • हिन्दीहिन्दी
  • HrvatskiHrvatski
  • ItalianoItaliano
  • 日本語日本語
  • 한국어한국어
  • MalayMalay
  • NederlandsNederlands
  • PortuguêsPortuguês
  • русскийрусский
  • ภาษาไทยภาษาไทย
  • TürkTürk
  • Tiếng ViệtTiếng Việt
  • 粵語粵語
Add ETC to MetaMask
The ETC community is active on Discord
Discord
Discord
Telegram
Telegram
Twitter
Twitter
Reddit
Reddit
GitHub
GitHub
This site is powered by Netlify

Learn

  • FAQs
  • Why Classic?
  • Knowledge
  • Videos

Made with <3 for the Original Ethereum Vision

The content on this website is user-generated and solely for informational purposes. Do not interpret any content as an endorsement of any product or service. There's "no official anything" in Ethereum Classic. Always do your own research, and remember: don't trust, verify!