shykes 2 hours ago

Hi, I'm the creator of Docker and came across this post. It's always fun to see other engineers think about how you designed a system. I haven't been involved in developing Docker in many years, but it's a fun trip down memory lane.

I'm happy to answer any questions you may have.

  • irishcoffee 2 hours ago

    Oh wow, hi! I think my biggest “gripe” with docker is that everyone grabs it as a hammer and views many problems as a nail. Am I way off base with that? What was your original vision for how docker might be used in the wild?

  • skinfaxi 2 hours ago

    Given how things have changed since your creation and the way things are going, are there any things you would have done differently?

    • shykes 1 hour ago

      There are many. But there is an alternative universe where I remained CEO instead of transitioning to CTO, and continued pursuing my product vision obsessively instead of compromising on it because of lack of self-confidence and a desire to be loved. I think I would have avoided a lot of the mistakes that the company made - but on the other hand, I would have made a fresh set of mistakes instead, so who knows what the outcome would have been!

  • gradus_ad 2 hours ago

    General question. When you were designing Docker, did you anticipate the success it would achieve?

    • shykes 2 hours ago

      To give a sense of time: Docker launched in 2013, but it was one of many iterations of the same project, which I had been working on continuously since 2008. Over those 5 years, virtually nobody cared or understood what the hell I was working on. I lived in France and had no connection to the tech industry.

      So, not only did I not anticipate this kind of success, I did not even have a reference frame for what success might even look like. All I knew was, I had an itch that I had to scratch, and I had nothing better to do :)

      • Waterluvian 2 hours ago

        Was it always called Docker? Do you think the branding played a larger role in success than you would have expected?

        • ak217 1 hour ago

          I believe Docker was always called Docker, but it grew directly out of the previous generation of the technology used by dotCloud (the company Solomon founded), which was using LXC with AUFS.

          I think the breakthrough with Docker was bundling the AUFS-based image layer format with a centralized container image sharing registry. This was revolutionary at the time. But another huge element of success was Solomon and others evangelizing the technology relentlessly at meetups and conferences. I distinctly remember attending a demo in 2012 where the crowd was very excited to see the Docker workflow that we now take for granted, in large part because Solomon was so good at presenting it. At the time, I was working at a cloud PaaS company where we developed a similar technology on top of LXC and BTRFS (but no image registry). Docker really made me think hard about what we were doing, although I didn't end up making any moves.

          https://jpetazzo.github.io/2017/02/24/from-dotcloud-to-docke...

      • ecliptik 2 hours ago

        In those years in the systems group I was working in at a fortune 500, we were very interested in this type of technology. Mostly using Solaris Zones and cgroups and trying to do this ourselves with limited results.

        When Docker came out it solved so many issues we were having. Thank you for scratching that itch.

      • xtracto 1 hour ago

        I remember in 2013 the first time someone showed me Docker [im in Mexico]. My first thought is that we already had Vagrant for setting up and running virtual machines through console.

        I didnt get it at that time haha.

  • layer8 2 hours ago

    If you were implementing an operating system (free from compatibility concerns), what would you do differently to better support lightweight containers?

  • figmert 2 hours ago

    I'm curious what made think of it in the first place? What was your thought process that made you think that these Linux primitives give the opportunity to make it a platform for distributing and deploying packaged applications and eliminating a lot of the issue around "it works my machine" argument?

    You may have already answered this somewhere, so feel free to tell me what to search for or if you have a link to hand, that works too :)

    • bijmtir 1 hour ago

      Docker was basically a commercialisation of lxc and now we got nspawn going full circle.

      • iJohnDoe 1 hour ago

        I’m a huge fan of nspawn. Always wanted to use VMs instead of Docker and nspawn feels like a natural choice.

        • miladyincontrol 1 hour ago

          Its nice having the flexibility for both system containers and application containers. It does feel though that most people forget that nspawn does both, and that it only can do system containers.

          • iJohnDoe 1 hour ago

            Agreed, I briefly forgot it can do both. Thanks for the reminder.

            I went down the rabbit hole of Incus and once I realized it requires the full network aspects to be configured, then I figured using KVM, QEMU, Libvirt was more practical. Then stumbled into nspawn and it was basically ready to go.

            Although, I haven’t done enough research to know if Incus provides certain useful capabilities.

            • radlad 48 minutes ago

              I'm a huge fan of Incus. VMs, LXC, and OCI containers all under the same Docker-like CLI interface. I run it on a local server and on a dedicated server in a local DC, and connect to both remotely using Nebula.

              It includes project-level resource separation, advanced networking, clustering, snapshots, and more. Plus, Stéphane Graber is super responsive on the forums and issue tracker. I bounced off of Proxmox, and can't recommend Incus more for hypervisor-type scenarios.

      • lostlogin 1 hour ago

        The LXC way of getting an up per container is pretty great - I’m basic bitch with this sort of thing so I assume it’s less of an issue for the experts but really enjoyed the IP per container when I hit it.

      • shykes 1 hour ago

        This is incorrect.

        Docker in its earlier incarnations was based on openvz, which predates lxc. The lxc project was initially a kernel development project: a collection of kernel patches to add container support. The userland tool was just a companion. When it became apparent that these patches would "win" the race to be upstreamed even though openvz was much more mature, we switched our tooling to lxc. The patches matured over time, but the userland tool (what we now know as "lxc") was finicky.

        The original open-source release of Docker wrapped lxc for low-level container operations. But it was just too unreliable and we swapped it out for an in-house Go implementation called "libcontainer".

        As for "commercializing": Docker was famously bad at commercializing anything, we open sourced so much (maybe too much) and still people complained that we were not open enough.

        • bijmtir 1 hour ago

          Was it based on openvz or wrapped lxc?

          And just because you do something bad doesn’t mean we can’t call it what it was. A bad attempt at lying is still a bad attempt for example.

          • shykes 1 hour ago

            Earlier incarnations of the project (2008-2011) were python based on openvz+aufs, with the very first prototypes (2007-08) wrapping vserver. We started the transition to lxc+aufs in 2011. Open-sourced the lxc wrapper in 2013. Replaced it with libcontainer in... 2014 I believe?

        • js2 1 hour ago

          Huh, according to wikpedia, OpenVZ and Solaris Zones (Containers) were both released in 2005. My memory was that Solaris was first and OpenVZ was a copy cat, but I guess not.

        • stingraycharles 53 minutes ago

          “Docker was famously bad at commercializing anything, we open sourced so much (maybe too much) and still people complained that we were not open enough”

          Developers are a tough market to please, especially when your business revolves around open source software.

          Unless you have an option to do private cloud hosting (like all these databases and other platforms do), it’s incredibly difficult to monetize.

          In the case of docker, I think it’s in the nature of the product that it’s difficult to monetize. Best you can do is enterprise support contracts, but those aren’t good enough to justify all that VC funding.

          • dralley 8 minutes ago

            I don't think it's necessarily that difficult to monetize, they just ignored a lot of the needs of enterprise users (rootless, not punching holes in the firewall, not fighting with systemd, private registries) for long enough that other projects (e.g. Podman, Quay) filled the void.

        • zoeysmithe 37 minutes ago

          In the end, how were you able to monetize Docker?

  • okanat 2 hours ago

    Would you consider writing Docker/moby in a different language, if you were to create it scratch today?

    • shykes 2 hours ago

      Oh gosh, the choice of language is such a context-specific design decision. The first versions of what became Docker were written in Python. The choice of Go was a mix of nerdy excitement ("it's like the best of Python and C!"), and adoption strategy: back then devops tools were segmented by language runtime: ruby, python or Java mostly. Shipping a compiled binary allowed us to be adopted by all tribes.

      None of these things can be transposed today, so I guess I can't answer...

      For what it's worth, my current project (dagger) is written in Go.

  • Tenemo 2 hours ago

    Do you think e.g. students learning docker syntax at a uni is beneficial in 2026 or you think LLM-assisted programming means that Docker will become an abstraction under an abstraction and its setup will be mostly automated by LLMs? I find myself very rarely debugging or handwriting dockerfiles nowadays!

    • craftkiller 1 hour ago

      This is a strange question because you could learn Dockerfile syntax in a single night. There are only 18 directives, and the average Dockerfile uses like 6 of them. 90%+ of Dockerfiles is just "run this shell command" and "copy this file into the docker image". The only time it flirts with complexity is multi-stage Dockerfiles, but 90%+ of Dockerfiles are a single stage.

      https://docs.docker.com/reference/dockerfile/

      • koolba 7 minutes ago

        > The only time it flirts with complexity is multi-stage Dockerfiles, but 90%+ of Dockerfiles are a single stage.

        And multi stage builds are just a directed graph short hand for having separate intermediate dockerfiles. There’s nothing special about them either.

        If I had to pick one thing that is tricky for someone new to docker to understand, it’s how the filesystem state is cached using the previous state, the env, and the raw command text.

    • xyzzy_plugh 1 hour ago

      I'm gonna be real with you. No one needs to know docker syntax. Most engineers just copy and paste chunks of Dockerfiles around anyways.

      Docker syntax is one of those things that just immediately falls out of my head when I close the editor. I don't care about it at all.

      Even better: there are many, many tools that build OCI images without using the Docker syntax. I haven't hand-written a Dockerfile in at least six years.

      LLMs have not loved the needle here in my sphere, it was already bouncing off of the zero on the gauge.

      edit: this isn't to say the syntax is good or bad (though there are several questionable parts of it) but extremely simple, and concise enough that you can just look up literally any command with great ease. It's surely a large part of its success, for better or for worse.

  • davnicwil 2 hours ago

    I'm a big fan of docker and mainly just want to say thanks for bringing it about.

    I remember my first time trying to use a container was about 2015 on a beach cafe's wifi in Bocas del Toro, Panama. You can imagine how it went...

    After a brief hiatus though I was back to it and since then it's been a core part of many a local dev stack and even production stack (compose) I've set up. I recall the magic moment for me being when I first realised you could mount src to use all your local native dev tools while completely virtualising everything else, including and especially whatever combo of runtimes and dependencies you need.

    It was just a lightbulb moment, like it entirely solves 'works on my machine', setting new people up on a project, it just seems like how software engineering ought to work and once you have experienced it it's difficult to go back.

    I'm curious, as its creator are you still using it, or as someone who can clearly look ahead to experimental ways of doing things are you on to the next thing whatever that may be? If so, what is it? :-)

    • shykes 7 minutes ago

      Thank you for sharing that!

      Yes, I still use Docker. Although my way of using it has changed over time, like many others I assume.

      My new project, Dagger, although it doesn't directly compete with Docker, does implement its own container runtime and orchestrator (for CI pipelines), and we recently added compatibility with Dockerfiles and Docker Compose files... So increasingly I find myself using Dagger instead of Docker, in the context of my CI pipelines.

      On the other hand, I use docker compose on almost every personal project - like a minecraft server for my kids, home automation, AI hacks, etc. These days I just let my AI agent set it up for me, though :)

  • Fabricio20 2 hours ago

    Thanks for developing such a valuable tool!

  • 999900000999 1 hour ago

    Thank you.

    For one, did you get rich beyond all comprehension and did you start a band with your wealth?

    Second, do you still program ?

    I was lucky enough to get in this industry when Docker was new. Sure beats trying to figure out why X happens on machine A and doesn’t on machine B.

    • shykes 1 hour ago

      I did make a bunch of money with Docker, something I am eternally grateful for.

      I did not start a band, but I did build a nice house, help my family etc.

      I still program everyday, working on my second startup, https://dagger.io (please forgive the plug). We have a very active discord if you want to come say hi.

      • 999900000999 54 minutes ago

        I work heavily with CI/CD. From a quick glance Dagger looks very promising and I might experiment with it this weekend.

        I guess my follow up question is once you’re financially independent, what continues to motivate you?

        Is it fun?

        Do you feel like you’re creating tools that the industry needs.

        I imagine if I ever get rich I’d work on music and small games.

        Video games that you buy once and get to play forever, self host, etc. With a full open source commitment within 5 years or so. I’d probably create a game studio in a lower cost of living country though.

  • operator-name 1 hour ago

    I’d love to hear more about some limitations/tradeoffs of docker that you made at the time that you regret in hindsight. Was there anything that you wish didn’t get baked into the “default norms” for containers, or areas that would benefit from more attention and redesigns?

    I’ve been following dagger and it’s been really interesting to see the evolution of the design, and new set of abstractions. There’s also nix which has seen popularity, with their approach of building layered oci containers.

  • potsandpans 1 hour ago

    A while back you had this tweet which often gets cited, or at least _i_ personally think about it a lot.

    > If WASM+WASI existed in 2008, we wouldn't have needed to created Docker. That's how important it is. Webassembly on the server is the future of computing. A standardized system interface was the missing link. Let's hope WASI is up to the task!

    How are you feeling about WASI today?

  • cole_dev 1 hour ago

    Thanks for your innovation and helping developers! If Docker hasn't been your focus in recent years, what have you mainly been working on and what's been your favorite?

  • stroebs 1 hour ago

    Were you around for the big Moby open sourcing? What went down from your perspective? If I recall, it was a fairly dramatic move that was not driven by the interests of Docker corp.

  • verdverm 1 hour ago

    What learnings did you take from Docker when conceiving Dagger? Or is it more about unlocking BuildKit?

  • memset 32 minutes ago

    I was a dotcloud customer around 2012. You might have responded to one of my many support emails.

    • shykes 11 minutes ago

      Ha ha, thank you for your trusting us back then! Hopefully it was a good experience? Scaling reliably on AWS was not so simple back then...

  • shepherdjerred 18 minutes ago

    I hope one day I can say something like “I made Docker” :,)

  • fnord77 15 minutes ago

    How does it feel to have fundamentally changed how many/most enterprise software runs?

  • debarshri 7 minutes ago

    So you are responsible for my career and the reason i can put food on my table. Thank you.

    People are underestimating now big of a tech shift it was back in the day.

    • gigatree 4 minutes ago

      No that’s all you. He just made it easier.

