1. Docker 介绍

“Docker is a platform designed to help developers build, share, and run container applications.”

Docker daemon (dockerd): Docker 守护进程,侦听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理 Docker 服务。

Docker client (docker): Docker 客户端,是许多 Docker 用户与 Docker 交互的主要方式。当使用诸如 docker run 命令时,client 会将这些命令发送到 dockerd,由后者执行这些命令。docker 命令使用的 Docker API。Docker 客户端可以与多个守护进程通信。

Docker registries: Docker 仓库用于存储 Docker 镜像 (images)。Docker Hub 是任何人都可以使用的公共仓库,Docker 默认在 Docker Hub 上查找镜像。用户可以运行自己的私人仓库。当使用 docker pull 或 docker run 命令时,Docker 从配置的仓库中提取所需的镜像。当使用该 docker push 命令时,Docker 会将的镜像推送到配置的仓库。

Docker objects: 使用 Docker 时 实际上是在创建和使用镜像、容器、网络、存储卷、插件等对象。

  • 镜像(Image) 是用于创建 docker 容器的模板程序,包含了运行应用所需的所有东西 —— 包括代码、二进制脚本、依赖库、环境变量和配置文件等等。
  • 容器(Container) 是镜像的运行实例,它在隔离的环境中运行不与主机其他容器共享状态,可以使用 Docker API 创建、启动、停止、移动或删除容器,也可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建一个新的镜像。它与该宿主机上运行的所有其他进程隔离开来,这种隔离利用了内核名称空间和cgroups。
  • 存储 在 docker 中,存储是管理和持久化数据的关键组成部分。Docker 为数据存储和管理提供了几种机制,主要是通过卷(volumes)、绑定挂载(bind mounts)和临时文件系统(tmpfs mounts)。Docker提供了卷和绑定挂载两种选项(对应不同存储定义区),使得容器可以将文件存储在宿主机上,这样即使容器停止文件也会持久保存。docker 还支持容器将临时文件存储在宿主机的内存中,这类文件不会被持久保存。
  • 网络 容器网络指的是容器之间能够连接和通信,或者与非 docker 工作负载通信的能力。容器默认启用了网络功能可以建立外部连接,容器不知道自己连接到了什么类型的网络,只看到一个带有 IP 地址、网关、路由表、DNS 服务和其他网络详细信息的网络接口。Docker 提供了几种不同的网络驱动程序,每种驱动程序都支持不同的用例和网络操作模式,默认使用 bridge 类型驱动,它在没有指定网络的容器时会自动连接到本地主机上的一个私有内部网络。

2. Docker 使用基础

2.1 安装

   以 CentOS 为例,安装、启动 docker

1
2
3
4
sudo yum install -y yum-utils
# 设置 docker 目标仓库并且从仓库安装
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1
2
3
# 启动Docker服务并设置为开机启动
sudo systemctl start docker
sudo systemctl enable docker

   默认情况下,只有 root 用户和 sudoer 才可以运行 Docker 命令(普通用户会报 Docker daemon 等错误)。为了避免每次都使用 sudo,可以将用户添加到 docker 组后重新登录。

1
2
sudo usermod -aG docker ${USER}
newgrp docker

2.2 运行容器

   通过 docker run 可以运行已有镜像创建一个新的容器,并且在创建容器后会立即启动它。docker create 命令也可以创建容器但不启动,创建容器后可以使用 docker start 命令启动。

1
2
3
4
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
# [OPTIONS] 是容器的相关配置信息
# IMAGE[:TAG|@DIGEST] 是镜像标志名
# [COMMAND] [ARG...] 是设定容器启动后运行的命令

   常见的可选运行 [OPTIONS] 有

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
### 存储卷
--mount source=<VOLUME_NAME>,target=[PATH]
#绑定 Volume,source 是 volume name,target 是容器内的挂载路径
--mount type=bind,source=[PATH],target=[PATH]
# 创建 Bind mounts,source 是 host 路径,target 是容器内的 bind 路径
-v/--volume host-src:container-dest[:options]
# Volume/Bind mounts 都可以用这个命令挂载,效果与上面相同

