my first docker article
This commit is contained in:
		
							
								
								
									
										203
									
								
								content/post/docker.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								content/post/docker.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,203 @@ | ||||
| --- | ||||
| title: "Docker" | ||||
| date: 2021-11-13 | ||||
| --- | ||||
|  | ||||
| # deploy docker container | ||||
|  | ||||
| ## systemd service file | ||||
| Generic systemd service file starting docker container using `docker compose` | ||||
| ``` | ||||
| [Unit] | ||||
| Description=%N service with docker compose | ||||
| Requires=docker.service | ||||
| After=docker.service | ||||
|  | ||||
| [Service] | ||||
| Restart=always | ||||
| TimeoutStartSec=1200 | ||||
|  | ||||
| WorkingDirectory=/etc/docker-compose/%N | ||||
|  | ||||
| # Remove old containers, images and volumes and update it | ||||
| ExecStartPre=/usr/bin/docker compose down -v | ||||
| ExecStartPre=/usr/bin/docker compose rm -fv | ||||
| ExecStartPre=/usr/bin/docker compose pull | ||||
|  | ||||
| # Compose up | ||||
| ExecStart=/usr/bin/docker compose up | ||||
|  | ||||
| # Compose down, remove containers and volumes | ||||
| ExecStop=/usr/bin/docker compose down -v | ||||
|  | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
| ``` | ||||
|  | ||||
| Create a folder /etc/docker-compose/<service-name> and place your docker-compose.yml there. | ||||
| Then symlink or copy the systemd service file to /etc/systemd/system/<service-name>.service. | ||||
|  | ||||
| You can start the container using | ||||
| ``` | ||||
| systemctl start <service-name> | ||||
| ``` | ||||
|  | ||||
| To automatically start the container when your server is booting enable the systemd service like any other service on your machine | ||||
| ``` | ||||
| systemctl enable <service-name> | ||||
| ``` | ||||
|  | ||||
| ## docker-compose examples | ||||
| ### portainer | ||||
| [Portainer](https://portainer.io) is a nice looking and easy to use web based frontend for managing all your docker containers. | ||||
| ``` | ||||
| version: '3' | ||||
|  | ||||
| services: | ||||
|   portainer: | ||||
|     image: portainer/portainer-ce:latest | ||||
|     container_name: portainer | ||||
|     restart: unless-stopped | ||||
|     security_opt: | ||||
|       - no-new-privileges:true | ||||
|     volumes: | ||||
|       - /etc/localtime:/etc/localtime:ro | ||||
|       - /var/run/docker.sock:/var/run/docker.sock | ||||
|       - /opt/portainer:/data | ||||
|     ports: | ||||
|       - 9000:9000 | ||||
| ``` | ||||
|  | ||||
| ### watchtower | ||||
| [Watchtower](https://containrrr.dev/watchtower/) keeps all your docker container up to date. | ||||
| The following compose file uses `WATCHTOWER_SCHEDULE` to configure execution time of the updates. | ||||
| ``` | ||||
| version: '3' | ||||
|  | ||||
| services: | ||||
|   watchtower: | ||||
|     image: containrrr/watchtower | ||||
|     restart: always | ||||
|     volumes: | ||||
|       - /var/run/docker.sock:/var/run/docker.sock | ||||
|       - /etc/timezone:/etc/timezone:ro | ||||
|       - /etc/localtime:/etc/localtime:ro | ||||
|     environment: | ||||
|     - WATCHTOWER_CLEANUP=true | ||||
|     - WATCHTOWER_INCLUDE_RESTARTING=true | ||||
|     - WATCHTOWER_SCHEDULE=0 0 23 * * * | ||||
|     ports: | ||||
|       - 8002:8080 | ||||
| ``` | ||||
|  | ||||
| ### monit | ||||
| ["Your faithful employee, Monit"](https://mmonit.com/monit/) ;-) | ||||
| A simple and easy to use monitoring solution for all of your services. | ||||
| ``` | ||||
| version: '3' | ||||
|  | ||||
| services: | ||||
|   monit: | ||||
|     image: maltyxx/monit:latest | ||||
|     container_name: monit | ||||
|     restart: unless-stopped | ||||
|     volumes: | ||||
|       - /etc/localtime:/etc/localtime:ro | ||||
|       - /opt/docker/monit/etc:/etc/monit | ||||
|       - /var/run/docker.sock:/var/run/docker.sock:ro | ||||
|     ports: | ||||
|       - 2812:2812 | ||||
|     environment: | ||||
|       - "MONIT_USERNAME=admin" | ||||
|       - "MONIT_PASSWORD=someSecretPassword" | ||||
| ``` | ||||
|  | ||||
| ### smokeping | ||||
| [Smokeping](https://oss.oetiker.ch/smokeping/) is a great way to blame your ISP.  | ||||
| "My services die when my roundtrip time to <random target server on the other side end of the world> exceeds 20ms". | ||||
| And best of all, it is written in perl. | ||||
| ``` | ||||
| version: '3' | ||||
|  | ||||
| services: | ||||
|   smokeping: | ||||
|     image: linuxserver/smokeping:latest | ||||
|     container_name: smokeping | ||||
|     restart: unless-stopped | ||||
|     volumes: | ||||
|       - /etc/localtime:/etc/localtime:ro | ||||
|       - /opt/docker/smokeping/config:/config | ||||
|       - /opt/docker/smokeping/data:/data | ||||
|     ports: | ||||
|       - 8001:80 | ||||
| ``` | ||||
|  | ||||
| ### ipv6nat | ||||
| A little tweak for dockers "great" IPv6 support :-/ | ||||
| ``` | ||||
| version: '3' | ||||
|  | ||||
| services: | ||||
|   ipv6nat: | ||||
|     image: robbertkl/ipv6nat:latest | ||||
|     container_name: ipv6nat | ||||
|     restart: always | ||||
|     privileged: true | ||||
|     volumes: | ||||
|       - /var/run/docker.sock:/var/run/docker.sock:ro | ||||
|       - /usr/lib/modules:/lib/modules:ro | ||||
|     cap_drop: | ||||
|       - ALL | ||||
|     cap_add: | ||||
|       - NET_RAW | ||||
|       - NET_ADMIN | ||||
|       - SYS_MODULE | ||||
|     network_mode: "host" | ||||
| ``` | ||||
|  | ||||
| ### atlas-probe | ||||
| A software probe for the [RIPE ATLAS](https://atlas.ripe.net/) project.  | ||||
| One of the more advanced examples I use. | ||||
|  | ||||
| The file creates a new network with IPv6 ULA addresses.  | ||||
| Yes I know ... but docker seem to lack such bleeding edge technology (aka prober IPv6 support). | ||||
| It limits resource usage (CPU, RAM) of the docker container as well.  | ||||
| ``` | ||||
| version: '3' | ||||
|  | ||||
| services: | ||||
|   atlas-probe: | ||||
|     image: jamesits/ripe-atlas:latest | ||||
|     container_name: atlas-probe | ||||
|     restart: unless-stopped | ||||
|     volumes: | ||||
|       - /etc/localtime:/etc/localtime:ro | ||||
|       - /opt/docker/atlas-probe/etc:/var/atlas-probe/etc | ||||
|       - /opt/docker/atlas-probe/status:/var/atlas-probe/status | ||||
|     cap_drop: | ||||
|       - ALL | ||||
|     cap_add: | ||||
|       - CHOWN | ||||
|       - SETUID | ||||
|       - SETGID | ||||
|       - DAC_OVERRIDE | ||||
|       - NET_RAW | ||||
|     environment: | ||||
|       - RXTXRPT=yes | ||||
|     deploy: | ||||
|       resources: | ||||
|         limits: | ||||
|           cpus: "1.0" | ||||
|           memory: "64M" | ||||
|         reservations: | ||||
|           memory: "64M" | ||||
|     networks: | ||||
|       - ripe-atlas-network | ||||
| networks: | ||||
|   ripe-atlas-network: | ||||
|     name: ripe-atlas-network | ||||
|     enable_ipv6: true | ||||
|     ipam: | ||||
|       config: | ||||
|         - subnet: fd00:a1a3::/48 | ||||
| ``` | ||||
		Reference in New Issue
	
	Block a user