vbezhenar 10 minutes ago

What made Docker unique IMO is not the container technology itself. I used chroot 20 years ago and it worked just fine. Yes, no network namespaces; no process namespaces, but I don't even think these are that important.

What made Docker unique were there things:

1. Dockerfile concept. Building images layer by layer. Caching layers. Everything in a single file. It made possible to iterate on image quickly. It made possible to implement CI builds efficiently.

2. Docker network registry concept. Putting universal images onto a server and share them with the world.

3. Momentum. A lot of software that was traditionally complicated to deploy, suddenly appeared in docker servers. I remember how fascinated I was, when I could deploy wordpress website with tiny docker-compose. And how contained it was. I could just delete every trace of it from my host. I always felt uneasy installing various things onto my host and docker just solved that uneasiness.

slowin 1 hour ago

I prefer Podman most of the time, but Docker is/was amazing and a great DX put on top of the so called "5 different linux kernel features in trenchcoat". That's the selling point, it's super lightweight and takes full advantage of the OS features that were already there (or being developed) but were awkward to use and required tons of specialized knowledge.

  • kvirani 31 minutes ago

    Does Postman sidestep these weird things about Docker? Or just some of them?

    • thayne 3 minutes ago

      I assume you mean podman?

      The first two are just kind of the nature of containers on linux, and applies to any container technology.

      Podman does allow you to run it as a non-root user (with some limitations), that was in fact one of the biggest motivations for making podman. This wasn't possible at all in the early days of docker, it wasn't until linux introduced user namespaces, where the root user inside the namespace mapped to a non-root user id outside the namespace that non-root conatiners were possible.

      And podman, unfortunately IMO, is also written in go.