### 网络设置
--network NETWORK_NAME
# NETWORK_NAME 是事先用户创建的网络
--network container:<name|id>
# 与另外一个 container 网络直连

--publish/-p
-p 192.168.1.100:8080:80
# 将主机 IP 192.168.1.100 的 8080 端口映射到 docker 的 80 端口
-p 8080:80/tcp -p 8080:80/udp
# 将 host 主机 的 8080 tcp/udp 端口映射到 docker 的 80 tcp/udp 端口

### 资源限制
-m/--memory=""
# 内存限制
--memory-swap=""
# 内存+swap限制

--cpus=0.000
# cpu 数目,0.000表示 不限制
--cpuset-cpus=""
# 目标运行 cpu
--cpu-quota=
--cpu-period
# --cpu-quota 选项允许您指定容器可以获取的 CPU 时间周期的配额,与 --cpu-period 选项一起使用:例如 --cpu-quota 被设置为 50,000(微秒),并且 --cpu-period 是默认的 100,000(微秒),则表示该容器在每个 100 毫秒的 CPU 周期内能使用的 CPU 时间被限制在 50 毫秒内(cpu 利用率限制在 50%)。

--blkio-weight
# 限制 direct io的贷款,是一个权重值,范围 10-1000

--rm
# 在容器退出时自动清除容器的文件系统。不使用该参数时,容器的文件系统将保留在系统中,允许你稍后可以重新启动容器或检查其状态。

-d/--detach
# 直接分离,在后台运行容器
--detach-keys
# 参数允许重定义默认的热键,用于从容器的交互模式中分离出来,而不是用于终止容器

-w/--workdir
# 设置容器内的工作目录,当启动容器时,任何相对路径的命令或指令都将基于这个工作目录执行

-i/--interactive
# 保持 STDIN(标准输入)流开放,允许容器接收来自用户的输入
-t/--tty
# 为容器分配一个伪终端或 pseudo-TTY,模拟了终端设备,提供一个可以执行输入输出的文本界面
-it
# 结合使用 -it 参数时,允许与运行在容器中的命令行界面互动,就像是在使用一个交互式 shell 对话。

2.3 客户端命令

   docker 将默认配置文件保存在 /$HOME/.docker 下,运行时配置可以通过其中 config.json 文件进行配置。    通过 docker 客户端命令,可以管理容器的各种资源对象,其中一些客户端命令如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#### 基本管理
docker info # 查看当前版本、仓库等信息
docker login # 登录 Docker 仓库进行认证,以允许拉取或推送镜像。
docker logout # 从当前登录的仓库登出。
docker search # 根据给定的条件在 Docker 仓库上搜索镜像。

#### 镜像管理
docker images # 提供用于管理 Docker 镜像的子命令,如列出、删除和标记镜像。
docker builder # 处理构建的生命周期。
docker buildx # 扩展的构建命令,支持比如构建多架构镜像。

#### 容器管理
docker container # 包含用于管理容器的子命令,包括创建、启动、停止、移动和删除容器。
docker checkpoint # 管理检查点;检查点可以捕获正在运行的容器的状态。
docker exec # 用于进入在已运行的容器内执行命令。
docker ps # 列出所有容器,包括未运行的。
docker stop  # 停止一个或多个正在运行的容器。
docker start  # 启动一个或多个已停止的容器。
docker restart  # 重新启动容器。
docker rm  # 删除一个或多个容器。
docker logs # 查看容器日志,dockerd的日志 linux 系统在 /var/log/messages 中

####其他管理
docker system # 清理未使用的数据并显示 Docker 的系统范围内的信息。
docker inspect # 查看 Docker 对象(容器,镜像,卷等)的低级信息。
docker init # 为项目创建与 Docker 相关的启动文件,帮助快速设置。

#### 网络和卷管理
docker network # 管理网络。
docker volume # 管理卷。

#### Docker Swarm
docker service # 管理 Docker 服务,是 Docker Swarm 缩放功能的基础单位。
docker node # 管理 Docker Swarm 集群中的节点。
docker swarm # 管理 Swarm,Docker 的本地编排和集群工具。
docker config # 管理 Docker Swarm 配置,允许存储服务的配置文件。
docker context # 管理上下文,允许 Docker 根据指定的上下文使用不同的配置。

