-- No preparation is needed.
+- Install `dbus-user-session` package if not installed. Run `sudo apt-get install -y dbus-user-session` and relogin.
- `overlay2` storage driver is enabled by default
([Ubuntu-specific kernel patch](https://kernel.ubuntu.com/git/ubuntu/ubuntu-bionic.git/commit/fs/overlayfs?id=3b7da90f28fe1ed4b79ef2d994c81efbc58f1144)).
-- Known to work on Ubuntu 16.04, 18.04, and 20.04.
+- Known to work on Ubuntu 18.04, 20.04, and 21.04.
-- Add `kernel.unprivileged_userns_clone=1` to `/etc/sysctl.conf` (or
- `/etc/sysctl.d`) and run `sudo sysctl --system`.
+- Install `dbus-user-session` package if not installed. Run `sudo apt-get install -y dbus-user-session` and relogin.
+
+- For Debian 10, add `kernel.unprivileged_userns_clone=1` to `/etc/sysctl.conf` (or
+ `/etc/sysctl.d`) and run `sudo sysctl --system`. This step is not required on Debian 11.
+
+- Installing `fuse-overlayfs` is recommended. Run `sudo apt-get install -y fuse-overlayfs`.
+ Using `overlay2` storage driver with Debian-specific modprobe option `sudo modprobe overlay permit_mounts_in_userns=1` is also possible,
+ however, highly discouraged due to [instability](https://github.com/moby/moby/issues/42302).
-- To use the `overlay2` storage driver (recommended), run
- `sudo modprobe overlay permit_mounts_in_userns=1`
- ([Debian-specific kernel patch, introduced in Debian 10](https://salsa.debian.org/kernel-team/linux/blob/283390e7feb21b47779b48e0c8eb0cc409d2c815/debian/patches/debian/overlayfs-permit-mounts-in-userns.patch)).
- Add the configuration to `/etc/modprobe.d` for persistence.
-
- Rootless docker requires version of `slirp4netns` greater than `v0.4.0` (when `vpnkit` is not installed).
Check you have this with
```console
$ slirp4netns --version
```
- If you do not have this download and install the latest [release](https://github.com/rootless-containers/slirp4netns/releases).
+ If you do not have this download and install with `sudo apt-get install -y slirp4netns` or download the latest [release](https://github.com/rootless-containers/slirp4netns/releases).
@@ -92,24 +93,20 @@ testuser:231072:65536
- Add `kernel.unprivileged_userns_clone=1` to `/etc/sysctl.conf` (or
`/etc/sysctl.d`) and run `sudo sysctl --system`
+
- Installing `fuse-overlayfs` is recommended. Run `sudo zypper install -y fuse-overlayfs`.
- `sudo modprobe ip_tables iptable_mangle iptable_nat iptable_filter` is required.
This might be required on other distros as well depending on the configuration.
-- Known to work on openSUSE 15.
+- Known to work on openSUSE 15 and SLES 15.
- Installing `fuse-overlayfs` is recommended. Run `sudo dnf install -y fuse-overlayfs`.
- You might need `sudo dnf install -y iptables`.
-- When SELinux is enabled, you may face `can't open lock file /run/xtables.lock: Permission denied` error.
- A workaround for this is to `sudo dnf install -y policycoreutils-python-utils && sudo semanage permissive -a iptables_t`.
- This issue is tracked in [moby/moby#41230](https://github.com/moby/moby/issues/41230).
-
-- Known to work on CentOS 8 and Fedora 33.
+- Known to work on CentOS 8, RHEL 8, and Fedora 34.
- Add `user.max_user_namespaces=28633` to `/etc/sysctl.conf` (or
@@ -123,7 +120,7 @@ testuser:231072:65536
## Known limitations
- Only the following storage drivers are supported:
- - `overlay2` (only if running with kernel 5.11 or later, or Ubuntu-flavored kernel, or Debian-flavored kernel)
+ - `overlay2` (only if running with kernel 5.11 or later, or Ubuntu-flavored kernel)
- `fuse-overlayfs` (only if running with kernel 4.18 or later, and `fuse-overlayfs` is installed)
- `btrfs` (only if running with kernel 4.18 or later, or `~/.local/share/docker` is mounted with `user_subvol_rm_allowed` mount option)
- `vfs`
@@ -218,6 +215,8 @@ Removed /home/testuser/.config/systemd/user/default.target.wants/docker.service.
[INFO] To remove data, run: `/usr/bin/rootlesskit rm -rf /home/testuser/.local/share/docker`
```
+Unset environment variables PATH and DOCKER_HOST if you have added them to `~/.bashrc`.
+
To remove the data directory, run `rootlesskit rm -rf ~/.local/share/docker`.
To remove the binaries, remove `docker-ce-rootless-extras` package if you installed Docker with package managers.
@@ -477,15 +476,14 @@ up automatically. See [Usage](#usage).
**iptables failed: iptables -t nat -N DOCKER: Fatal: can't open lock file /run/xtables.lock: Permission denied**
-This error may happen when SELinux is enabled on the host.
+This error may happen with an older version of Docker when SELinux is enabled on the host.
-A known workaround is to run the following commands to disable SELinux for `iptables`:
+The issue has been fixed in Docker 20.10.8.
+A known workaround for older version of Docker is to run the following commands to disable SELinux for `iptables`:
```console
$ sudo dnf install -y policycoreutils-python-utils && sudo semanage permissive -a iptables_t
```
-This issue is tracked in [moby/moby#41230](https://github.com/moby/moby/issues/41230).
-
### `docker pull` errors
**docker: failed to register layer: Error processing tar file(exit status 1): lchown <FILE>: invalid argument**
@@ -506,6 +504,25 @@ A workaround is to specify non-NFS `data-root` directory in `~/.config/docker/da
### `docker run` errors
+**docker: Error response from daemon: OCI runtime create failed: ...: read unix @->/run/systemd/private: read: connection reset by peer: unknown.**
+
+This error occurs on cgroup v2 hosts mostly when the dbus daemon is not running for the user.
+
+```console
+$ systemctl --user is-active dbus
+inactive
+
+$ docker run hello-world
+docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:385: applying cgroup configuration for process caused: error while starting unit "docker
+-931c15729b5a968ce803784d04c7421f791d87e5ca1891f34387bb9f694c488e.scope" with properties [{Name:Description Value:"libcontainer container 931c15729b5a968ce803784d04c7421f791d87e5ca1891f34387bb9f694c488e"} {Name:Slice Value:"use
+r.slice"} {Name:PIDs Value:@au [4529]} {Name:Delegate Value:true} {Name:MemoryAccounting Value:true} {Name:CPUAccounting Value:true} {Name:IOAccounting Value:true} {Name:TasksAccounting Value:true} {Name:DefaultDependencies Val
+ue:false}]: read unix @->/run/systemd/private: read: connection reset by peer: unknown.
+```
+
+To fix the issue, run `sudo apt-get install -y dbus-user-session` or `sudo dnf install -y dbus-daemon`, and then relogin.
+
+If the error still occurs, try running `systemctl --user enable --now dbus` (without sudo).
+
**`--cpus`, `--memory`, and `--pids-limit` are ignored**
This is an expected behavior on cgroup v1 mode.
@@ -561,15 +578,35 @@ Installing slirp4netns may improve the network throughput.
See [RootlessKit documentation](https://github.com/rootless-containers/rootlesskit/tree/v0.13.0#network-drivers) for the benchmark result.
Also, changing MTU value may improve the throughput.
-The MTU value can be specified by adding `Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_MTU="`
-to `~/.config/systemd/user/docker.service` and then running `systemctl --user daemon-reload`.
+The MTU value can be specified by creating `~/.config/systemd/user/docker.service.d/override.conf` with the following content:
+
+```systemd
+[Service]
+Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_MTU="
+```
+
+And then restart the daemon:
+```console
+$ systemctl --user daemon-reload
+$ systemctl --user restart docker
+```
**`docker run -p` does not propagate source IP addresses**
This is because Docker with rootless mode uses RootlessKit's builtin port driver by default.
-The source IP addresses can be propagated by adding `Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER=slirp4netns"`
-to `~/.config/systemd/user/docker.service` and then running `systemctl --user daemon-reload`.
+The source IP addresses can be propagated by creating `~/.config/systemd/user/docker.service.d/override.conf` with the following content:
+
+```systemd
+[Service]
+Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER=slirp4netns"
+```
+
+And then restart the daemon:
+```console
+$ systemctl --user daemon-reload
+$ systemctl --user restart docker
+```
Note that this configuration decreases throughput.
See [RootlessKit documentation](https://github.com/rootless-containers/rootlesskit/tree/v0.13.0#port-drivers) for the benchmark result.
diff --git a/get-started/05_persisting_data.md b/get-started/05_persisting_data.md
index 21bd517edc..98638037b8 100644
--- a/get-started/05_persisting_data.md
+++ b/get-started/05_persisting_data.md
@@ -29,7 +29,7 @@ What you'll see is that the files created in one container aren't available in a
commands (why we have the `&&`). The first portion picks a single random number and writes
it to `/data.txt`. The second command is simply watching a file to keep the container running.
-2. Validate we can see the output by `exec`ing into the container. To do so, open the Dashboard and click the first action of the container that is running the `ubuntu` image.
+2. Validate that we can see the output by `exec`ing into the container. To do so, open the Dashboard and click the first action of the container that is running the `ubuntu` image.
{: style=width:75% }
diff --git a/go/experimental.md b/go/experimental.md
new file mode 100644
index 0000000000..e39115ac09
--- /dev/null
+++ b/go/experimental.md
@@ -0,0 +1,4 @@
+---
+description: Redirect refer users on how to enable experimental CLI features (now enabled by default)
+redirect_to: /engine/reference/commandline/cli/#experimental-features
+---
diff --git a/language/golang/build-images.md b/language/golang/build-images.md
index 8a15eaa38f..5e17289e4c 100644
--- a/language/golang/build-images.md
+++ b/language/golang/build-images.md
@@ -115,17 +115,14 @@ Having established that the server is running and is accessible, let's proceed t
## Create a Dockerfile for the application
-A `Dockerfile` is a text document that contains the instructions for building a Docker image. When we tell Docker to build our image by executing the `docker build` command, Docker reads these instructions and executes them one by one and creates a Docker image as a result.
+{% include guides/create-dockerfile.md %}
-Let’s walk through the process of creating a `Dockerfile` for our application. In the root of your working directory, create a file named `Dockerfile` and open this file in your text editor.
-
-> **Note**
->
-> The name of the file is not _that_ important but the default filename for many commands is simply `Dockerfile`. So, we’ll use that as our filename throughout this series.
-
-The first thing we need to do is to add a line in our Dockerfile that tells Docker what base image we would like to use for our application.
+Next, we need to add a line in our Dockerfile that tells Docker what base image
+we would like to use for our application.
```dockerfile
+# syntax=docker/dockerfile:1
+
FROM golang:1.16-alpine
```
@@ -156,7 +153,7 @@ COPY go.mod ./
COPY go.sum ./
```
-Now that we have the module files inside the Docker image that we are building, we can use the `RUN` command to execute the command `go mod download` there as well. This works exactly the same as if we were running `go` locally on our machine, but this time these Go modules will be installed into the a directory inside our image.
+Now that we have the module files inside the Docker image that we are building, we can use the `RUN` command to execute the command `go mod download` there as well. This works exactly the same as if we were running `go` locally on our machine, but this time these Go modules will be installed into the app directory inside our image.
```dockerfile
RUN go mod download
@@ -191,6 +188,8 @@ CMD [ "/docker-gs-ping" ]
Here's the complete `Dockerfile`:
```dockerfile
+# syntax=docker/dockerfile:1
+
FROM golang:1.16-alpine
WORKDIR /app
@@ -211,6 +210,8 @@ CMD [ "/docker-gs-ping" ]
The `Dockerfile` may also contain _comments_. They always begin with a `#` symbol and make no difference to Docker. The comments are there for the convenience of humans tasked to maintain the `Dockerfile`:
```dockerfile
+# syntax=docker/dockerfile:1
+
# Alpine is chosen for its small footprint
# compared to Ubuntu
FROM golang:1.16-alpine
@@ -335,10 +336,11 @@ The `Dockerfile.multistage` in the sample application's repo has the following c
{% raw %}
```dockerfile
+# syntax=docker/dockerfile:1
+
##
## Build
##
-
FROM golang:1.16-buster AS build
WORKDIR /app
@@ -354,7 +356,6 @@ RUN go build -o /docker-gs-ping
##
## Deploy
##
-
FROM gcr.io/distroless/base-debian10
WORKDIR /
diff --git a/language/golang/develop.md b/language/golang/develop.md
index 3342892ef3..f891c869b8 100644
--- a/language/golang/develop.md
+++ b/language/golang/develop.md
@@ -47,7 +47,7 @@ local roach
### Networking
-The example application and the database engine are going to talk to one another over the network. There are different kinds of network configuration possible, and we are going to use what is called a user-defined _bridge network_. It is going to provide us with a DNS lookup service so that we can refer to our database enginer container by its host name.
+The example application and the database engine are going to talk to one another over the network. There are different kinds of network configuration possible, and we are going to use what is called a user-defined _bridge network_. It is going to provide us with a DNS lookup service so that we can refer to our database engine container by its hostname.
The following command creates a new bridge network named `mynet`:
@@ -73,7 +73,7 @@ Our bridge network `mynet` has been created successfully. The other three networ
As the saying goes, there are only two hard things in Computer Science: cache invalidation and naming things. And off-by-one errors.
-When choosing a name for a network or a managed volume, it's best to choose a name which is indicative of the intended purpose. In this module, though, we aimed for brevity, so we settled for short, generic names.
+When choosing a name for a network or a managed volume, it's best to choose a name that is indicative of the intended purpose. In this module, though, we aimed for brevity, so we settled for short, generic names.
### Start the database engine
@@ -180,7 +180,7 @@ $ git clone https://github.com/olliefr/docker-gs-ping-roach.git
# ... output omitted ...
```
-The application's `main.go` now includes database initialisation code, as well as the code to implement a new business requirement:
+The application's `main.go` now includes database initialization code, as well as the code to implement a new business requirement:
* An HTTP `POST` request to `/send` containing a `{ "value" : string }` JSON must save the value to the database.
@@ -339,7 +339,7 @@ func countRecords(db *sql.DB) (int, error) {
```
{% endraw %}
-The repository also includes the `Dockerfile`, which is almost exactly the same as the multi-stage `Dockerfile` introduced in the previous modules. It uses official Docker Go image to build the application and then builds the final image by placing the compiled binary into the much slimmer, "distroless" image.
+The repository also includes the `Dockerfile`, which is almost exactly the same as the multi-stage `Dockerfile` introduced in the previous modules. It uses the official Docker Go image to build the application and then builds the final image by placing the compiled binary into the much slimmer, "distroless" image.
Regardless of whether we had updated the old example application, or checked out the new one, this new Docker image has to be built to reflect the changes to the application source code.
@@ -519,7 +519,7 @@ Please make sure that you stop the CockroachDB and `docker-gs-ping-roach` contai
## Better productivity with Docker Compose
-At this point you might be wondering if there is a way to avoid having to deal with long lists of argument to the `docker` command. The toy example we used in this series requires five environment variables to define the connection to the database. A real application might need many, _many_ more. Then there is also a question of dependencies – ideally, we would like to make sure that the database is started _before_ our application is run. And spinning up the database instance may require another Docker command with many options. But there is a better way to orchestrate these deployments for local development purposes.
+At this point, you might be wondering if there is a way to avoid having to deal with long lists of arguments to the `docker` command. The toy example we used in this series requires five environment variables to define the connection to the database. A real application might need many, _many_ more. Then there is also a question of dependencies – ideally, we would like to make sure that the database is started _before_ our application is run. And spinning up the database instance may require another Docker command with many options. But there is a better way to orchestrate these deployments for local development purposes.
In this section, we’ll create a Docker Compose file to start our `docker-gs-ping-roach` application and CockroachDB database engine with a single command.
@@ -588,7 +588,7 @@ The exact value does not really matter for our example, because we run Cockroach
### Merging Compose files
-The file name `docker-compose.yml` is the default file name which `docker-compose` command recognises if no `-f` flag is provided. This means you can have multiple Docker Compose files if your environment has such requirements. Furthermore, Docker Compose files are... composable (pun intended), so multiple files can be specified on the command line to merge parts of configuration together. The following list is just a few examples of scenarios where such feature would be very useful:
+The file name `docker-compose.yml` is the default file name which `docker-compose` command recognises if no `-f` flag is provided. This means you can have multiple Docker Compose files if your environment has such requirements. Furthermore, Docker Compose files are... composable (pun intended), so multiple files can be specified on the command line to merge parts of the configuration together. The following list is just a few examples of scenarios where such a feature would be very useful:
* Using a bind mount for the source code for local development but not when running the CI tests;
* Switching between using a pre-built image for the frontend for some API application vs creating a bind mount for source code;
@@ -599,7 +599,7 @@ We are not going to cover any of these advanced use cases here.
### Variable substitution in Docker Compose
-One of the really cool features of Docker Compose is [variable substitution](../../compose/compose-file/compose-file-v3.md#variable-substitution). You can see some example in our Compose file, `environment` section. By means of example:
+One of the really cool features of Docker Compose is [variable substitution](../../compose/compose-file/compose-file-v3.md#variable-substitution). You can see some examples in our Compose file, `environment` section. By means of an example:
* `PGUSER=${PGUSER:-totoro}` means that inside the container, the environment variable `PGUSER` shall be set to the same value as it has on the host machine where Docker Compose is run. If there is no environment variable with this name on the host machine, the variable inside the container gets the default value of `totoro`.
* `PGPASSWORD=${PGPASSWORD:?database password not set}` means that if the environment variable `PGPASSWORD` is not set on the host, Docker Compose will display an error. This is OK, because we don't want to hard-code default values for the password. We set the password value in the `.env` file, which is local to our machine. It is always a good idea to add `.env` to `.gitignore` to prevent the secrets being checked into the version control.
@@ -628,7 +628,7 @@ We pass the `--build` flag so Docker will compile our image and then starts it.
> **Note**
>
-> Docker Compose is a useful tool, but it has its own quirks. For example, no rebuild is triggered on update to the source code unless the `--build` flag is provided. It is a very common pitfall to edit one's source code, and forget to use the `--build` flag when running `docker-compose up`.
+> Docker Compose is a useful tool, but it has its own quirks. For example, no rebuild is triggered on the update to the source code unless the `--build` flag is provided. It is a very common pitfall to edit one's source code, and forget to use the `--build` flag when running `docker-compose up`.
Since our set-up is now run by Docker Compose, it has assigned it a "project name", so we got a new volume for our CockroachDB instance. This means that our application would fail to connect to the database, because the database does not exist in this new volume. The terminal would display an authentication error for the database:
diff --git a/language/java/build-images.md b/language/java/build-images.md
index c4b9bd0e70..ab3f0a9ea3 100644
--- a/language/java/build-images.md
+++ b/language/java/build-images.md
@@ -10,7 +10,7 @@ description: Learn how to build your first Docker image by writing a Dockerfile
Work through the orientation and setup in Get started [Part 1](../../get-started/index.md){:target="_blank" rel="noopener" class="_"} to understand Docker concepts. Refer to the following section for Java prerequisites.
-{% include enable-buildkit.md %}
+{% include guides/enable-buildkit.md %}
## Overview
@@ -58,28 +58,7 @@ PetClinicApplication in 11.743 seconds (JVM running for 12.364)
Now that our application is running properly, let’s take a look at creating a Dockerfile.
-A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. When we tell Docker to build our image by executing the `docker build` command, Docker reads these instructions and execute them sequentially and creates a Docker image.
-
-Let’s walk through the steps on creating a Dockerfile for our application. In the root of your working directory, create a file named `Dockerfile` and open this file in your text editor.
-
-> **Note**
->
-> The name of the Dockerfile is not important but the default filename for many commands is simply `Dockerfile`. Therefore, we’ll use that as our filename throughout this series.
-
-The first line to add to the Dockerfile is a [`# syntax` parser directive](/engine/reference/builder/#syntax).
-While _optional_, this directive instructs the Docker builder what syntax to use
-when parsing the Dockerfile, and allows older Docker versions with BuildKit enabled
-to upgrade the parser before starting the build. Parser directives
-must appear before any other comment, whitespace, or Dockerfile instruction in
-your Dockerfile, and should be the first line in Dockerfiles.
-
-```dockerfile
-# syntax=docker/dockerfile:1
-```
-
-We recommend using `docker/dockerfile:1`, which always points to the latest release
-of the version 1 syntax. BuildKit automatically checks for updates of the syntax
-before building, making sure you are using the most current version.
+{% include guides/create-dockerfile.md %}
Next, we need to add a line in our Dockerfile that tells Docker what base image
we would like to use for our application.
diff --git a/language/nodejs/build-images.md b/language/nodejs/build-images.md
index 8957892e68..8c0a520aad 100644
--- a/language/nodejs/build-images.md
+++ b/language/nodejs/build-images.md
@@ -12,7 +12,7 @@ redirect_from:
Work through the orientation and setup in Get started [Part 1](../../get-started/index.md) to understand Docker concepts.
-{% include enable-buildkit.md %}
+{% include guides/enable-buildkit.md %}
## Overview
@@ -93,28 +93,7 @@ We will now continue to build and run the application in Docker.
## Create a Dockerfile for Node.js
-A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. When we tell Docker to build our image by executing the `docker build` command, Docker reads these instructions and executes them one by one and creates a Docker image as a result.
-
-Let’s walk through the process of creating a Dockerfile for our application. In the root of your working directory, create a file named `Dockerfile` and open this file in your text editor.
-
-> **Note**
->
-> The name of the Dockerfile is not important but the default filename for many commands is simply `Dockerfile`. So, we’ll use that as our filename throughout this series.
-
-The first line to add to the Dockerfile is a [`# syntax` parser directive](/engine/reference/builder/#syntax).
-While _optional_, this directive instructs the Docker builder what syntax to use
-when parsing the Dockerfile, and allows older Docker versions with BuildKit enabled
-to upgrade the parser before starting the build. [Parser directives](/engine/reference/builder/#parser-directives)
-must appear before any other comment, whitespace, or Dockerfile instruction in
-your Dockerfile, should be the first line in Dockerfiles.
-
-```dockerfile
-# syntax=docker/dockerfile:1
-```
-
-We recommend using `docker/dockerfile:1`, which always points to the latest release
-of the version 1 syntax. BuildKit automatically checks for updates of the syntax
-before building, making sure you are using the most current version.
+{% include guides/create-dockerfile.md %}
Next, we need to add a line in our Dockerfile that tells Docker what base image
we would like to use for our application.
diff --git a/language/python/build-images.md b/language/python/build-images.md
index d862129ee5..f2012a2a66 100644
--- a/language/python/build-images.md
+++ b/language/python/build-images.md
@@ -10,7 +10,7 @@ description: Learn how to build your first Docker image by writing a Dockerfile
Work through the orientation and setup in Get started [Part 1](../../get-started/index.md) to understand Docker concepts.
-{% include enable-buildkit.md %}
+{% include guides/enable-buildkit.md %}
## Overview
@@ -64,28 +64,7 @@ Switch back to the terminal where our server is running and you should see the f
Now that our application is running properly, let’s take a look at creating a Dockerfile.
-A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image. When we tell Docker to build our image by executing the `docker build` command, Docker reads these instructions, executes them consecutively, and creates a Docker image as a result.
-
-Let’s walk through creating a Dockerfile for our application. In the root of your working directory, create a file named `Dockerfile` and open this file in your text editor.
-
-> **Note**
->
-> The name of the Dockerfile is not important but the default filename for many commands is simply `Dockerfile`. Therefore, we’ll use that as our filename throughout this series.
-
-The first line to add to the Dockerfile is a [`# syntax` parser directive](/engine/reference/builder/#syntax).
-While _optional_, this directive instructs the Docker builder what syntax to use
-when parsing the Dockerfile, and allows older Docker versions with BuildKit enabled
-to upgrade the parser before starting the build. [Parser directives](/engine/reference/builder/#parser-directives)
-must appear before any other comment, whitespace, or Dockerfile instruction in
-your Dockerfile, should be the first line in Dockerfiles.
-
-```dockerfile
-# syntax=docker/dockerfile:1
-```
-
-We recommend using `docker/dockerfile:1`, which always points to the latest release
-of the version 1 syntax. BuildKit automatically checks for updates of the syntax
-before building, making sure you are using the most current version.
+{% include guides/create-dockerfile.md %}
Next, we need to add a line in our Dockerfile that tells Docker what base image
we would like to use for our application.
diff --git a/storage/storagedriver/btrfs-driver.md b/storage/storagedriver/btrfs-driver.md
index 397c3706e2..77820d7fdc 100644
--- a/storage/storagedriver/btrfs-driver.md
+++ b/storage/storagedriver/btrfs-driver.md
@@ -18,7 +18,7 @@ easily combine multiple physical block devices into a single Btrfs filesystem.
This article refers to Docker's Btrfs storage driver as `btrfs` and the overall
Btrfs Filesystem as Btrfs.
-> **Note**: The `btrfs` storage driver is only supported on Docker Engine - Community on Ubuntu or Debian.
+> **Note**: The `btrfs` storage driver is only supported on Docker Engine - Community on SLES, Ubuntu or Debian.
## Prerequisites
diff --git a/subscription/faq.md b/subscription/faq.md
index 6c878364fc..1979c841fa 100644
--- a/subscription/faq.md
+++ b/subscription/faq.md
@@ -27,7 +27,7 @@ Your organization's number of paid seats must equal the number of organization m
### What are the rate limits for free subscriptions?
-Anonymous and Free subscriptions are subject to rate limits on image pull requests. You can get more information at the [Rate Limiting Information](../download-rate-limit.md#how-do-i-authenticate-pull-requests){:target="blank" rel="noopener" class=""} page.
+Anonymous and Free subscriptions are subject to rate limits on image pull requests. You can get more information at the [Rate Limiting Information](../docker-hub/download-rate-limit.md#how-do-i-authenticate-pull-requests){:target="blank" rel="noopener" class=""} page.
### We have a number of agents, users, and seats and it's difficult to track and manage the accounts. Can we get our organization IP addresses enabled for access instead?
@@ -96,7 +96,7 @@ When you downgrade your Pro or Team plan, changes are applied at the end of your
### How do I downgrade from a Team plan to a Free Team plan?
-Before you downgrade to a Free plan, ensure that your organization details are updated to reflect features available in the Free plan. For example, you may need to reduce the number of team members and convert any private repositories to public repositories. For information on what’s included in the Free plan, see the [billing](../#pricing-plans){:target="blank" rel="noopener" class=""} page.
+Before you downgrade to a Free plan, ensure that your organization details are updated to reflect features available in the Free plan. For example, you may need to reduce the number of team members and convert any private repositories to public repositories. For information on what’s included in the Free plan, see the [billing](index.md#pricing-plans){:target="blank" rel="noopener" class=""} page.
### How do I downgrade from Pro to a Free plan?
@@ -104,7 +104,7 @@ Before you downgrade to a Free plan, ensure that your account organization detai
### How do I add a member to a team in my organization?
-For information on how to add a member to a team, see [Add a member to a team](../orgs/#add-a-member-to-a-team){:target="blank" rel="noopener" class=""}.
+For information on how to add a member to a team, see [Add a member to a team](../docker-hub/orgs.md#add-a-member-to-a-team){:target="blank" rel="noopener" class=""}.
### What happens to my collaborators when I move to a free individual plan?