Get Docker Linux
Estimated reading time: 11 minutes
- Aug 28, 2020 To get started developing apps using Docker with WSL 2, we recommend using VS Code, along with the Remote-WSL extension and Docker extension. Install the VS Code Remote-WSL extension. This extension enables you to open your Linux project running on WSL in VS Code (no need to worry about pathing issues, binary compatibility, or other cross-OS.
- The preferred choice for millions of developers that are building containerized apps. Docker Desktop is an application for MacOS and Windows machines for the building and sharing of containerized applications. Access Docker Desktop and follow the guided onboarding to build your first containerized application in minutes.
2.5.6.3 Deploying MySQL on Windows and Other Non-Linux Platforms with Docker The Docker deployment framework supports easy installation and configuration of MySQL Server. This section explains how to use a MySQL Server Docker image.
Scan your images for vulnerabilities
Using open source components in your container images can introduce vulnerabilities. Run docker scan
to start securing your images using Snyk. If you have a Docker Pro, Team, or a Business subscription, you can automatically scan images when you push an image to Docker Hub. See Hub Vulnerability Scanning for more information.
To get started with Docker Engine on Ubuntu, make sure youmeet the prerequisites, theninstall Docker.
Prerequisites
OS requirements
To install Docker Engine, you need the 64-bit version of one of these Ubuntuversions:
- Ubuntu Hirsute 21.04
- Ubuntu Focal 20.04 (LTS)
- Ubuntu Bionic 18.04 (LTS)
Docker Engine is supported on x86_64
(or amd64
), armhf
, arm64
, and s390x
architectures.
Ubuntu 16.04 LTS “Xenial Xerus” end-of-life
Ubuntu Linux 16.04 LTS reached the end of its five-year LTS window on April30th 2021 and is no longer supported. Docker no longer releases packages forthis distribution (including patch- and security releases). Users runningDocker on Ubuntu 16.04 are recommended to update their system to a currentlysupported LTS version of Ubuntu.
Uninstall old versions
Older versions of Docker were called docker
, docker.io
, or docker-engine
.If these are installed, uninstall them:
It’s OK if apt-get
reports that none of these packages are installed.
The contents of /var/lib/docker/
, including images, containers, volumes, andnetworks, are preserved. If you do not need to save your existing data, and want tostart with a clean installation, refer to the uninstall Docker Enginesection at the bottom of this page.
Supported storage drivers
Docker Engine on Ubuntu supports overlay2
, aufs
and btrfs
storage drivers.
Docker Engine uses the overlay2
storage driver by default. If you need to useaufs
instead, you need to configure it manually.See use the AUFS storage driver
Installation methods
You can install Docker Engine in different ways, depending on your needs:
Most usersset up Docker’s repositories and installfrom them, for ease of installation and upgrade tasks. This is therecommended approach.
Some users download the DEB package andinstall it manually and manageupgrades completely manually. This is useful in situations such as installingDocker on air-gapped systems with no access to the internet.
In testing and development environments, some users choose to use automatedconvenience scripts to install Docker.
Install using the repository
Before you install Docker Engine for the first time on a new host machine, you needto set up the Docker repository. Afterward, you can install and update Dockerfrom the repository.
Set up the repository
Update the
apt
package index and install packages to allowapt
to use arepository over HTTPS:Add Docker’s official GPG key:
Use the following command to set up the stable repository. To add thenightly or test repository, add the word
nightly
ortest
(or both)after the wordstable
in the commands below. Learn about nightly and test channels.Note: The
lsb_release -cs
sub-command below returns the name of yourUbuntu distribution, such asxenial
. Sometimes, in a distributionlike Linux Mint, you might need to change$(lsb_release -cs)
to your parent Ubuntu distribution. For example, if you are usingLinux Mint Tessa
, you could usebionic
. Docker does not offer any guarantees on untestedand unsupported Ubuntu distributions.
Install Docker Engine
Update the
apt
package index, and install the latest version of DockerEngine and containerd, or go to the next step to install a specific version:Got multiple Docker repositories?
If you have multiple Docker repositories enabled, installingor updating without specifying a version in the
apt-get install
orapt-get update
command always installs the highest possible version,which may not be appropriate for your stability needs.To install a specific version of Docker Engine, list the available versionsin the repo, then select and install:
a. List the versions available in your repo:
b. Install a specific version using the version string from the second column, for example,
5:18.09.1~3-0~ubuntu-xenial
.Verify that Docker Engine is installed correctly by running the
hello-world
image.This command downloads a test image and runs it in a container. When thecontainer runs, it prints a message and exits.
Docker Engine is installed and running. The docker
group is created but no usersare added to it. You need to use sudo
to run Docker commands.Continue to Linux postinstall to allow non-privilegedusers to run Docker commands and for other optional configuration steps.
Upgrade Docker Engine
To upgrade Docker Engine, first run sudo apt-get update
, then follow theinstallation instructions, choosing the newversion you want to install.
Install from a package
If you cannot use Docker’s repository to install Docker Engine, you can download the.deb
file for your release and install it manually. You need to downloada new file each time you want to upgrade Docker.
Go to
https://download.docker.com/linux/ubuntu/dists/
,choose your Ubuntu version, then browse topool/stable/
, chooseamd64
,armhf
,arm64
, ors390x
, and download the.deb
file for the Docker Engineversion you want to install.Note
To install a nightly or test (pre-release) package,change the word
stable
in the above URL tonightly
ortest
.Learn about nightly and test channels.Install Docker Engine, changing the path below to the path where you downloadedthe Docker package.
The Docker daemon starts automatically.
Verify that Docker Engine is installed correctly by running the
hello-world
image.This command downloads a test image and runs it in a container. When thecontainer runs, it prints a message and exits.
Docker Engine is installed and running. The docker
group is created but no usersare added to it. You need to use sudo
to run Docker commands.Continue to Post-installation steps for Linux to allownon-privileged users to run Docker commands and for other optional configurationsteps.
Upgrade Docker Engine
To upgrade Docker Engine, download the newer package file and repeat theinstallation procedure, pointing to the new file.
Install using the convenience script
Docker provides a convenience script at get.docker.comto install Docker into development environments quickly and non-interactively.The convenience script is not recommended for production environments, but can beused as an example to create a provisioning script that is tailored to your needs.Also refer to the install using the repositorysteps to learn about installation steps to install using the package repository.The source code for the script is open source, and can be found in thedocker-install
repository on GitHub.
Always examine scripts downloaded from the internet before running them locally.Before installing, make yourself familiar with potential risks and limitationsof the convenience script:
- The script requires
root
orsudo
privileges to run. - The script attempts to detect your Linux distribution and version andconfigure your package management system for you, and does not allow you tocustomize most installation parameters.
- The script installs dependencies and recommendations without asking forconfirmation. This may install a large number of packages, depending on thecurrent configuration of your host machine.
- By default, the script installs the latest stable release of Docker, containerd,and runc. When using this script to provision a machine, this may result inunexpected major version upgrades of Docker. Always test (major) upgrades ina test environment before deploying to your production systems.
- The script is not designed to upgrade an existing Docker installation. Whenusing the script to update an existing installation, dependencies may not beupdated to the expected version, causing outdated versions to be used.
Tip: preview script steps before running

You can run the script with the DRY_RUN=1
option to learn what steps thescript will execute during installation:
This example downloads the script from get.docker.comand runs it to install the latest stable release of Docker on Linux:
Docker is installed. The docker
service starts automatically on Debian baseddistributions. On RPM
based distributions, such as CentOS, Fedora, RHEL or SLES,you need to start it manually using the appropriate systemctl
or service
command.As the message indicates, non-root users cannot run Docker commands by default.
Use Docker as a non-privileged user, or install in rootless mode?
The installation script requires root
or sudo
privileges to install anduse Docker. If you want to grant non-root users access to Docker, refer to thepost-installation steps for Linux.Docker can also be installed without root
privileges, or configured to runin rootless mode. For instructions on running Docker in rootless mode, refer torun the Docker daemon as a non-root user (rootless mode).
Install pre-releases
Linux Docker Get Host Ip
Docker also provides a convenience script at test.docker.comto install pre-releases of Docker on Linux. This script is equivalent to thescript at get.docker.com
, but configures your package manager to enable the“test” channel from our package repository, which includes both stable andpre-releases (beta versions, release-candidates) of Docker. Use this script toget early access to new releases, and to evaluate them in a testing environmentbefore they are released as stable.
To install the latest version of Docker on Linux from the “test” channel, run:
Upgrade Docker after using the convenience script
If you installed Docker using the convenience script, you should upgrade Dockerusing your package manager directly. There is no advantage to re-running theconvenience script, and it can cause issues if it attempts to re-addrepositories which have already been added to the host machine.
Uninstall Docker Engine
Uninstall the Docker Engine, CLI, and Containerd packages:
Images, containers, volumes, or customized configuration files on your hostare not automatically removed. To delete all images, containers, andvolumes:
You must delete any edited configuration files manually.
Next steps
- Continue to Post-installation steps for Linux.
- Review the topics in Develop with Docker to learn how to build new applications using Docker.
Estimated reading time: 11 minutes
On this page you build a simple Python web application running on DockerCompose. The application uses the Flask framework and maintains a hit counter inRedis. While the sample uses Python, the concepts demonstrated here should beunderstandable even if you’re not familiar with it.
Prerequisites
Make sure you have already installed both Docker Engineand Docker Compose. You don’t need to install Python or Redis, asboth are provided by Docker images.
Step 1: Setup
Define the application dependencies.
Create a directory for the project:
Create a file called
app.py
in your project directory and paste this in:In this example,
redis
is the hostname of the redis container on theapplication’s network. We use the default port for Redis,6379
.Handling transient errors
Note the way the
get_hit_count
function is written. This basic retryloop lets us attempt our request multiple times if the redis service isnot available. This is useful at startup while the application comesonline, but also makes our application more resilient if the Redisservice needs to be restarted anytime during the app’s lifetime. In acluster, this also helps handling momentary connection drops betweennodes.Create another file called
requirements.txt
in your project directory andpaste this in:
Step 2: Create a Dockerfile
In this step, you write a Dockerfile that builds a Docker image. The imagecontains all the dependencies the Python application requires, including Pythonitself.
In your project directory, create a file named Dockerfile
and paste thefollowing:
This tells Docker to:

- Build an image starting with the Python 3.7 image.
- Set the working directory to
/code
. - Set environment variables used by the
flask
command. - Install gcc and other dependencies
- Copy
requirements.txt
and install the Python dependencies. - Add metadata to the image to describe that the container is listening on port 5000
- Copy the current directory
.
in the project to the workdir.
in the image. - Set the default command for the container to
flask run
.
For more information on how to write Dockerfiles, see theDocker user guideand the Dockerfile reference.
Step 3: Define services in a Compose file
Create a file called docker-compose.yml
in your project directory and pastethe following:
This Compose file defines two services: web
and redis
.
Web service
The web
service uses an image that’s built from the Dockerfile
in the current directory.It then binds the container and the host machine to the exposed port, 5000
. This example service uses the default port for the Flask web server, 5000
.
Redis service
The redis
service uses a public Redis image pulled from the Docker Hub registry.
Step 4: Build and run your app with Compose
From your project directory, start up your application by running
docker-compose up
.Compose pulls a Redis image, builds an image for your code, and starts theservices you defined. In this case, the code is statically copied into the image at build time.
Enter http://localhost:5000/ in a browser to see the application running.
If you’re using Docker natively on Linux, Docker Desktop for Mac, or Docker Desktop forWindows, then the web app should now be listening on port 5000 on yourDocker daemon host. Point your web browser to http://localhost:5000 tofind the
Hello World
message. If this doesn’t resolve, you can also tryhttp://127.0.0.1:5000.If you’re using Docker Machine on a Mac or Windows, use
docker-machine ipMACHINE_VM
to get the IP address of your Docker host. Then, openhttp://MACHINE_VM_IP:5000
in a browser.You should see a message in your browser saying:
Refresh the page.
The number should increment.
Switch to another terminal window, and type
docker image ls
to list local images.Listing images at this point should return
redis
andweb
.You can inspect images with
docker inspect <tag or id>
.Stop the application, either by running
docker-compose down
from within your project directory in the second terminal, or byhitting CTRL+C in the original terminal where you started the app.
Step 5: Edit the Compose file to add a bind mount
Edit docker-compose.yml
in your project directory to add abind mount for the web
service:
The new volumes
key mounts the project directory (current directory) on thehost to /code
inside the container, allowing you to modify the code on thefly, without having to rebuild the image. The environment
key sets theFLASK_ENV
environment variable, which tells flask run
to run in developmentmode and reload the code on change. This mode should only be used in development.
Step 6: Re-build and run the app with Compose
From your project directory, type docker-compose up
to build the app with the updated Compose file, and run it.
Check the Hello World
message in a web browser again, and refresh to see thecount increment.
Shared folders, volumes, and bind mounts
If your project is outside of the
Users
directory (cd ~
), then youneed to share the drive or location of the Dockerfile and volume you are using.If you get runtime errors indicating an application file is not found, a volumemount is denied, or a service cannot start, try enabling file or drive sharing.Volume mounting requires shared drives for projects that live outside ofC:Users
(Windows) or/Users
(Mac), and is required for any project onDocker Desktop for Windows that uses Linux containers.For more information, see File sharing on Dockerfor Mac, and the general examples on how toManage data in containers.If you are using Oracle VirtualBox on an older Windows OS, you might encounter an issue with shared folders as described in this VB troubleticket. Newer Windows systems meet therequirements for Docker Desktop for Windows and do notneed VirtualBox.
Step 7: Update the application
Because the application code is now mounted into the container using a volume,you can make changes to its code and see the changes instantly, without havingto rebuild the image.
Change the greeting in app.py
and save it. For example, change the Hello World!
message to Hello from Docker!
:
Refresh the app in your browser. The greeting should be updated, and thecounter should still be incrementing.
Step 8: Experiment with some other commands
If you want to run your services in the background, you can pass the -d
flag(for “detached” mode) to docker-compose up
and use docker-compose ps
tosee what is currently running:
The docker-compose run
command allows you to run one-off commands for yourservices. For example, to see what environment variables are available to theweb
service:
See docker-compose --help
to see other available commands. You can also install command completion for the bash and zsh shell, which also shows you available commands.
Get Docker Linux Command
If you started Compose with docker-compose up -d
, stopyour services once you’ve finished with them:
You can bring everything down, removing the containers entirely, with the down
command. Pass --volumes
to also remove the data volume used by the Rediscontainer:
At this point, you have seen the basics of how Compose works.
Where to go next

- Next, try the Sample apps with Compose
- To learn more about volumes and bind mounts, see Manage data in Docker