Setting `docker-compose` on fresh Ubuntu 18.04 install

In an effort for setting development tools in the most economical way (and also learn stuff about as much as possible), I am now trying to install docker-compose on a fresh Ubuntu 18.04 instance.

At the end, an nginx is supposed to run at startup and display a generic page.

Assumpions

  • the OS is already installed;
  • ufw is enabled, ports 80 and 443 are accesible;
  • the OS already has a custom user with sudo privileges (e.g. user);
  • we have a domain name pointing at the IP of the server (e.g. example.com) and also a CNAME record (*.example.com);

Install docker

  • sudo apt update
  • sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
  • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
  • sudo apt update
  • sudo apt upgrade -y
  • apt-cache policy docker-ce
  • sudo apt install docker-ce
  • sudo systemctl status docker
  • sudo usermod -aG docker ${USER}
  • su - ${USER}
  • id -nG

Install docker-compose

  • sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose
  • sudo chmod +x /usr/local/bin/docker-compose
  • docker-compose --version

Setup Nginx

  • sudo mkdir -p /app
  • cd /app
  • sudo touch docker-compose.yml
  • sudo nano docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
  • docker-compose up -d
  • Access http://example.com and here you should see the default nginx page.

Autostart

  • crontab -e
    You can use crontab -u <username> -e to execute the following command as a specific user;
  • add: @reboot (sleep 60 ; su user -c "cd /app ; /usr/local/bin/docker-compose down ; /usr/local/bin/docker-compose -f docker-compose.yml up -d --build")&
  • sudo reboot
  • http://example.com should still be accesible after server starts;
  • http://whatever.example.com should also be aviable, with the same content.

Sources