If you do not know how to run Docker, you should start from Part 1.
Last time, you learn how to run a Docker container with different arguments and convert the command to a
docker-compose.yml for easier maintenance. This time I will show configurations with user Docker image and talk more about different options on Docker Compose.
Portainer is a open source Docker management web application. Although you can do all the things that it does in command line, but sometime it is nice to have GUI. This also allow given users control to manage containers without giving server login.
version: "3" services: portainer: image: portainer/portainer restart: unless-stopped ports: - 9000:9000 volumes: - /docker/portainer:/data - /var/run/docker.sock:/var/run/docker.sock
Portainer is rather simple to deploy. You only need to mount two volumes to get it running.
/data contains all configurations, including users, endpoints, and etc.
/var/run/docker.sock allows Portainer to manage Docker daemon of the host. If you only use it to manage remote endpoints, it is not needed.
In the YAML above, you can see
restart: unless-stopped which defines the restart policy of the container.
Restart policy defines what happens if the container is stopped. There are 4 policies.
no: If it stops, Docker does not try to restart the container.
always: Docker always restart the container, including restart.
on-failure: Only restart if it exits with non-zero code.
unless-stopped: Docker always restart the container unless it is stopped manually, including restart.
I would recommend
always restarts containers even it is stopped before Docker restart.
Plex is a self-hosted media streaming server, like your own Netflix. There are two Docker images: official and community. The community is the one being built first and the official is basically a clone.
version: "3" services: plex: image: linuxserver/plex ports: - 32400:32400 tmpfs: /transcode volumes: - /media:/media:ro - /docker/plex:/config environment: VERSION: latest
You should use
network_mode: "host" instead of
ports: on your first creation because Plex use LAN discovery for you to claim the server. Then, you add necessary ports afterward. As I don’t use anything like DLNA, I only need the web (32400).
tmpfs is a temporary file system in memory. It will increase the responsiveness of streams and RAM usage.
Note that both versions do not follow the best practice of Docker. They download binary after the container started which defeat the purpose of reproducible build.
Netdata is simple monitor dashboard for you to monitor host and containers status and get alert from it.
version: "3" services: netdata: image: netdata/netdata hostname: example.com ports: - 19999:19999 volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /var/run/docker.sock:/var/run/docker.sock:ro cap_add: - SYS_PTRACE security_opt: - apparmor:unconfined
GitLab is the most featured free self-host Git server. If you do not want to host your code on GitHub or other Git provider, then you can self-host GitLab.
version: "3" services: gitlab: image: gitlab/gitlab-ce:latest privileged: true ports: - 80:80 - 443:443 - 22:22 - 5000:5000 - 5005:5005 volumes: - /docker/gitlab/config:/etc/gitlab - /docker/gitlab/logs:/var/log/gitlab - /docker/gitlab/data:/var/opt/gitlab - /etc/letsencrypt:/ssl
Nextcloud is an open source, self-hosted file share and communication platform.
version: "3" services: nextcloud: image: nextcloud ports: - 80:80 volumes: - /docker/nextcloud:/var/www/html mariadb: image: mariadb ports: - 80:80 volumes: - /docker/mariadb:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: nextcloud
When you setup Nextcloud, you can connect the database through
mariadb because Docker Compose create a default network and the containers in the same network can resolve other IP address by host name.
There are many good self-host applications where you can take a look at Kickball/awesome-selfhosted. I am not able to talk about all of them.
Also, I found it is quite repetitive on how to setup different applications. You should able to setup most of them once you know how Docker works.
There will be Part 3 about how you write your own Dockerfile, build it and push it to Docker Hub.