{"id":2625,"date":"2015-04-07T14:22:21","date_gmt":"2015-04-07T14:22:21","guid":{"rendered":"http:\/\/wiki.davelevy.info\/?p=2625"},"modified":"2026-03-10T17:27:19","modified_gmt":"2026-03-10T17:27:19","slug":"docker","status":"publish","type":"post","link":"https:\/\/davelevy.info\/wiki\/docker\/","title":{"rendered":"Docker"},"content":{"rendered":"\n<p>I originally said, &#8220;About Docker, looks awesome. Easy to create bootable, runnable images, easy to deploy because the global hub site is a crucial part of the proposition. The free usage of the hub, encourages the publication and sharing of images which are then imported over the internet.&#8221;<\/p>\n\n\n\n<p>I had another look in 2025, and assume that much of what I said is out of date and so shall be updating this page as I see necessary. <\/p>\n\n\n\n<p>Originally written the summer of 2015, and revised in the Summer of 2016<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>I&#8217;ll need to have a think about enterprise architectures and the needs for data leakage controls, but time for another day.<\/p>\n\n\n\n<p class=\"has-text-align-center\">Started | <a href=\".\/#vbox\">Virtual Box<\/a> | <a href=\".\/#manage\">Management <\/a>| <a href=\".\/#container\">Containers <\/a>| Virtual Networking | <a href=\".\/wordpress\">WordPress <\/a>| <a href=\".\/#mongo\">Mongo <\/a>| <a href=\".\/#apache\">Apache <\/a>| <a href=\".\/#background\">daemons<\/a> | <a href=\".\/#manage\">Shipyard <\/a>| <a href=\".\/#mnet\">More Networking<\/a> | <a href=\".\/#volumes\">Volumes &amp; Devices<\/a><\/p>\n\n\n\n<style>\n  \/* 1. Hide the actual checkbox input *\/\n  #toggle-input { display: none; }\n\n  \/* 2. Style the label to look like a button *\/\n  .button-label {\n    display: inline-block;\n    padding: 10px 20px;\n    background-color: #007BFF;\n    color: white;\n    cursor: pointer;\n    border-radius: 5px;\n    user-select: none;\n  }\n\n  .button-label:hover {\n    background-color: #0056b3;\n  }\n\/* 3. Hide the content by default *\/\n  .content {\n    display: none;\n    margin-top: 15px;\n    padding: 15px;\n    border: 1px solid #ddd;\n    background-color: #f9f9f9;\n  }\n\n  \/* 4. The Magic: If the checkbox is checked, show the content *\/\n  #toggle-input:checked ~ .content { display: block;}\n\n  \/* Optional: Change button text\/color when toggled *\/\n  #toggle-input:checked ~ .button-label {\n    background-color: #dc3545;\n  }\n\n<\/style>\n\n\n\n<h3 class=\"wp-block-heading\">Read these first<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In 2025, I installed using <a href=\"https:\/\/docs.docker.com\/engine\/install\/debian\/\">Install Docker Engine on Debian<\/a> at docker docks which includes the APT instructions. <\/li>\n\n\n\n<li><a href=\"https:\/\/docs.docker.com\/engine\/understanding-docker\/\">https:\/\/docs.docker.com\/engine\/understanding-docker\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/web.archive.org\/web\/20151018113620\/http:\/\/docs.docker.com\/articles\/basics\/\">https:\/\/docs.docker.com\/articles\/basics\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/web.archive.org\/web\/20151018114034\/http:\/\/docs.docker.com:80\/userguide\/\">https:\/\/docs.docker.com\/userguide\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.docker.com\/engine\/reference\/builder\/\">https:\/\/docs.docker.com\/engine\/reference\/builder\/<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.dockerbook.com\/, is now an advert for a book.\">http:\/\/www.dockerbook.com\/, is now an advert for a book.<\/a><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Getting Started<\/h3>\n\n\n\n<p>In 2025, I installed using <a href=\"https:\/\/docs.docker.com\/engine\/install\/debian\/\">Install Docker Engine on Debian<\/a> at docker docks which includes the APT instructions. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker &amp; dfl.ddns.net<\/h3>\n\n\n\n<p>That&#8217;s what I plan to do first, as ever develop on a VM and then deploy on the &#8216;pi. <\/p>\n\n\n\n<p>First I made a backup on github, but the ..\/share directory is too large to be uploaded. Currently neither gh nor the VM have a ..\/share folder. I&#8217;ll solve this later. <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Installing docker, <a href=\"https:\/\/docs.docker.com\/engine\/install\/debian\/\">https:\/\/docs.docker.com\/engine\/install\/debian\/<\/a><\/li>\n\n\n\n<li>then Docker Build, the dockerfile <a href=\"https:\/\/www.geeksforgeeks.org\/devops\/docker-copy-instruction\/\">needs<\/a> to be in the directory above the files to be used i.e. the subject of the copy statement. Seems a bit naff. More work to be done. See also <a href=\"https:\/\/docs.docker.com\/reference\/dockerfile\">https:\/\/docs.docker.com\/reference\/dockerfile<\/a>, <a href=\"https:\/\/docs.docker.com\/build\/\">https:\/\/docs.docker.com\/build\/<\/a>, <a href=\"https:\/\/phoenixnap.com\/kb\/docker-build\">https:\/\/phoenixnap.com\/kb\/docker-build<\/a>, <a href=\"https:\/\/www.linuxbash.sh\/post\/setting-up-apache-with-docker\">https:\/\/www.linuxbash.sh\/post\/setting-up-apache-with-docker<\/a> &amp; <a href=\"https:\/\/www.datacamp.com\/tutorial\/run-a-docker-image\">https:\/\/www.datacamp.com\/tutorial\/run-a-docker-image<\/a>. Remember the -t flag.\n<ul class=\"wp-block-list\">\n<li>I also found <a href=\"https:\/\/stackify.com\/docker-build-a-beginners-guide-to-building-docker-images\/\">https:\/\/stackify.com\/docker-build-a-beginners-guide-to-building-docker-images\/<\/a> which uses an npm project as its example. <\/li>\n\n\n\n<li>I asked some AI&#8217;s what the build file would look like: <a href=\"https:\/\/chat.deepseek.com\/a\/chat\/s\/2c0b7d24-986b-46bd-a0ea-de9a2b93444d\">deepseek <\/a>and <a href=\"https:\/\/chatgpt.com\/c\/69595874-c058-8328-90eb-dc96c5974dae\">chatgpt<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>docker image ls|rm &#8211; lists the images and removes an image, docker images is an alias for <code>ls<\/code><\/li>\n\n\n\n<li>docker run, remember the -p flag, &#8211;name and -d, the later being detached and docker stop<\/li>\n\n\n\n<li>Building an apache container, <a href=\"https:\/\/www.dotlinux.net\/blog\/apache-web-server-docker-image-deployment-and-usage\/#port-mapping-and-networking\">https:\/\/www.dotlinux.net\/blog\/apache-web-server-docker-image-deployment-and-usage\/#port-mapping-and-networking<\/a> <a href=\"https:\/\/www.docker.com\/blog\/how-to-use-the-apache-httpd-docker-official-image\/\">https:\/\/www.docker.com\/blog\/how-to-use-the-apache-httpd-docker-official-image\/<\/a>. For acquiring the web site, see <a href=\"https:\/\/stackoverflow.com\/questions\/24958140\/what-is-the-difference-between-the-copy-and-add-commands-in-a-dockerfile\">https:\/\/stackoverflow.com\/questions\/24958140\/what-is-the-difference-between-the-copy-and-add-commands-in-a-dockerfile<\/a><\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Useful Stuff<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>ftp mget <a href=\"https:\/\/unix.stackexchange.com\/questions\/26934\/using-sftp-to-transfer-a-directory\">takes<\/a> a -r flag, I wanted to <a href=\"https:\/\/www.couchdrop.io\/learn\/sftp-cli-commands\">check the other ftp commands<\/a>. In order to copy from live to backup I copied a folder at a time in order to exclude the ..\/share<\/li>\n\n\n\n<li>Looks like I am going to have to <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/howto\/reverse_proxy.html\">configure a &#8220;reverse proxy&#8221;<\/a> if I want multiple services presented through a single web page.<\/li>\n\n\n\n<li>I looked up some references about docker and systemd, but I am not yet ready to solve that problem. See <a href=\"https:\/\/blog.container-solutions.com\/running-docker-containers-with-systemd\">https:\/\/blog.container-solutions.com\/running-docker-containers-with-systemd<\/a> <\/li>\n\n\n\n<li>Install on an apt linux: <a href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/#install-from-a-package\">https:\/\/docs.docker.com\/engine\/install\/ubuntu\/#install-from-a-package<\/a>, there&#8217;s also this github page, <a href=\"https:\/\/github.com\/docker\/for-linux\">https:\/\/github.com\/docker\/for-linux<\/a> which also points at packages. <\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><br>For shipyard you will have to bind the docker engine to the host ports, see <a href=\".\/#mnet\">Networking Docker<\/a> below.. If using a Virtual Box guest this will need to be the ip address bound to the host driver. Shipyard is implemented as docker packages and can be implemented using <code>docker run<\/code> &amp; <code>docker pull<\/code> <strong>NB<\/strong> 2025 comment. <a name=\"vbox\"><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Virtual Box<\/h3>\n\n\n\n<p>If using a virtual box guest as a docker host, bridged networking no longer works for windows and two interfaces must be configured, NAT &amp; Hosted. I originally stated that &#8220;the IP address specified in the defaults file must be checked against the address used.&#8221; This needs to be checked in 2016. When binding the docker engine to the network, if needs to be bound to the Hosted interface. See <a href=\".\/#mnet\">Networking Docker<\/a> below.<a name=\"container\"><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Running a container.<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/web.archive.org\/web\/20151103081227\/http:\/\/docs.docker.com:80\/reference\/commandline\/cli\/\">https:\/\/docs.docker.com\/reference\/commandline\/cli\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/web.archive.org\/web\/20151020042155\/http:\/\/docs.docker.com:80\/reference\/run\/\">http:\/\/docs.docker.com\/reference\/run\/<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/17252356\/run-a-service-automatically-in-a-docker-container\">Run a service automatically in a docker container, from StackOverflow<\/a><a name=\"network\"><\/a><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Networking (Containers) 2016<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/web.archive.org\/web\/20171223150124\/http:\/\/blog.sequenceiq.com:80\/blog\/2014\/08\/12\/docker-networking\/\">http:\/\/blog.sequenceiq.com\/blog\/2014\/08\/12\/docker-networking\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/blog.codecentric.de\/en\/2014\/01\/docker-networking-made-simple-3-ways-connect-lxc-containers\/\">https:\/\/blog.codecentric.de\/en\/2014\/01\/docker-networking-made-simple-3-ways-connect-lxc-containers\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.docker.com\/engine\/userguide\/networking\/work-with-networks\/\">https:\/\/docs.docker.com\/engine\/userguide\/networking\/work-with-networks\/<\/a><\/li>\n<\/ol>\n\n\n\n<p>In 2016, I used the <code>EXPOSE <\/code>command with the <code>run -p<\/code> command; make sure the service is running; looks like the host web server needs to be turned off or at least not listening to the publicly exposed port. This <a href=\"https:\/\/docs.docker.com\/engine\/userguide\/networking\/default_network\/binding\/\">page in the Docker documentation<\/a> may apply, the link is repeated in the <a href=\".\/#mnet\">More Networking<\/a> section below.<a name=\"wordpress\"><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">WordPress<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/registry.hub.docker.com\/_\/wordpress\/\">https:\/\/registry.hub.docker.com\/_\/wordpress\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-dockerise-and-deploy-multiple-wordpress-applications-on-ubuntu\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-dockerise-and-deploy-multiple-wordpress-applications-on-ubuntu<\/a><\/li>\n<\/ol>\n\n\n\n<p>This is easy peasy, first we need the <em>name, <\/em>the&nbsp; <em>db root password<\/em> and <em>name of a mysql container<\/em> together with the <em>label<\/em> of a file system location, then,<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker pull wordpress\ndocker run -e WORDPRESS_DB_PASSWORD=${password} --name wordpress \\\n    -v ${whatever}:\/var\/www\/html --link ${db_container_name}:mysql \\\n    -p ${whatever}:80 -d wordpress\n<\/pre>\n\n\n\n<p>This code located the complete wordpress installation on the filestore location and therefore persists versions, themes, plugins and uploads directory.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mysql<\/h3>\n\n\n\n<p>Another daemon, and we need to be able to log in to the container to check the logs and diagnostics. Here&#8217;s the docker links, <a href=\"https:\/\/registry.hub.docker.com\/_\/mysql\/\">https:\/\/registry.hub.docker.com\/_\/mysql\/<\/a> and the code, <code>[sudo] docker pull mysql<\/code> gets the image, the docker file is documented <a title=\"on github, linked to from the docker hub page\" href=\"https:\/\/github.com\/docker-library\/mysql\/blob\/1f430aeee538aec3b51554ca9fc66955231b3563\/5.5\/Dockerfile\">here&#8230;<\/a><\/p>\n\n\n\n<input type=\"checkbox\" id=\"toggle-input\">\n  \n  <label for=\"toggle-input\" class=\"button-label\">\n    Click to toggle old mysql Content\n  <\/label>\n\n  <div class=\"content\">\n<p>So, <\/p>\n<pre class=\"wp-block-preformatted\"># written 2 Sep 2016\ndocker pull mysql\n...\nsudo mkdir \/data\nsudo mkdir \/data\/mysql${UNIQ_ID}\n\ndocker run --name some-mysql -v \/data\/mysql$UNIQ_ID}:\/var\/lib\/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql\ndocker exec -it --name somemysql-client some-mysql bash\n<\/pre>\n<p>The last command can be implemented via shipyard. Inspect the container and then enter the console and ask for a bash shell. In the bash shell, you can execute<\/p>\n<p><code>mysql -uroot -pmy-secret-pw<\/code><a name=\"mongo\"><\/a><\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Apache<\/h3>\n\n\n\n<p>I used apache as my first exercise, and created two images in the docker hub, one has no run instructions, the second <a href=\"https:\/\/hub.docker.com\/r\/dfl1955\/apache2d\/\">apache2d<\/a> is designed to run as a daemon. It was updated in 2016.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">docker run -d<\/h3>\n\n\n\n<p>The container command that is the final argument to <code>docker run -d<\/code> must not be a background process, or more accurately mustn&#8217;t be a nohup call to a service daemon. i.e. the daemon program call must be used.<\/p>\n\n\n\n<p><code>service apache2 start<\/code> is no good, \/usr\/sbin\/apache2 is required, and it seems we have a -D flag to force foreground execution. This is a feature of the apache binary, but for other services it may become a part of the service control standards? Anyway the runes are,<\/p>\n\n\n\n<p><code>$ dosh run -d dfl1955\/apache2&nbsp;\/usr\/sbin\/apachectl -D FOREGROUND<\/code><\/p>\n\n\n\n<p>where dosh is an alias for &#8220;sudo docker&#8221;. This <a title=\"Install and run a web server in a docker container\" href=\"https:\/\/web.archive.org\/web\/20180617212218\/http:\/\/slopjong.de:80\/2014\/09\/17\/install-and-run-a-web-server-in-a-docker-container\/\">article by slopjong<\/a> was most helpful once I understood that a docker daemonised\/detached container <strong>must<\/strong> take the server i.e. the unending program as the argument and once I understood that the -D flag would force apache to run in the FOREGROUND. This <a title=\"first steps with docker, creating an apache image\" href=\"http:\/\/www.monblocnotes.com\/node\/2057\">article by someone called Mon, speaks of how to use <code>run -i -t<\/code><\/a> to start an apache service in an interactive container<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Private Registries<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/blog.docker.com\/2013\/07\/how-to-use-your-own-registry\/\">https:\/\/blog.docker.com\/2013\/07\/how-to-use-your-own-registry\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.docker.com\/registry\/deploying\/\">https:\/\/docs.docker.com\/registry\/deploying\/<\/a><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">boot2docker<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"http:\/\/odewahn.github.io\/docker-jumpstart\/boot2docker.html\">http:\/\/odewahn.github.io\/docker-jumpstart\/boot2docker.html<\/a><a name=\"manage\"><\/a><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Managing (Shipyard)<\/h3>\n\n\n\n<p>Docker Shipyard is a management tool for Docker containers that provides a graphical user interface (GUI) for deploying, managing, and orchestrating Docker resources like containers and images. It simplifies the management of Docker environments, allowing users to easily start, stop, and monitor their containers. (2025).<\/p>\n\n\n\n<input type=\"checkbox\" id=\"toggle-input\">\n  \n  <label for=\"toggle-input\" class=\"button-label\">\n    Click to toggle old Content\n  <\/label>\n\n  <div class=\"content\">\n<p>I returned to Docker in 2016.<\/p>\n<p>In order to install Shipyard, I worked through all the instructions at <a href=\"https:\/\/shipyard-project.com\/docs\/deploy\/manual\/\">https:\/\/shipyard-project.com\/docs\/deploy\/manual\/<\/a>.<\/p>\n<p>A google search in 2015 brings up some videos and https:\/\/docs.shipyard.build\/docker-compose .<\/p>\n<p>This eventually comes up. It can see no resources. I then bound the docker engine to the ipv4 address. See <a href=\"https:\/\/davelevy.info\/wiki\/wp-admin\/#mnet\">Networking Docker<\/a> below. On the way I created a local registry, it made no difference, maybe I&#8217;ll suss this out next. It is necessary to bind the docker daemon to tcp and not a file based socket. i.e. the daemon has to be a network resource. (Obvious really)<\/p>\n<p>Here&#8217;s how;<\/p>\n<ol>\n<li>Read the Shipyard Documentation.<\/li>\n<li>Ignore everything google says about V1, which will talk about an agent.<\/li>\n<li>Bind the docker daemon to a tcp location, this will be not be 127.0.0.1, nor its alias. It&#8217;s possible that the Virtual Box host makes a difference.<\/li>\n<li>The dashboard is on 8080 and has initial password credentials of admin\/shipyard.<\/li>\n<\/ol>\n<li>Here&#8217;s a link, <a href=\"http:\/\/shipyard-project.com\/\">http:\/\/shipyard-project.com\/<\/a>.<\/li>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Networking Docker<\/h3>\n\n\n\n<p>This section was written in 2014. This <a href=\"http:\/\/serverascode.com\/2014\/05\/25\/docker-shipyard-multihost.html\">article refers to Shipyard V1<\/a> which now superseded. It documents how to bind the daemon to the network. It involves editing, <code>\/etc\/default\/docker<\/code> and amending the <code>DOCKER_OPTS<\/code> flag. It should be noted that 127.0.0.1 is a relative address and thus the tcp\/ip address of the daemon host should be used. I have not tested if the hosts file alias works or not. The Shipyard quick start points to <a href=\"https:\/\/web.archive.org\/web\/20151018113620\/http:\/\/docs.docker.com\/articles\/basics\/\">a section, bind docker to another host port&#8230;.<\/a> in the Docker Basics documentation.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"http:\/\/serverascode.com\/2014\/05\/25\/docker-shipyard-multihost.html\">http:\/\/serverascode.com\/2014\/05\/25\/docker-shipyard-multihost.html<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/web.archive.org\/web\/20151018113620\/http:\/\/docs.docker.com\/articles\/basics\/\">https:\/\/docs.docker.com\/articles\/basics\/#bind-docker-to-another-hostport-or-a-unix-socket<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.docker.com\/engine\/userguide\/networking\/default_network\/binding\/\">https:\/\/docs.docker.com\/engine\/userguide\/networking\/default_network\/binding\/<\/a><\/li>\n<\/ol>\n\n\n\n<p>I have set the default file, <code>\/etc\/default\/docker<\/code> to<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DOCKER_OPTS=\"-H tcp:\/\/192.168.0.20x:2376  \\\n             -H unix:\/\/\/var\/run\/docker.sock\"<\/pre>\n\n\n\n<p>This was found in 2016, may be worth checking out.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"http:\/\/containertutorials.com\/network\/basic_network.html\">http:\/\/containertutorials.com\/network\/basic_network.html<\/a><a name=\"volumes\"><\/a><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Volumes and Devices<\/h3>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Docker Volume Vs Mount: Difference between Docker Volume and Mount | Docker Tutorial\" width=\"1099\" height=\"618\" src=\"https:\/\/www.youtube.com\/embed\/uhDYhdMmSeg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>This was found in 2025 as the one originally chosen had gone away.<\/p>\n\n\n\n<p>Use volumes for extent based databases i.e. data managers with large files.<\/p>\n\n\n\n<p>We have the choice of using&nbsp; docker volumes or remote file systems.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I originally said, &#8220;About Docker, looks awesome. Easy to create bootable, runnable images, easy to deploy because the global hub site is a crucial part of the proposition. The free usage of the hub, encourages the publication and sharing of images which are then imported over the internet.&#8221; I had another look in 2025, and&#8230;<\/p>\n","protected":false},"author":1,"featured_media":13755,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_share_on_mastodon":"0"},"categories":[3],"tags":[872,871,54,916,878,911],"class_list":["post-2625","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology","tag-deployment","tag-docker","tag-howto","tag-linux","tag-shipyard","tag-technology"],"share_on_mastodon":{"url":"","error":""},"jetpack_featured_media_url":"https:\/\/davelevy.info\/wiki\/wp-content\/uploads\/2015\/04\/docker-2017-w1080.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/posts\/2625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/comments?post=2625"}],"version-history":[{"count":35,"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/posts\/2625\/revisions"}],"predecessor-version":[{"id":14022,"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/posts\/2625\/revisions\/14022"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/media\/13755"}],"wp:attachment":[{"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/media?parent=2625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/categories?post=2625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/davelevy.info\/wiki\/wp-json\/wp\/v2\/tags?post=2625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}