|
@@ -0,0 +1,139 @@
|
|
|
+docker
|
|
|
+======
|
|
|
+
|
|
|
+This role will install Docker and given a list of containers to deploy, will do the following:
|
|
|
+
|
|
|
+1. Create needed docker networks
|
|
|
+2. Open up necessary firewall ports
|
|
|
+3. Generate docker-compose files (1 per container)
|
|
|
+4. Ensure container user/group exists
|
|
|
+5. Ensure container persistent directories exist with correct perms and SELinux contexts
|
|
|
+6. Generate a systemd service file per container
|
|
|
+7. Setup systemd timers to automatically pull new and purge old container images
|
|
|
+
|
|
|
+Requirements
|
|
|
+------------
|
|
|
+
|
|
|
+This role is only tested on Fedora/CentOS machines.
|
|
|
+
|
|
|
+Variables
|
|
|
+---------
|
|
|
+
|
|
|
+`container_user`: user name to run containers as (will be generated if not exists)<br>
|
|
|
+`container_uid`: uid of above user name<br>
|
|
|
+`container_group`: group name of container_user<br>
|
|
|
+`container_gid`: gid of above group name<br>
|
|
|
+
|
|
|
+Automated pulls and purges are handled by systemd timers. Any valid [systemd timer calendar event expression](https://www.freedesktop.org/software/systemd/man/systemd.timer.html#OnCalendar=) may be passed to them:
|
|
|
+
|
|
|
+`docker_pull_timer`: weekly<br>
|
|
|
+`docker_purge_timer`: monthly
|
|
|
+
|
|
|
+ global_env_vars: # will be set on any container which has include_global_env_vars: true
|
|
|
+ - PUID={{ container_uid }}
|
|
|
+ - PGID={{ container_gid }}
|
|
|
+ - TZ=America/Los_Angeles
|
|
|
+
|
|
|
+ firewall_ports: # list of ports to open up on the host
|
|
|
+ - 80/tcp
|
|
|
+ - 443/tcp
|
|
|
+
|
|
|
+Since this role sets up each container individually, if multiple containers need to talk directly to each other container networks must be outlined:
|
|
|
+
|
|
|
+This role sets up each container as an individual docker-compose.yml file with a 1-to-1 relationship with it's systemd service. This means we can not rely on docker-compose's built-in networking feature for connecting multiple containers together.
|
|
|
+
|
|
|
+Outline any networks you need via container_networks:
|
|
|
+
|
|
|
+ container_networks:
|
|
|
+ - name: nginx-proxy
|
|
|
+ driver: bridge
|
|
|
+ subnet: 172.21.10.0/24
|
|
|
+ ip_range: 172.21.10.0/24
|
|
|
+ gateway: 172.21.10.1
|
|
|
+
|
|
|
+And specify those networks in the corresponding container's dictionary:
|
|
|
+
|
|
|
+ containers:
|
|
|
+ - name: swag
|
|
|
+ active: true
|
|
|
+ image: linuxserver/swag
|
|
|
+ ports:
|
|
|
+ - 80:80
|
|
|
+ - 443:443
|
|
|
+ volumes:
|
|
|
+ - /opt/swag:/config
|
|
|
+ include_global_env_vars: true
|
|
|
+ environment:
|
|
|
+ - URL=myexamplesite.biz
|
|
|
+ - VALIDATION=http
|
|
|
+ - SUBDOMAINS=www,git,
|
|
|
+ - EMAIL=admin@myexamplesite.biz
|
|
|
+ restart: unless-stopped
|
|
|
+ memlimit: 300m
|
|
|
+ networks:
|
|
|
+ - nginx-proxy
|
|
|
+
|
|
|
+ - name: gogs
|
|
|
+ active: true
|
|
|
+ image: gogs/gogs
|
|
|
+ ports:
|
|
|
+ - "10022:22" # https://github.com/go-yaml/yaml/issues/34#issuecomment-55772666
|
|
|
+ volumes:
|
|
|
+ - /opt/gogs:/data
|
|
|
+ include_global_env_vars: false
|
|
|
+ restart: unless-stopped
|
|
|
+ memlimit: 500m
|
|
|
+ networks:
|
|
|
+ - nginx-proxy
|
|
|
+
|
|
|
+
|
|
|
+Usage
|
|
|
+-----
|
|
|
+
|
|
|
+This role creates docker-compose.yml files for each entry in the list of containers under the filename:<br>
|
|
|
+`/root/docker/<name>/docker-compose.yml`
|
|
|
+
|
|
|
+It also generates systemd services files of the name:<br>
|
|
|
+`/etc/systemd/system/<name>.service`
|
|
|
+
|
|
|
+This file is a simple wrapper around docker-compose:
|
|
|
+
|
|
|
+ [root@shareunderware ~]# systemctl cat swag.service
|
|
|
+ # /etc/systemd/system/swag.service
|
|
|
+ # This file is managed by Ansible. Any local changes may be wiped out!
|
|
|
+ [Unit]
|
|
|
+ Description=systemd wrapper around docker swag service
|
|
|
+ Requires=docker.service
|
|
|
+ After=docker.service
|
|
|
+
|
|
|
+ [Service]
|
|
|
+ Restart=always
|
|
|
+ User=root
|
|
|
+ Group=docker
|
|
|
+
|
|
|
+ ExecStartPre=/usr/bin/docker-compose -f /root/docker/swag/docker-compose.yml down -v
|
|
|
+ ExecStart=/usr/bin/docker-compose -f /root/docker/swag/docker-compose.yml up
|
|
|
+ ExecStop=/usr/bin/docker-compose -f /root/docker/swag/docker-compose.yml down -v
|
|
|
+
|
|
|
+ [Install]
|
|
|
+ WantedBy=multi-user.target
|
|
|
+
|
|
|
+This method allows the logs to be captured via journald and can be queried just like any other service:
|
|
|
+
|
|
|
+ [root@shareunderware ~]# journalctl -fu swag.service
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [cont-init.d] 70-templates: exited 0.
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [cont-init.d] 90-custom-folders: executing...
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [cont-init.d] 90-custom-folders: exited 0.
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [cont-init.d] 99-custom-files: executing...
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [custom-init] no custom files found exiting...
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [cont-init.d] 99-custom-files: exited 0.
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [cont-init.d] done.
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [services.d] starting services
|
|
|
+ Apr 25 04:20:59 shareunderware docker-compose[1956]: swag | [services.d] done.
|
|
|
+ Apr 25 04:21:03 shareunderware docker-compose[1956]: swag | Server ready
|
|
|
+
|
|
|
+
|
|
|
+License
|
|
|
+-------
|
|
|
+
|
|
|
+GPLv3
|