Docker (software): Difference between revisions

 
(19 intermediate revisions by the same user not shown)
Line 8: Line 8:
===Ubuntu===
===Ubuntu===
[https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-engine---community-1 Reference]
[https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-engine---community-1 Reference]
{{hidden | Install Script |
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# Uninstall old docker
# Uninstall old docker
Line 36: Line 37:
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo apt-get install docker-ce docker-ce-cli containerd.io
</syntaxhighlight>
</syntaxhighlight>
}}


===Windows===
===Windows===
Line 44: Line 46:
==Guides==
==Guides==
[https://docs.docker.com/get-started/ Get Started]
[https://docs.docker.com/get-started/ Get Started]
==Dockerfile==
How to write a dockerfile


==CLI Usage==
==CLI Usage==
Line 55: Line 60:
# Prune unused images.
# Prune unused images.
docker image prune -a
docker image prune -a
# Copy image.
docker tag $SOURCE $TARGET
docker push $TARGET
</syntaxhighlight>
</syntaxhighlight>


Line 107: Line 116:
See [https://github.com/docker/compose/issues/6691 issue].
See [https://github.com/docker/compose/issues/6691 issue].
<pre>
<pre>
  deploy:
    deploy:
       resources:
       resources:
         reservations:
         reservations:
           devices:
           devices:
             - capabilities:
             - driver: nvidia
               - gpu
              count: 1
               capabilities: [gpu]
</pre>
</pre>


Line 147: Line 157:


===Compose file===
===Compose file===
See [https://github.com/compose-spec/compose-spec/blob/master/spec.md#compose-file compose-file specs]
See [https://docs.docker.com/compose/compose-file/compose-file-v3/ Compose file specification].


Previously, the Compose file (<code>docker-compose.yml</code>) required a version. Version 2 and version 3 had different options and not all options from version 2 were available in version 3. However, as of docker-compose v1.27+, you should no longer specify a version and options from both versions are supported.
Previously, the Compose file (<code>docker-compose.yml</code>) required a version. Version 2 and version 3 had different options and not all options from version 2 were available in version 3. However, as of docker-compose v1.27+, you should no longer specify a version and options from both versions are supported.
{{hidden | Example docker-compose.yml |
<syntaxhighlight lang="yaml">
services:
  web:
    image: registry.gitlab.davidl.me/dli7319/davidl_me:latest
    restart: unless-stopped
</syntaxhighlight>
}}


==Accessing the Host==
==Accessing the Host==
Line 165: Line 184:
* You do not need to add <code>expose</code>.
* You do not need to add <code>expose</code>.


By default, networks are allocated with ip ranges:
* 172.17.0.0/12 with size /16
* 192.168.0.0/16 with size /20
If you want this to be more consistent, you can change it as follows:
Set the following in <code>/etc/docker/daemon.json</code>:
Set the following in <code>/etc/docker/daemon.json</code>:
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
   "default-address-pools":[
   "default-address-pools":[
     {"base":"172.17.0.0/12","size":24}
     {"base":"172.16.0.0/12","size":24}
   ]
   ]
}
}
</syntaxhighlight>
</syntaxhighlight>
Then restart your docker: <code>sudo systemctl restart docker</code> and prune networks <code>docker network prune</code>.<br>
Then restart your docker: <code>sudo systemctl restart docker</code> and prune networks <code>docker network prune</code>.<br>
This will force docker to assign subnets from 172.16.0.0/24 to 172.32.255.0/24 instead of 172.16.0.0/12 to 172.32.0.0/12.<br>
Thus it won't overflow to 192.168.0.0/24.<br>
Next, in your firewall, allow connections to your localhost from 172.16.0.0/12.
Next, in your firewall, allow connections to your localhost from 172.16.0.0/12.
<pre>
ufw allow from 172.16.0.0/12 to any comment "from_docker"
</pre>
==Registries==
The official Docker registry is [https://hub.docker.com/ Docker Hub].<br>
However, [https://www.docker.com/increase-rate-limits/ Docker Hug has rate limits] of 100 pulls per 6 hours.<br>
Alternative public registries:
* [https://gallery.ecr.aws/ AWS ECR Gallery] has a mirror for all official docker containers.
==Caching==
If you want your builds to be fast on CICD, you have to setup [https://docs.docker.com/build/cache/ caching].
In particular you should:
* Enable [https://docs.docker.com/build/buildkit/ buildkit] by setting the environment variable <code>DOCKER_BUILDKIT=1</code>
* Use <code>--cache-from</code> in your build.
* Setup external caching, e.g. with <code>--build-arg BUILDKIT_INLINE_CACHE=1</code>.
** Use <code>--arg BUILDKIT_INLINE_CACHE=1</code> if using <code>docker buildx build</code>.
* For multistage builds, cache each stage in your container registry.
;Resources
* https://michalwojcik.com.pl/2021/01/21/using-cache-in-multi-stage-builds-in-gitlab-ci-docker/
* https://testdriven.io/blog/faster-ci-builds-with-docker-cache/#multi-stage-builds
==Useful Services==
* [https://containrrr.dev/watchtower/ https://containrrr.dev/watchtower/] is a tool which will automatically update your docker containers when new images are published. It also has an http endpoint to trigger checks manually e.g. from CI/CD.
==My Images==
I have a few custom container images below:
* [https://github.com/dli7319/docker-anki-server ghcr.io/dli7319/docker-anki-server:main]
* [https://github.com/dli7319/docker-nextcloud ghcr.io/dli7319/docker-nextcloud:main]
* [https://github.com/dli7319/docker-mediawiki ghcr.io/dli7319/docker-mediawiki:main]


==Resources==
==Resources==
* [https://www.youtube.com/watch?v=fqMOX6JJhGo freeCodeCamp.org Docker Tutorial for Beginners Video]
* [https://www.youtube.com/watch?v=fqMOX6JJhGo freeCodeCamp.org Docker Tutorial for Beginners Video]