Static IP
First, we set up a static IP to our Ubuntu server using netplan. To do so, we created the following file:
/etc/netplan/01-netcfg.yaml
using the following command
sudo nano /etc/netplan/01-netcfg.yaml;
and added the following content to it:
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
version: 2
renderer: networkd
ethernets:
enp3s0f0:
dhcp4: no
addresses: [192.168.45.13/24]
gateway4: 192.168.45.1
nameservers:
addresses: [1.1.1.1,8.8.8.8]
To apply the changes, we executed the following:
Update everything (the operating system and all packages)
Usually, it is a good idea to update your system before making significant changes to it:
sudo apt update -y; sudo apt upgrade -y; sudo apt autoremove -y;
Install docker
In this setup we did not use the docker version that is available on the Ubuntu repositories, we went for the official ones from docker.com. To install it, we used the following commands:
sudo apt-get install ca-certificates curl gnupg lsb-release;
curl -fsSL https://download.docker.com/linux/ubuntu/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/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null;
sudo apt-get update;
sudo apt-get install docker-ce docker-ce-cli containerd.io;
Install docker-compose
Again, we installed the official docker-compose from github.com instead of the one available in the Ubuntu repositories. At the time that this post was created, version 1.29.2 was the recommended one:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose;
sudo chmod +x /usr/local/bin/docker-compose;
Increase network pool for docker daemon
To handle the following problem:
ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
We created the following file,
/etc/docker/daemon.json
using the command:
sudo nano /etc/docker/daemon.json;
and added the following content to it:
{
"default-address-pools": [
{
"base": "172.80.0.0/16",
"size": 24
},
{
"base": "172.90.0.0/16",
"size": 24
}
]
}
We executed the following command to restart the docker daemon and get the network changes applied:
sudo systemctl restart docker;
Gave access to our user to manage docker
We added our user to the docker group so that we could manage the docker daemon without sudo rights.
sudo usermod -aG docker $USER;
Deploying
After we copied everything in place, we executed the following command to create our containers and start them with the appropriate networks and volumes:
export COMPOSE_HTTP_TIMEOUT=120;
docker-compose up -d --remove-orphans;
We had to increase the timeout as we were getting the following error:
ERROR: for container_a UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
Stopping all containers using a filter on the name
docker container stop $(docker container ls -q --filter name=_web);
The above command will find all containers whose names contain _web
and stop them. That command is actually two commands where one is nested inside the other.
#This command finds all containers that their name contains _web, using the -q parameter, we only get back the container ID and not all information about them.
docker container ls -q --filter name=_web;
#The second command takes as input the output of the nested command and stops all containers that are returned.
docker container stop $(docker container ls -q --filter name=_web);