sreekanth850 13 minutes ago

I started hating Docker after seeing all the cargo culting on Reddit. Whenever someone asks about deploying an app on Linux, there's always at least one comment saying, Just use Docker. We finally ended up building our own deployment automation tool for our entire stack that doesn't use Docker at all.

suprjami 2 hours ago

Always nice to see someone demystifying a complex thing by learning the building blocks it's made from.

Knowing this, you might find rootless Podman's fork-exec method of starting containers to be more sensible. I certainly do. No root, no daemon, no socket.

If you want to learn more about the Linux Kernel namespaces which work together to make a container, this LWN series is really good: https://lwn.net/Articles/531114/

tyingq 2 hours ago

Poke around in bocker[1]. For technical people, it makes the same points the article makes in a way that's very clear.

[1] "Docker implemented in around 100 lines of bash" https://github.com/p8952/bocker

j16sdiz 1 hour ago

Every statement in the article make me ask: "what's weird about it?"

Everything in that list feel natural when you know how things evolves over many years. Maybe it is just me getting older and less curious.

  • paxy 1 hour ago

    A lot of people start using Docker as a black box and have the mental model of a VM, and when they start digging into the internals all the "weirdness" starts to exhibit itself.

    • dboreham 1 hour ago

      These days they may as well have the mental model of Docker when they start using a VM :)

    • j16sdiz 54 minutes ago

      Maybe. That's why i start thinking i am getting old and less curious :(

  • stingraycharles 1 hour ago

    And not a single mention of the actual weird decision, a client / server model which complicates permission management by at least two orders of magnitude.

    • slowin 1 hour ago

      This is why I prefer Podman.

    • modeless 1 hour ago

      Yeah, the daemon is the real problem with Docker.

    • schmichael 21 minutes ago

      lxc never had a daemon but Canonical added one (lxd in 2015) and lxc forked it to incus to be community managed.

      rkt (2013) was CoreOS's alternative to Docker and was daemon-less and failed.

      Podman came along relatively late (2018) and benefited from a lot of Linux kernel and systemd improvements since Docker was designed.

      So while arguably the client/server model is outdated for container management tools, I'm not sure it's weird. This is my workstation for example:

        schmichael@fedora:~$ ps -e -o comm= | rg 'd$' | wc -l
        67
      

      Daemons are maybe the least weird paradigm you can choose for a Unix program.

