How to Save and Move Docker Images | by Ng Wai Foong | Jul, 2022

Transferring doesn’t at all times must be exhausting

Picture by Ian Taylor on Unsplash

After studying this piece, you’ll be taught to bundle your Docker photographs and deploy them on different machines domestically. The method for copying a Docker picture could be complicated for many builders as Docker comes with completely different instructions for saving/loading and exporting/importing. These instructions will not be the identical and can’t be used interchangeably.

In case you are seeking to save an current Docker picture and cargo it as a Docker picture on one other machine, it is best to use the next instructions:

  • save — save a number of photographs to a tar archive
  • load — load a picture from a tar archive or STDIN

In case you are seeking to export an current Docker container and cargo it as a Docker filesystem picture on one other machine, it is best to use these instructions as a substitute:

  • export — export a container’s filesystem as a tar archive
  • import — import the contents from a tarball to create a filesystem picture

Each situations serve completely different functions relying in your use circumstances. The primary situation is right if you wish to deploy the identical Docker picture throughout completely different machines. The entire loaded photographs can have the identical functionalities when deployed. In case you are uncertain about your use circumstances, it is best to begin with the save/load instructions first earlier than trying export/import instructions.

However, the export/import instructions meant to retain the filesystem of a container with out the Docker directions. You may specify the specified Docker directions when importing the filesystem picture.

Please word that the export command doesn’t export the contents of volumes related to the container. It is going to solely export the content material of the underlying listing as a substitute of the mounted volumes.

That is extraordinarily helpful in case you have two tasks with the identical filesystem. As an alternative of constructing two Docker photographs, you possibly can merely:

  • construct a Docker picture for the primary undertaking
  • run a Docker container utilizing the newly constructed picture
  • export the container as filesystem picture
  • import the filesystem picture with customized Docker directions

Proceed to the following sections on setup and implementation.

If you have already got an current undertaking with a Docker picture, kindly skip to the Implementation part. This part covers the creation of all the mandatory recordsdata and folders because the constructing blocks for a Docker picture.

Make certain your root listing comprises the next folder construction:

|- app (undertaking recordsdata)
| |- important.py (Python script)
|- Dockerfile
|- necessities.txt

The important.py file is the principle script for a mock-up FastAPI server. The underlying content material is as follows:

from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():
return "message": "Hey World"

In the meantime, the necessities.txt file comprises all the mandatory Python dependencies for the undertaking. For instance:

anyio==3.6.1
click on==8.1.3
fastapi==0.79.0
h11==0.13.0
idna==3.3
pydantic==1.9.1
sniffio==1.2.0
starlette==0.19.1
typing_extensions==4.3.0
uvicorn==0.18.2

The Dockerfile ought to comprise the naked minimal directions to construct and run the FastAPI server:

FROM python:3.8WORKDIR /appCOPY ./necessities.txt necessities.txtRUN python -m pip set up --upgrade pip && pip set up --no-cache-dir -r necessities.txtCOPY ./app /appCMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

As soon as you might be performed with it, you possibly can construct your Docker picture utilizing the next syntax:

docker construct -t <tag:model> -f <Dockerfile> .

For instance:

docker construct -t undertaking:newest -f Dockerfile .

You may simply confirm if the construct course of is profitable by operating

docker picture ls

It’s best to see an analogous entry being displayed in your console:

cc33718e90f3   undertaking:newest   "uvicorn important:app --…"   11 seconds in the past   Up 10 seconds   5111/tcp, 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   undertaking

Then, you can begin a Docker container utilizing the next syntax:

docker run -p <hostport>:<dockerport> --rm --name <containername> <imagename>

For instance:

docker run -p 8000:8000 --rm --name undertaking undertaking:newest

The rm flag is used to mechanically take away the container when it exits.

Saving a Docker picture as tar archive

Assuming that there’s an current Docker picture in your machine. The syntax to put it aside to a tar archive is as follows:

docker save <imagename> -o <outputfile> <tag>:<model>

For instance:

docker save undertaking -o projectimg.tar undertaking:newest

Load a tar archive as Docker picture

After that, merely transfer/switch it to a different machine and run the next command to load it as a Docker picture:

docker load --input projectimg.tar

Docker will try to construct the layers half by half:

178f558940e6: Loading layer [==================================================>]   2.56kB/2.56kB
dfcca0eb0fc0: Loading layer [==================================================>] 68.4MB/68.4MB
0b9452996b52: Loading layer [==================================================>] 2.56kB/2.56kB

Upon completion, now you can execute docker run command to begin a brand new container as traditional.

Export container as tar archive

The docker export command requires a operating container. Execute the next command to begin a brand new container within the background:

docker run -d -p 8000:8000 --rm --name undertaking undertaking:newest

The -d flag represents detach and is used to run the container within the background.

You may verify all of the energetic containers in your machine by way of the next command:

docker container ls

The syntax to export an current container as tar archive is as follows:

docker export --output="<outputname>" <containername>

For instance:

docker export --output="projectcont.tar" undertaking

Import a tar archive as filesystem picture

When importing a tar archive as a filesystem picture, it won’t comprise any Docker directions. You have to specify your required directions by way of the --change flag. It takes in a listing of strings. For instance, you need to use the next directions to copy the identical container as what we did beforehand:

docker import projectcont.tar --change 'WORKDIR /app' --change 'CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]' undertaking:newest

The WORKDIR /app command be certain that app is the bottom working listing whereas the following run is supposed to run the FastAPI server.

The --change flag helps the next Docker directions:

  • CMD
  • ENTRYPOINT
  • ENV
  • EXPOSE
  • ONBUILD
  • USER
  • VOLUME
  • WORKDIR

When you encountered errors when beginning a Docker container, kindly double verify the directions you used throughout docker import.

In conclusion, you possibly can simply save and cargo a Docker picture by way of the docker save and docker load instructions.

Alternatively, you utilize docker export to export and current Docker container as tar archive and import it as filesystem picture by way of docker import command.

Be at liberty to take a look at my different article on the 6 Concepts to Master when Dockerizing Python Applications for extra data on dockerizing Python purposes.

Thanks for studying this text. Have an incredible day forward!

  1. Docker commandline — docker save
  2. Docker commandline — docker load
  3. Docker commandline — docker export
  4. Docker commandline — docker import
  5. Docker commandline — docker run

More Posts