Use latest version tools

This commit is contained in:
Baohua Yang
2026-01-12 09:02:39 -08:00
parent 43e12058eb
commit 24eb615f54
15 changed files with 49 additions and 56 deletions

View File

@@ -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] [![](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**
| 语言 | - | | 语言 | - |
| :----------------------------------------------- | :------------------------------------------------- | | :----------------------------------------------- | :------------------------------------------------- |

View File

@@ -32,25 +32,23 @@ Debian GNU/Linux 8
### 使用 Ubuntu 官方镜像 ### 使用 Ubuntu 官方镜像
下面以 `ubuntu:18.04` 为例演示如何使用该镜像安装一些常用软件 下面以 `ubuntu:24.04` 为例演示如何使用该镜像安装一些常用软件
首先使用 `-ti` 参数启动容器登录 `bash`查看 `ubuntu` 的发行版本号 首先使用 `-ti` 参数启动容器登录 `bash`查看 `ubuntu` 的发行版本号
```bash ```bash
$ docker run -ti ubuntu:18.04 /bin/bash $ docker run -ti ubuntu:24.04 /bin/bash
root@7d93de07bf76:/# cat /etc/os-release root@7d93de07bf76:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu" 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=ubuntu
ID_LIKE=debian ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/" HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" 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` 当试图直接使用 `apt-get` 安装一个软件的时候会提示 `E: Unable to locate package`
@@ -58,7 +56,7 @@ UBUNTU_CODENAME=bionic
```bash ```bash
root@7d93de07bf76:/# apt-get install curl root@7d93de07bf76:/# apt-get install curl
Reading package lists... Done Reading package lists... Done
Building dependency tree Building dependency tree... Done
Reading state information... Done Reading state information... Done
E: Unable to locate package curl E: Unable to locate package curl
``` ```
@@ -67,25 +65,10 @@ E: Unable to locate package curl
```bash ```bash
root@7d93de07bf76:/# apt-get update root@7d93de07bf76:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB] Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 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] Fetched 25.8 MB in 8s (3215 kB/s)
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)
Reading package lists... Done Reading package lists... Done
``` ```

View File

@@ -1,4 +1,4 @@
FROM python:3.6-alpine FROM python:3.12-alpine
ADD . /code ADD . /code
WORKDIR /code WORKDIR /code
RUN pip install redis flask RUN pip install redis flask

View File

@@ -23,8 +23,8 @@ COPY . /code/
第二步 `requirements.txt` 文件里面写明需要安装的具体依赖包名 第二步 `requirements.txt` 文件里面写明需要安装的具体依赖包名
```bash ```bash
Django>=2.0,<3.0 Django>=4.0,<5.0
psycopg2>=2.7,<3.0 psycopg2-binary>=2.9,<3.0
``` ```
第三步`docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库使用的 Docker 镜像镜像之间的连接挂载到容器的卷以及服务开放的端口 第三步`docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库使用的 Docker 镜像镜像之间的连接挂载到容器的卷以及服务开放的端口
@@ -105,8 +105,8 @@ web_1 | Performing system checks...
web_1 | web_1 |
web_1 | System check identified no issues (0 silenced). web_1 | System check identified no issues (0 silenced).
web_1 | web_1 |
web_1 | November 23, 2017 - 06:21:19 web_1 | November 23, 2024 - 06:21:19
web_1 | Django version 1.11.7, using settings 'django_example.settings' 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 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C. web_1 | Quit the server with CONTROL-C.
``` ```
@@ -116,5 +116,5 @@ web_1 | Quit the server with CONTROL-C.
你还可以在 Docker 上运行其它的管理命令例如对于同步数据库结构这种事在运行完 `docker compose up` 在另外一个终端进入文件夹运行以下命令即可 你还可以在 Docker 上运行其它的管理命令例如对于同步数据库结构这种事在运行完 `docker compose up` 在另外一个终端进入文件夹运行以下命令即可
```bash ```bash
$ docker compose run web python manage.py syncdb $ docker compose run web python manage.py migrate
``` ```

View File

@@ -41,7 +41,7 @@ if __name__ == "__main__":
编写 `Dockerfile` 文件内容为 编写 `Dockerfile` 文件内容为
```docker ```docker
FROM python:3.6-alpine FROM python:3.12-alpine
ADD . /code ADD . /code
WORKDIR /code WORKDIR /code
RUN pip install redis flask RUN pip install redis flask

View File

@@ -7,7 +7,7 @@
如果不使用 `-d` 参数运行容器 如果不使用 `-d` 参数运行容器
```bash ```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 hello world
hello world hello world
@@ -19,7 +19,7 @@ hello world
如果使用了 `-d` 参数运行容器 如果使用了 `-d` 参数运行容器
```bash ```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 77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
``` ```
@@ -32,7 +32,7 @@ $ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep
``` ```
$ docker container ls $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 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` 命令 要获取容器的输出信息可以通过 `docker container logs` 命令

View File

@@ -6,7 +6,7 @@
```bash ```bash
$ docker container ls -a $ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 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 $ docker export 7691a814370e > ubuntu.tar
``` ```

View File

@@ -11,7 +11,7 @@
例如下面的命令输出一个 Hello World之后终止容器 例如下面的命令输出一个 Hello World之后终止容器
```bash ```bash
$ docker run ubuntu:18.04 /bin/echo 'Hello world' $ docker run ubuntu:24.04 /bin/echo 'Hello world'
Hello world Hello world
``` ```
@@ -20,7 +20,7 @@ Hello world
下面的命令则启动一个 bash 终端允许用户进行交互 下面的命令则启动一个 bash 终端允许用户进行交互
```bash ```bash
$ docker run -t -i ubuntu:18.04 /bin/bash $ docker run -t -i ubuntu:24.04 /bin/bash
root@af8bae53bdd3:/# root@af8bae53bdd3:/#
``` ```

View File

@@ -11,7 +11,7 @@
```bash ```bash
$ docker container ls -a $ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 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` 命令来重新启动 处于终止状态的容器可以通过 `docker container start` 命令来重新启动

View File

@@ -62,7 +62,7 @@ $ docker inspect web
$ docker run --rm -it \ $ docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \ # -v $HOME/.bash_history:/root/.bash_history \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \ --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \ ubuntu:24.04 \
bash bash
root@2affd44b4667:/# history root@2affd44b4667:/# history

View File

@@ -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
```
这样可以更高效地利用缓存加速构建过程

View File

@@ -17,7 +17,7 @@
假设我们需要一个得知自己当前公网 IP 的镜像那么可以先用 `CMD` 来实现 假设我们需要一个得知自己当前公网 IP 的镜像那么可以先用 `CMD` 来实现
```docker ```docker
FROM ubuntu:18.04 FROM ubuntu:24.04
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y curl \ && apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
@@ -49,7 +49,7 @@ $ docker run myip curl -s http://myip.ipip.net -i
这显然不是很好的解决方案而使用 `ENTRYPOINT` 就可以解决这个问题现在我们重新用 `ENTRYPOINT` 来实现这个镜像 这显然不是很好的解决方案而使用 `ENTRYPOINT` 就可以解决这个问题现在我们重新用 `ENTRYPOINT` 来实现这个镜像
```docker ```docker
FROM ubuntu:18.04 FROM ubuntu:24.04
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y curl \ && apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*

View File

@@ -15,11 +15,11 @@ ubuntu bionic 329ed837d508 3 days ago
列表包含了 `仓库名``标签``镜像 ID``创建时间` 以及 `所占用的空间` 列表包含了 `仓库名``标签``镜像 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相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多 另外一个需要注意的问题是`docker image ls` 列表中的镜像体积总和并非是所有镜像实际硬盘消耗由于 Docker 镜像是多层存储结构并且可以继承复用因此不同镜像可能会因为使用相同的基础镜像从而拥有共同的层由于 Docker 使用 Union FS相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多
@@ -83,7 +83,7 @@ ubuntu bionic 329ed837d508 3 days ago
列出特定的某个镜像也就是说指定仓库名和标签 列出特定的某个镜像也就是说指定仓库名和标签
```bash ```bash
$ docker image ls ubuntu:18.04 $ docker image ls ubuntu:24.04
REPOSITORY TAG IMAGE ID CREATED SIZE REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 329ed837d508 3 days ago 63.3MB ubuntu 18.04 329ed837d508 3 days ago 63.3MB
``` ```

View File

@@ -27,7 +27,7 @@ tmpfs on /etc/resolv.conf type tmpfs ...
这样每次启动的容器 DNS 自动配置为 `114.114.114.114` `8.8.8.8`使用以下命令来证明其已经生效 这样每次启动的容器 DNS 自动配置为 `114.114.114.114` `8.8.8.8`使用以下命令来证明其已经生效
```bash ```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 114.114.114.114
nameserver 8.8.8.8 nameserver 8.8.8.8

View File

@@ -190,15 +190,15 @@ $ docker login docker.domain.com
尝试推送拉取镜像 尝试推送拉取镜像
```bash ```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 ```bash
$ docker logout docker.domain.com $ 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 no basic auth credentials
``` ```