thayne 20 minutes ago

Today, I would definitely choose rust over go. And I lament that so much container software uses go rather than rust. But back when docker started rust was a lot less mature and probably wouldn't have been a good choice.

  • vbezhenar 8 minutes ago

    C was and is a good choice for that kind of software. I don't understand the prevalence of Go in these tools.

gzapp 2 hours ago

That part about the threading was a huge source of issues back in the early days. Goroutines could hop threads and it's the threads namespace/cgroup configuration that gets inherited when forking..

One of the gnarliest issues I recall was where network namespaces could occasionally not be cleaned up correctly. So "randomly" (but more likely under certain loads) the networking of a reused thread would get jacked and Docker could no longer pull images.

  • dboreham 1 hour ago

    Never, ever, ever, write your own userland threading library.

    (rule broken by almost every language in common use, unfortunately)

    • creata 25 minutes ago

      Where does this advice come from? Most web servers would use a lot more resources if they didn't use userland threading, wouldn't they?

adrianlee_dev 27 minutes ago

This is a better way to understand it: we can think of a container as an isolated process. When deploying containers, having a clear understanding of the boundaries between containers and the host machine in terms of permissions, resources, and data is extremely helpful for troubleshooting issues.

kazinator 1 hour ago

> And if you know where to look, you can even find that process in /proc.

