diff --git a/README.md b/README.md index b19d44d..52d1c9f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://img.shields.io/badge/Based-Docker%20CE%20v29.x-blue.svg)](https://github.com/docker/docker-ce) [![](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1] -**v1.4.1** +**v1.4.2** | 语言 | - | | :----------------------------------------------- | :------------------------------------------------- | diff --git a/cases/os/debian.md b/cases/os/debian.md index e3f2550..91db617 100644 --- a/cases/os/debian.md +++ b/cases/os/debian.md @@ -32,25 +32,23 @@ Debian GNU/Linux 8 ### 使用 Ubuntu 官方镜像 -下面以 `ubuntu:18.04` 为例,演示如何使用该镜像安装一些常用软件。 +下面以 `ubuntu:24.04` 为例,演示如何使用该镜像安装一些常用软件。 首先使用 `-ti` 参数启动容器,登录 `bash`,查看 `ubuntu` 的发行版本号。 ```bash -$ docker run -ti ubuntu:18.04 /bin/bash +$ docker run -ti ubuntu:24.04 /bin/bash root@7d93de07bf76:/# cat /etc/os-release +PRETTY_NAME="Ubuntu 24.04 LTS" NAME="Ubuntu" -VERSION="18.04.1 LTS (Bionic Beaver)" +VERSION_ID="24.04" +VERSION="24.04 LTS (Noble Numbat)" +VERSION_CODENAME=noble ID=ubuntu ID_LIKE=debian -PRETTY_NAME="Ubuntu 18.04.1 LTS" -VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" -PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" -VERSION_CODENAME=bionic -UBUNTU_CODENAME=bionic ``` 当试图直接使用 `apt-get` 安装一个软件的时候,会提示 `E: Unable to locate package`。 @@ -58,7 +56,7 @@ UBUNTU_CODENAME=bionic ```bash root@7d93de07bf76:/# apt-get install curl Reading package lists... Done -Building dependency tree +Building dependency tree... Done Reading state information... Done E: Unable to locate package curl ``` @@ -67,25 +65,10 @@ E: Unable to locate package curl ```bash root@7d93de07bf76:/# apt-get update -Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB] -Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] -Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7348 B] -Get:4 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [823 kB] -Get:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] -Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB] -Get:7 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB] -Get:8 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [31.0 kB] -Get:9 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [835 kB] -Get:10 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB] -Get:11 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB] -Get:12 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB] -Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1127 kB] -Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1350 kB] -Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [11.4 kB] -Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [44.7 kB] -Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2496 B] -Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4252 B] -Fetched 17.6 MB in 1min 25s (207 kB/s) +Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB] +Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] +... +Fetched 25.8 MB in 8s (3215 kB/s) Reading package lists... Done ``` diff --git a/compose/demo/app/Dockerfile b/compose/demo/app/Dockerfile index 7c4b8c7..c7d22ba 100644 --- a/compose/demo/app/Dockerfile +++ b/compose/demo/app/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.6-alpine +FROM python:3.12-alpine ADD . /code WORKDIR /code RUN pip install redis flask diff --git a/compose/django.md b/compose/django.md index a094a92..e731a99 100644 --- a/compose/django.md +++ b/compose/django.md @@ -23,8 +23,8 @@ COPY . /code/ 第二步,在 `requirements.txt` 文件里面写明需要安装的具体依赖包名。 ```bash -Django>=2.0,<3.0 -psycopg2>=2.7,<3.0 +Django>=4.0,<5.0 +psycopg2-binary>=2.9,<3.0 ``` 第三步,`docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。 @@ -105,8 +105,8 @@ web_1 | Performing system checks... web_1 | web_1 | System check identified no issues (0 silenced). web_1 | -web_1 | November 23, 2017 - 06:21:19 -web_1 | Django version 1.11.7, using settings 'django_example.settings' +web_1 | November 23, 2024 - 06:21:19 +web_1 | Django version 4.2, using settings 'django_example.settings' web_1 | Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C. ``` @@ -116,5 +116,5 @@ web_1 | Quit the server with CONTROL-C. 你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker compose up` 后,在另外一个终端进入文件夹运行以下命令即可: ```bash -$ docker compose run web python manage.py syncdb +$ docker compose run web python manage.py migrate ``` diff --git a/compose/usage.md b/compose/usage.md index 7871e0a..b8020ac 100644 --- a/compose/usage.md +++ b/compose/usage.md @@ -41,7 +41,7 @@ if __name__ == "__main__": 编写 `Dockerfile` 文件,内容为 ```docker -FROM python:3.6-alpine +FROM python:3.12-alpine ADD . /code WORKDIR /code RUN pip install redis flask diff --git a/container/daemon.md b/container/daemon.md index 37840af..95e0214 100644 --- a/container/daemon.md +++ b/container/daemon.md @@ -7,7 +7,7 @@ 如果不使用 `-d` 参数运行容器。 ```bash -$ docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" +$ docker run ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" hello world hello world hello world @@ -19,7 +19,7 @@ hello world 如果使用了 `-d` 参数运行容器。 ```bash -$ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" +$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a ``` @@ -32,7 +32,7 @@ $ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep ``` $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -77b2dc01fe0f ubuntu:18.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright +77b2dc01fe0f ubuntu:24.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright ``` 要获取容器的输出信息,可以通过 `docker container logs` 命令。 diff --git a/container/import_export.md b/container/import_export.md index 7f88763..6f71668 100644 --- a/container/import_export.md +++ b/container/import_export.md @@ -6,7 +6,7 @@ ```bash $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -7691a814370e ubuntu:18.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test +7691a814370e ubuntu:24.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test $ docker export 7691a814370e > ubuntu.tar ``` diff --git a/container/run.md b/container/run.md index 5f7802f..8585ec1 100644 --- a/container/run.md +++ b/container/run.md @@ -11,7 +11,7 @@ 例如,下面的命令输出一个 “Hello World”,之后终止容器。 ```bash -$ docker run ubuntu:18.04 /bin/echo 'Hello world' +$ docker run ubuntu:24.04 /bin/echo 'Hello world' Hello world ``` @@ -20,7 +20,7 @@ Hello world 下面的命令则启动一个 bash 终端,允许用户进行交互。 ```bash -$ docker run -t -i ubuntu:18.04 /bin/bash +$ docker run -t -i ubuntu:24.04 /bin/bash root@af8bae53bdd3:/# ``` diff --git a/container/stop.md b/container/stop.md index 4852848..6c1eccb 100644 --- a/container/stop.md +++ b/container/stop.md @@ -11,7 +11,7 @@ ```bash $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -ba267838cc1b ubuntu:18.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton +ba267838cc1b ubuntu:24.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton ``` 处于终止状态的容器,可以通过 `docker container start` 命令来重新启动。 diff --git a/data_management/bind-mounts.md b/data_management/bind-mounts.md index 278d12f..7fb4d09 100644 --- a/data_management/bind-mounts.md +++ b/data_management/bind-mounts.md @@ -62,7 +62,7 @@ $ docker inspect web $ docker run --rm -it \ # -v $HOME/.bash_history:/root/.bash_history \ --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \ - ubuntu:18.04 \ + ubuntu:24.04 \ bash root@2affd44b4667:/# history diff --git a/image/dockerfile/copy.md b/image/dockerfile/copy.md index 1f03fe9..62a92c3 100644 --- a/image/dockerfile/copy.md +++ b/image/dockerfile/copy.md @@ -34,3 +34,13 @@ COPY --chown=10:11 files* /mydir/ ``` 如果源路径为文件夹,复制的时候不是直接复制该文件夹,而是将文件夹中的内容复制到目标路径。 + +## 使用 `--link` 优化多阶段构建 + +在 BuildKit 中,可以使用 `--link` 选项来优化多阶段构建的性能。使用 `--link` 后,文件会以独立层的形式添加,无需依赖前序指令的结果: + +```docker +COPY --link --from=builder /app/dist /usr/share/nginx/html +``` + +这样可以更高效地利用缓存,加速构建过程。 diff --git a/image/dockerfile/entrypoint.md b/image/dockerfile/entrypoint.md index d7b6e06..f8d0ba4 100644 --- a/image/dockerfile/entrypoint.md +++ b/image/dockerfile/entrypoint.md @@ -17,7 +17,7 @@ 假设我们需要一个得知自己当前公网 IP 的镜像,那么可以先用 `CMD` 来实现: ```docker -FROM ubuntu:18.04 +FROM ubuntu:24.04 RUN apt-get update \ && apt-get install -y curl \ && rm -rf /var/lib/apt/lists/* @@ -49,7 +49,7 @@ $ docker run myip curl -s http://myip.ipip.net -i 这显然不是很好的解决方案,而使用 `ENTRYPOINT` 就可以解决这个问题。现在我们重新用 `ENTRYPOINT` 来实现这个镜像: ```docker -FROM ubuntu:18.04 +FROM ubuntu:24.04 RUN apt-get update \ && apt-get install -y curl \ && rm -rf /var/lib/apt/lists/* diff --git a/image/list.md b/image/list.md index d43d9ed..1f6403f 100644 --- a/image/list.md +++ b/image/list.md @@ -15,11 +15,11 @@ ubuntu bionic 329ed837d508 3 days ago 列表包含了 `仓库名`、`标签`、`镜像 ID`、`创建时间` 以及 `所占用的空间`。 -其中仓库名、标签在之前的基础概念章节已经介绍过了。**镜像 ID** 则是镜像的唯一标识,一个镜像可以对应多个 **标签**。因此,在上面的例子中,我们可以看到 `ubuntu:18.04` 和 `ubuntu:bionic` 拥有相同的 ID,因为它们对应的是同一个镜像。 +其中仓库名、标签在之前的基础概念章节已经介绍过了。**镜像 ID** 则是镜像的唯一标识,一个镜像可以对应多个 **标签**。因此,在上面的例子中,我们可以看到 `ubuntu:24.04` 和 `ubuntu:noble` 拥有相同的 ID,因为它们对应的是同一个镜像。 ## 镜像体积 -如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。比如,`ubuntu:18.04` 镜像大小,在这里是 `63.3MB`,但是在 [Docker Hub](https://hub.docker.com/layers/ubuntu/library/ubuntu/bionic/images/sha256-32776cc92b5810ce72e77aca1d949de1f348e1d281d3f00ebcc22a3adcdc9f42?context=explore) 显示的却是 `25.47 MB`。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 `docker image ls` 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。 +如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。比如,`ubuntu:24.04` 镜像大小,在这里是 `78MB`,但是在 [Docker Hub](https://hub.docker.com/_/ubuntu) 显示的却是 `29MB`。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 `docker image ls` 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。 另外一个需要注意的问题是,`docker image ls` 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。 @@ -83,7 +83,7 @@ ubuntu bionic 329ed837d508 3 days ago 列出特定的某个镜像,也就是说指定仓库名和标签 ```bash -$ docker image ls ubuntu:18.04 +$ docker image ls ubuntu:24.04 REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 329ed837d508 3 days ago 63.3MB ``` diff --git a/network/dns.md b/network/dns.md index f13bbb7..1b6c4f9 100644 --- a/network/dns.md +++ b/network/dns.md @@ -27,7 +27,7 @@ tmpfs on /etc/resolv.conf type tmpfs ... 这样每次启动的容器 DNS 自动配置为 `114.114.114.114` 和 `8.8.8.8`。使用以下命令来证明其已经生效。 ```bash -$ docker run -it --rm ubuntu:18.04 cat etc/resolv.conf +$ docker run -it --rm ubuntu:24.04 cat etc/resolv.conf nameserver 114.114.114.114 nameserver 8.8.8.8 diff --git a/repository/registry_auth.md b/repository/registry_auth.md index c0e2789..f567d27 100644 --- a/repository/registry_auth.md +++ b/repository/registry_auth.md @@ -190,15 +190,15 @@ $ docker login docker.domain.com 尝试推送、拉取镜像。 ```bash -$ docker pull ubuntu:18.04 +$ docker pull ubuntu:24.04 -$ docker tag ubuntu:18.04 docker.domain.com/username/ubuntu:18.04 +$ docker tag ubuntu:24.04 docker.domain.com/username/ubuntu:24.04 -$ docker push docker.domain.com/username/ubuntu:18.04 +$ docker push docker.domain.com/username/ubuntu:24.04 -$ docker image rm docker.domain.com/username/ubuntu:18.04 +$ docker image rm docker.domain.com/username/ubuntu:24.04 -$ docker pull docker.domain.com/username/ubuntu:18.04 +$ docker pull docker.domain.com/username/ubuntu:24.04 ``` 如果我们退出登录,尝试推送镜像。 @@ -206,7 +206,7 @@ $ docker pull docker.domain.com/username/ubuntu:18.04 ```bash $ docker logout docker.domain.com -$ docker push docker.domain.com/username/ubuntu:18.04 +$ docker push docker.domain.com/username/ubuntu:24.04 no basic auth credentials ```