3. 创建镜像

3.1 Dockerfile

   Dockerfile 是一个文本文件,里面包含了一系列的指令和参数,用于定义如何构建一个 Docker 镜像,在 Dockerfile 中定义的每条指令将在构建过程中顺序执行,并每次形成一个layer。Dockerfile 的相关语法有:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
FROM	# 指定基础镜像(必需的指令,是构建自定义镜像的出发点)
COPY	# 从构建上下文复制新文件或目录到容器中的路径。
ADD	# 类似于 COPY,但还可以支持自动解压缩附加在 URL 上的存档文件
ARG	# 定义在构建时可以传递给运行时的参数
CMD	# 提供容器启动时的默认执行命令
ENTRYPOINT # 配置容器启动时运行的命令,允许该容器像程序一样被运行
ENV	# 设置环境变量
EXPOSE	# 告知 Docker 在容器运行时需要监听的端口
LABEL	# 添加元数据到镜像中,如描述、作者信息等
ONBUILD	# 添加在构建指定的派生镜像时被执行的触发指令
RUN	# 运行指定的命令并创建镜像层,常用于安装软件包
SHELL	# 设置镜像的默认 shell
STOPSIGNAL # 设定退出镜像的 system call signal
USER	# 设置 user 和 group ID
VOLUME	# 声明容器内的挂载点,主要用于持久化或共享数据
WORKDIR	# 切换工作目录(路径)

一个 Dockerfile 的例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# syntax=docker/dockerfile:1
FROM ubuntu:22.04

# install app dependencies
RUN apt-get update && apt-get install -y python3 python3-pip
RUN pip install flask==3.0.*

# install app
COPY hello.py /

# final configuration
ENV FLASK_APP=hello
EXPOSE 8000
CMD ["flask", "run", "--host", "0.0.0.0", "--port", "8000"]

3.2 构建镜像

   通过 docker build 命令可以构建镜像,这个命令也等同于 docker image build、docker buildx build、docker builder build等命令。

1
2
docker build [OPTIONS] PATH | URL | -
                       ^^^^context^^^^

   除了 Dockerfile 外,还有一个概念是 build “context”。Context 上下文是位于指定 PATH 或 URL 中的一组文件,构建过程可以引用上下文中的任何文件。例如,构建可以使用 COPY 指令来引用上下文中的文件。

   常见的可选构建 [OPTIONS] 有

1
2
3
-t/--tag	# 设置镜像 name 和可选的 tag,参数格式是 image_name:tag
-f/--file	# Dockerfile 的名字,默认为当前路径下的 "Dockerfile"
--build-arg	# build 时的环境变量,多个需要多组此参数 --build-arg VAR1=123

3.3 推送、拉取镜像

   通过 docker login 可以登录到指定仓库,再通过 docker push 和 pull 推送或拉取指定镜像。

1
2
3
docker login myregistry.com
docker push myregistry.example.com/myimage:latest
docker pull myregistry.example.com/myimage:latest

Docker 默认使用 Docker Hub 作为仓库,如果想改变默认仓库,需要在 Docker 配置中设置 –registry-mirror 选项。通常通过编辑 Docker 守护进程的配置文件 daemon.json 来完成。文件的默认位置通常在 /etc/docker/daemon.json,修改其中的相关参数。更改配置后,需要重启 Docker 服务以使更改生效 sudo systemctl restart docker

1
2
3
{
  "registry-mirrors": ["https://<myregistry.example.com>"]
}

4. 容器操作

   容器相关的一些实用操作命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看容器
docker ps -a

# 查看容器文件系统的修改
docker diff CONTAINER

# 查看容器的详细信息
docker inspect CONTAINER

# 查看容器的日志
docker logs CONTAINER

# 查看容器内程序的运行状态
docker top CONTAINER

# 启动、停止、重启容器
docker start|stop|restart CONTAINER

# 在主机和容器间copy文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

# 在一个运行容器中执行(bash)命令
docker exec -it CONTAINER bash

  • 版权声明:如需转载或引用,请附加本文链接并注明来源。