This is very important for debugging! Not just that process, but the processes running in that Docker can be found in /proc.

Why this is useful is that you can run gdb outside of that docker and point it to a process in the docker, including setting the file system root to the docker one, so that it gdb reads the correct objects from the correct paths, to get the right symbols and addresses.

fulafel 44 minutes ago

> I decided to make my own container runtime for fun [...] Unlike VMs, containers are just processes

Try to make your own VM runtime next, you might be surprised!

VCFundedGenYer 12 minutes ago

Docker does not need root.

Side note almost nothing about Docker is weird. This article chooses rather boring design decisions and picks on them.

schmichael 31 minutes ago

> Go is kind of a terrible language for a container runtime

I love Go and use it for everything I can but will absolutely concede this point. It's clearly possible to write the most successful container runtimes on earth in Go, but you absolutely have to fight the language/runtime sometimes. Since containers are based on processes, handing off a container spec to a minimal rust runtime seems like what we should all be doing by now. crun has just proven good enough that AFAIK no one has RIIR.

miladyincontrol 1 hour ago

For as "terrible of a language" Go is alleged to be for a container runtime, its not like crun or youki are exactly faster in many meaningful ways unless you count churning containers running true and exiting.

And implying the system kernel still has to run the container kinda ignores kata containers and gvisor runtimes.

  • 0x457 24 minutes ago

    It's about using go to develop container runtime being terrible and not that "if it was C it would be faster". OS runs the container, docker just does the setup and some managmenent.

0xbadcafebee 1 hour ago

Docker hasn't required root for 7 years, I wish people would stop repeating that. It uses a root daemon by default because it makes things easier. Also, Containers are only as fake as a "Desktop" in an OS, which isn't real either. It's a user, network & process namespace with a control bus and a bunch of other weird things. A Desktop is a Container with a GUI.

Other weird facts about OSes: a filesystem is a database, the Linux kernel is a monolithic program, "hidden" dot-files were a Unix bug that got carried forward, deleting a file doesn't remove the file from your machine, virtual memory is a lie, your computer can't run multiple programs at once (it's just running one at a time real fast), in 12 years most systems will crash due to one number getting too big, you technically never need to reboot because you can launch a different version of Linux while already running Linux, you can freeze a program to a file and then later resume running that same program in the same state (but nobody uses it), files aren't actually stored in directories, there's a maximum number of files (and size of file) on most filesystems (which you can use to lock up a machine, despite file quotas existing and nobody using them), you can lock up most systems by forking too many times / using too much RAM / accessing disk too much, there's a default number of open files and/or TCP ports which is artificially low and you can use to again lock up a machine, pipes are just two file descriptors connected to one memory buffer, an IP address is just one long number split up into bytes, etc.

  • vbezhenar 4 minutes ago

    > your computer can't run multiple programs at once (it's just running one at a time real fast)

    Of course it can.

assimpleaspossi 1 hour ago

>>Images are just folders that Docker puts somewhere and then calls chroot (or pivot_root) to make that folder your container process’s new root directory.

And folders are graphical representations of directories--sometimes, not always--and not directories themselves. When will the newbies get this?

  • sophacles 1 hour ago

    Directory is a bad metaphor too.

  • altcognito 1 hour ago

    The high level abstraction is more important than the low level implementation unless the low level implementation is leaking through, or there is a significant advantage conveyed by understanding the low level implementation.

    I know a lot about how http works, and it comes in handy, but I can understand how juniors get away with not knowing it as fully as I do.