[学习笔记] - Docker

前言

Docker这东西其实说挺常用是挺常用,但是一旦不用就会有一段时间都不会去用,导致学了忘,然后再学一次,加上Docker可能更多是学习Linux吧,Docker本身并不是那么难,但是很多东西用不到导致每次都用不熟,这里也就记录下关于Docker的一些东西。

一些注释

这里对Docker常见的内容就不做过多描述了。
其次,由于Docker其实需要Linux很多相关的知识,比如网络,文件系统等等,这方面也不过多描述了。

Docker版本

Docker有3个版本

Docker Engine - Community(CE) Docker Engine - Enterprise(EE) Docker Enterprise
开源 闭源,商业产品 更贵的闭源,商业产品

Docker Concepts

Docker是一个用容器来开发,部署,运行运营程序的平台

Image(镜像)

Docker通过Dockerfile创建Image,在通过Image(镜像)制造Container(容器)
其中Image和Container的关系类似与面向对象的类与实例

那么具体什么是镜像,镜像里面包含了运行你的程序所需要的环境,代码,库,配置文件等等,所以镜像不单单只是环境。

镜像命名

镜像名:TAG,例如:ubuntu:18.04

Container(容器)

Container(容器)也就是Image的一个实例,相当于Image创建出了一台服务器。因为单纯的Image只是一些文件罢了。

命名空间

之所以说Container相当于一台服务器,那么它如何和主机进行区分?那就是通过命名空间。每个容器都有自己单独的命名空间。这些隔离会影响容器内部的系统调用

  • pid 命名空间:容器之间进程的隔离
  • net 命名空间:容器之间网络的隔离
  • ipc 命名空间:容器之间信号,消息队列,共享内存等的隔离
  • mnt 命名空间:容器之间文件挂载的隔离
  • uts 命名空间:可以使每个容器在网络上看起来相当于一个独立的节点,而不是一个进程
  • user 命名空间:容器之间用户的隔离

洋葱文件系统

洋葱文件系统(Union file systems),也叫做UnionFS,简单的说也就是一层一层的文件系统,比如第一层是linux基础,第二层是Ubuntu,第三层是Python,这样就构成了一个可以运行python的3层的有ubuntu环境的系统。

Control groups(控制组)

控制组也称CGroups,通过它,我们可以对一些共享资源进行限制,比如:CPU,内存,这样每个容器可以合理的分配的这些资源。

Container format(容器格式)

命名空间,洋葱文件系统,控制组组合起来称为容器格式。

network(网络)

既然上面说明每个容器都相当于一台服务器,那么肯定就有要配置网络的部分啦,这部分需要你自己有网络方面知识的基础。
Docker的网络大概可以分为2种关系

  • 主机 - 容器
  • 容器 - 容器

Docker的网络构架叫做Container Networking Model (CNM)

  • SandBox(网络沙盒):包含了这个网络的全部配置,例如:路由表、DNS服务器…
  • Network:抽象网络(implementation of a Network),比如以下:
    • none
    • host:和主机共用一个网络环境
    • bridge:Linux虚拟网络(桥)
    • overlay
    • macvlan
    • flannel
  • Endpoint:链接Network和SandBox,一端在容器中,另一端在network中。

指令

容器相关

创建·运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建容器
docker create [OPTIONS] IMAGE [COMMAND] [ARGS]
# 创建运行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARGS]

# 'docker run --help' see all
OPTIONS
-a 指定标准输入输出类型
-d 在后台运行容器,返回容器ID
-e 设置环境变量
-h 设置容器hostname
-i 交互模式运行容器
-t 为容器分配一个伪输入终端
-v 绑定一个卷
-p 设置端口映射
-w 设置容器的工作目录
--rm 容器运行结束时删除容器
--name 指定容器名称

运行·停止·重启

1
2
3
docker start [OPTIONS] CONTAINER [CONTAINER]
docker stop [OPTIONS] CONTAINER [CONTAINER]
docker restart [OPTIONS] CONTAINER [CONTAINER]

在指定容器中执行指令

1
docker exec [OPTIONS] CONTAINER COMMAND [ARGS]

向容器发送信号

1
docker kill [OPTIONS] CONTAINER [CONTAINER]

删除

1
2
3
4
5
6
docker rm [OPTIONS] CONTAINER [CONTAINER]

OPTIONS
-f 通过SIGKILL信号强制删除
-l 删除容器的网络连接
-v 删除容器的卷

暂停

1
2
3
4
# 暂停容器所有进程
docker pause [OPTIONS] CONTAINER [CONTAINER]
# 恢复容器所有进程
docker unpause [OPTIONS] CONTAINER [CONTAINER]

列出容器

1
2
3
4
5
6
7
8
9
# 列出容器列表
docker ps

# 'docker ps --help' see all
OPTIONS
-a 包括未运行的全部容器
-f 过滤条件
-n 最近创建的n容器
-q 只显示容器编号

连接容器

1
docker attach [OPTIONS] CONTAINER

所有容器事件

1
2
3
4
5
6
docker events [OPTIONS]

OPTIONS
-f 过滤条件
--since 从多久开始
--until 到多久为止

容器进程

1
docker top [OPTIONS] CONTAINER [OPTIONS]

容器日志

1
2
3
4
5
6
7
docker logs [OPTIONS] CONTAINER

OPTIONS
-f 跟踪输出
-t 输出时间戳
--tail 最新n条
--since 从多久开始

容器阻塞

1
docker wait [OPTIONS] CONTAINER [CONTAINER]

更多可自行运行docker指令查看

容器策略更新

1
2
3
4
docker update [OPTIONS] CONTAINER [CONTAINER...]

EXAMPLE
docker update --restart=always <CONTAINER ID>

镜像相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Usage:  docker image COMMAND

Manage images

Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run 'docker image COMMAND --help' for more information on a command.

Dockerfile

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
# 复制文件
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
ADD [--chown=<user>:<group>] <源路径>... <目标路径>

# 默认命令
CMD <CMD>
CMD ["可执行文件", "参数1", "参数2"...]

# 可添加参数指令
ENTRYPOINT <CMD>

# 环境变量 | 运行时存在
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>

# 构建参数 | 运行时不存在
ARG <参数名>[=<默认值>]

# 匿名卷
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

# 声明端口 | 仅仅是声明
EXPOSE port

# 指定工作目录
WORKDIR <工作目录路径>

# 指定当前用户 | 用户需存在
USER <用户名>[:<用户组>]

# 设置检查容器健康状况的命令
HEALTHCHECK [选项] CMD <命令>

Dockerfile reference

总结

Docker其实简单来说就是对

  • 容器的操作·管理
  • 对镜像的管理·创建
  • Dockerfile的编写

以此为中心进行理解的话,就会方便很多。