Docker 学习

Docker view

什么是Docker

Docker 是一个用于开发、搬运和运行应用程序的开放平台。 Docker 使您能够将应用程序与基础架构分开,以便您可以快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础架构。通过利用 Docker 的方法来快速传输、测试和部署代码,您可以显着减少编写代码和在生产环境中运行代码之间的延迟。

Docker 提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,包含运行应用程序所需的一切,因此您无需依赖主机上当前安装的内容。您可以在工作时轻松共享容器,并确保与您共享的每个人都获得以相同方式工作的相同容器。

Docker Architecture

Docker Architecture diagram

Docker 使用客户端-服务器架构。 Docker 客户端与 Docker 守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。 Docker 客户端和守护进程可以在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护进程。 Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您处理由一组容器组成的应用程序。

The Docker daemon

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

The Docker client

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

Docker registries

Docker 注册表存储 Docker 映像。 Docker Hub 是一个任何人都可以使用的公共注册表,Docker 默认配置为在 Docker Hub 上查找图像。您甚至可以运行自己的私有注册表。

当您使用 docker pulldocker run 命令时,所需的图像将从您配置的注册表中提取。当您使用 docker push 命令时,您的图像将被推送到您配置的注册表。

Docker objects

Images

图像是一个只读模板,其中包含创建 Docker 容器的说明。通常,一个图像基于另一个图像,带有一些额外的定制。例如,您可以构建一个基于 ubuntu 图像的图像,但安装 Apache Web 服务器和您的应用程序,以及使您的应用程序运行所需的配置详细信息。

Containers

容器是image的可运行实例。他的实质是进程,您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将一个容器连接到一个或多个网络,将存储附加到它,甚至可以根据其当前状态创建一个新图像。

The underlying technology

Docker是用Go编程语言编写的,并利用了Linux内核的一些特性来提供其功能。Docker使用一种称为命名空间的技术来提供称为容器的隔离工作空间。当你运行一个容器时,Docker为该容器创建一组命名空间。

这些命名空间提供了一个隔离层。容器的每个方面都在一个单独的命名空间中运行,其访问仅限于该命名空间。

img

容器技术和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。容器内没有自己的内核,也没有进行硬件虚拟。

Docker Command

Docker 命令大全 | 菜鸟教程 (runoob.com)

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
docker --help

Usage: docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
--config string Location of client config files (default
"C:\\Users\\Admin\\.docker")
-c, --context string Name of the context to use to connect to the
daemon (overrides DOCKER_HOST env var and
default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level
("debug"|"info"|"warn"|"error"|"fatal")
(default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default
"C:\\Users\\Admin\\.docker\\ca.pem")
--tlscert string Path to TLS certificate file (default
"C:\\Users\\Admin\\.docker\\cert.pem")
--tlskey string Path to TLS key file (default
"C:\\Users\\Admin\\.docker\\key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit

Management Commands:
builder Manage builds
buildx* Docker Buildx (Docker Inc., v0.10.4)
compose* Docker Compose (Docker Inc., v2.17.2)
config Manage Docker configs
container Manage containers
context Manage contexts
dev* Docker Dev Environments (Docker Inc., v0.1.0)
extension* Manages Docker extensions (Docker Inc., v0.2.19)
image Manage images
init* Creates Docker-related starter files for your project (Docker Inc., v0.1.0-beta.2)
manifest Manage Docker image manifests and manifest lists
network Manage networks
node Manage Swarm nodes
plugin Manage plugins
sbom* View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
scan* Docker Scan (Docker Inc., v0.25.0)
scout* Command line tool for Docker Scout (Docker Inc., v0.9.0)
secret Manage Docker secrets
service Manage services
stack Manage Docker stacks
swarm Manage Swarm
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes

Commands:
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes

Dockerfile 编写

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

这是 Dockerfile 的格式:

1
2
# Comment
INSTRUCTION arguments

Docker 按顺序在 Dockerfile 中运行指令。 Dockerfile 必须以 FROM 指令开头。这可能在解析器指令、注释和全局范围的 ARG 之后。 FROM 指令指定您正在构建的父图像。 FROM 之前只能有一个或多个 ARG 指令,这些指令声明在 Dockerfile 中的 FROM 行中使用的参数。

dockerfile 指令

  1. FROM:指定基础镜像。
  2. RUN:在镜像中执行命令。
  3. COPY:将文件从主机复制到镜像中。
  4. ADD:将文件或目录从主机复制到镜像中,并且支持从URL中复制文件。
  5. CMD:定义容器启动时要执行的命令。
  6. EXPOSE:声明容器将监听哪些端口。
  7. ENV:设置环境变量。
  8. ARG:定义构建时可用的参数。
  9. WORKDIR:设置容器中的工作目录。
  10. VOLUME:在容器中创建一个挂载点,用于持久化数据。
  11. USER:设置容器中运行命令的用户。
  12. LABEL:为镜像添加元数据。

Best Practices

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
# 使用基础镜像
FROM ubuntu:latest

# 添加元数据,包括镜像作者、联系方式等
LABEL maintainer="example@example.com"
LABEL version="1.0"
LABEL description="My Docker image"

# 使用apt-get更新并安装必要的软件包
RUN apt-get update && apt-get install -y \
software-properties-common \
curl \
vim

# 创建一个用户并将工作目录切换到该用户的主目录
RUN useradd -ms /bin/bash myuser
USER myuser
WORKDIR /home/myuser

# 复制文件到镜像中,将app.py复制到工作目录
COPY app.py .

# 暴露端口
EXPOSE 8000

# 定义环境变量
ENV MY_VAR="Hello World"

# 添加一个卷 , 使用 docker run -v /host/path:/app/data imageName 把主机上的 /host/path 目录挂载到容器中的 /app/data 目录,从而实现数据共享。
VOLUME /data

# 定义一个ONBUILD触发器,当该镜像被继承时,将自动执行COPY命令
ONBUILD COPY . /app

# 定义容器启动时执行的命令,运行app.py
CMD [ "python3", "app.py" ]
  • 使用apt-get更新并安装必要的软件包
  • 使用LABEL命令添加元数据
  • 在容器中创建用户以增加安全性
  • 复制文件到镜像中,同时将工作目录设置为容器中的主目录
  • 使用EXPOSE命令来暴露端口
  • 使用ENV命令定义环境变量
  • 使用VOLUME命令添加卷
  • 使用ONBUILD命令定义触发器,在该镜像被继承时执行COPY命令
  • 使用CMD命令定义容器启动时要执行的命令

.dockerignore file

在 docker CLI 将上下文发送到 docker 守护程序之前,它会在上下文的根目录中查找名为 .dockerignore 的文件。如果此文件存在,CLI 会修改上下文以排除与其中模式匹配的文件和目录。这有助于避免不必要地向守护进程发送大型或敏感文件和目录,并可能使用 ADDCOPY 将它们添加到图像中。

CLI 将 .dockerignore 文件解释为以换行符分隔的模式列表,类似于 Unix shell 的文件 glob。为了匹配的目的,上下文的根被认为是工作目录和根目录。例如,模式 /foo/barfoo/bar 都排除了 PATHfoo 子目录或位于 URL 的git 存储库的根目录中名为 bar 的文件或目录。两者都不排除任何其他内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 忽略所有 .log 文件
*.log

# 忽略 build 目录和其子目录
build/

# 忽略 .vscode 目录和其子目录
.vscode/

# 忽略 .DS_Store 文件
.DS_Store

# 忽略 .env 文件
.env
# 在根的任何直接子目录中排除名称以 temp 开头的文件和目录。
*/temp*

参考