mirror of
https://github.com/NixOS/nix.dev.git
synced 2024-10-18 14:32:43 -04:00
Merge pull request #326 from worktheclock/patch-9
Building and running Docker images RITZA edit
This commit is contained in:
commit
22ae50fb76
|
@ -7,25 +7,20 @@ myst:
|
|||
|
||||
# Building and running Docker images
|
||||
|
||||
[Docker](https://www.docker.com/) is a set of tools and services used to
|
||||
build, manage and deploy containers.
|
||||
[Docker](https://www.docker.com/) is a set of tools and services used to build, manage and deploy containers.
|
||||
|
||||
As many cloud platforms offer Docker-based
|
||||
container hosting services, creating Docker containers for a given service is a
|
||||
common task when building reproducible software. In this tutorial, you will
|
||||
learn how to build Docker containers using Nix.
|
||||
As many cloud platforms offer Docker-based container hosting services, creating Docker containers for a given service is a common task when building reproducible software.
|
||||
In this tutorial, you will learn how to build Docker containers using Nix.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
We assume you have both Nix and [Docker installed](https://docs.docker.com/get-docker/). Docker is available in
|
||||
`nixpkgs`, which is the preferred way to install it on NixOS. However, you can
|
||||
also use the native Docker installation of your OS, if you are on another Linux
|
||||
distribution or MacOS.
|
||||
You will need both Nix and [Docker](https://docs.docker.com/get-docker/) installed.
|
||||
Docker is available in `nixpkgs`, which is the preferred way to install it on NixOS.
|
||||
However, you can also use the native Docker installation of your OS, if you are on another Linux distribution or macOS.
|
||||
|
||||
## Build your first container
|
||||
|
||||
[Nixpkgs](https://github.com/NixOS/nixpkgs) provides `dockerTools` to create
|
||||
Docker images:
|
||||
[Nixpkgs](https://github.com/NixOS/nixpkgs) provides `dockerTools` to create Docker images:
|
||||
|
||||
```nix
|
||||
{ pkgs ? import <nixpkgs> { }
|
||||
|
@ -78,38 +73,34 @@ Finished.
|
|||
/nix/store/y74sb4nrhxr975xs7h83izgm8z75x5fc-docker-image-hello-docker.tar.gz
|
||||
```
|
||||
|
||||
The image tag (`y74sb4nrhxr975xs7h83izgm8z75x5fc`) refers to the Nix build hash
|
||||
and makes sure that the Docker image corresponds to our Nix build. The store
|
||||
path in the last line of the output references the Docker image.
|
||||
The image tag (`y74sb4nrhxr975xs7h83izgm8z75x5fc`) refers to the Nix build hash and makes sure that the Docker image corresponds to our Nix build.
|
||||
The store path in the last line of the output references the Docker image.
|
||||
|
||||
## Run the container
|
||||
|
||||
To work with the container, load this image into
|
||||
Docker's image registry from the default `result` symlink created by nix-build:
|
||||
To work with the container, load this image into Docker's image registry from the default `result` symlink created by `nix-build`:
|
||||
|
||||
```shell-session
|
||||
$ docker load < result
|
||||
Loaded image: hello-docker:y74sb4nrhxr975xs7h83izgm8z75x5fc
|
||||
```
|
||||
|
||||
You can also use the store path to load the image in order to avoid depending on the presence of
|
||||
`result`
|
||||
You can also use the store path to load the image in order to avoid depending on the presence of `result`:
|
||||
|
||||
```shell-session
|
||||
$ docker load < /nix/store/y74sb4nrhxr975xs7h83izgm8z75x5fc-docker-image-hello-docker.tar.gz
|
||||
Loaded image: hello-docker:y74sb4nrhxr975xs7h83izgm8z75x5fc
|
||||
```
|
||||
|
||||
Even more conveniently, you can do everything in one command. The advantage of this approach
|
||||
is that `nix-build` will rebuild the image if there are any changes and pass the new store
|
||||
path to `docker load`:
|
||||
Even more conveniently, you can do everything in one command.
|
||||
The advantage of this approach is that `nix-build` will rebuild the image if there are any changes and pass the new store path to `docker load`:
|
||||
|
||||
```shell-session
|
||||
$ docker load < $(nix-build hello-docker.nix)
|
||||
Loaded image: hello-docker:y74sb4nrhxr975xs7h83izgm8z75x5fc
|
||||
```
|
||||
|
||||
Now that you have loaded the image into Docker, it is time to run it:
|
||||
Now that you have loaded the image into Docker, you can run it:
|
||||
|
||||
```shell-session
|
||||
$ docker run -t hello-docker:y74sb4nrhxr975xs7h83izgm8z75x5fc
|
||||
|
@ -118,20 +109,16 @@ Hello, world!
|
|||
|
||||
## Working with Docker images
|
||||
|
||||
A general introduction to working with Docker images is not part of this
|
||||
tutorial. The [official Docker documentation](https://docs.docker.com/) is a
|
||||
much better place for that. Note that when you build your
|
||||
Docker images with Nix, you will probably not write a `Dockerfile`
|
||||
as Nix replaces the Dockerfile functionality within the Docker ecosystem.
|
||||
A general introduction to working with Docker images is not part of this tutorial.
|
||||
The [official Docker documentation](https://docs.docker.com/) is a much better place for that.
|
||||
|
||||
Nonetheless, understanding the anatomy of a Dockerfile may still be useful to
|
||||
follow along how Nix replaces each of its functions. Using the Docker CLI,
|
||||
Docker Compose, Docker Swarm or Docker Hub on the other hand may still be
|
||||
relevant depending on your use case.
|
||||
Note that when you build your Docker images with Nix, you will probably not write a `Dockerfile` as Nix replaces the Dockerfile functionality within the Docker ecosystem.
|
||||
Nonetheless, understanding the anatomy of a Dockerfile may still be useful to understand how Nix replaces each of its functions.
|
||||
Using the Docker CLI, Docker Compose, Docker Swarm or Docker Hub on the other hand may still be relevant, depending on your use case.
|
||||
|
||||
## Next steps
|
||||
|
||||
- More details on how to use `dockerTools` can be found in the [reference documentation](https://nixos.org/nixpkgs/manual/#sec-pkgs-dockerTools).
|
||||
- You will also want to [browse through more examples of Docker images built with Nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/docker/examples.nix).
|
||||
- [Arion](https://docs.hercules-ci.com/arion/), docker-compose wrapper with first-class support for Nix.
|
||||
- Build docker images on a {ref}`CI with Github Actions <github-actions>`
|
||||
- You might like to browse through more [examples of Docker images built with Nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/docker/examples.nix).
|
||||
- Take a look at [Arion](https://docs.hercules-ci.com/arion/), a `docker-compose` wrapper with first-class support for Nix.
|
||||
- Build docker images on a {ref}`CI with Github Actions <github-actions>`.
|
||||
|
|
Loading…
Reference in a new issue