Docker相关知识

安装配置Docker

  1. 安装Docker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装需要用到的软件
sudo apt update && sudo apt install ca-certificates curl gnupg

# 卸载自带的旧版本
sudo apt remove docker.io docker-doc docker-compose podman-docker containerd runc

# 请选择从【国外官方仓库】还是【国内中科大源】下载
# DOCKER_URL=https://download.docker.com/linux/debian
# DOCKER_URL=https://mirrors.ustc.edu.cn/docker-ce/linux/debian

# 添加Docker仓库密钥
curl -fsSL $DOCKER_URL/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加Docker软件源
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $DOCKER_URL \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装最新的Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 以非root用户身份管理Docker(可选)
1
2
3
4
5
6
7
8
9
10
11
# 创建docker组并将您的用户添加到组中
sudo groupadd docker
sudo usermod -aG docker $USER

# 将Docker配置为开机自启
sudo systemctl enable docker
sudo systemctl enable containerd

# 停止Docker开机自启
sudo systemctl disable docker.service
sudo systemctl disable containerd.service
  1. 更改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
# 挂载NVME硬盘,重启生效
sudo mkdir /mnt/nvme
sudo bash -c "echo '/dev/nvme0n1p1 /mnt/nvme ext4 defaults,discard 0 0' >> /etc/fstab"

# 先查看默认的数据储存路径
$ sudo docker info
......
Docker Root Dir: /var/lib/docker

# 修改镜像加速地址和数据储存路径
$ sudo vi /etc/docker/daemon.json
------------------------------------------------------
{
"registry-mirrors": [
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://dockerhub.icu",
"https://hub.atomgit.com"
],
"data-root": "/mnt/nvme/docker"
}
------------------------------------------------------

# 重新启动Docker服务使配置生效
sudo systemctl restart docker

常用Docker命令

  1. 常用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
docker ps					# 查看运行中的容器
docker images # 查看镜像列表
docker container ls # 查看容器列表
docker network ls # 查看网络列表
docker volume ls # 查看数据卷列表

docker rmi [NAME/ID] # 删除指定ID的镜像,-f 强制删除
docker save [NAME/ID] -o PATH/FILE.tar # 导出镜像
docker load -i PATH/FILE.tar # 导入镜像

docker rm [NAME/ID] # 删除指定的容器,-f 强制删除
docker logs [NAME/ID] # 查看容器日志
docker exec redroid logcat -d # 查看日志
docker exec redroid logcat -c # 清理日志

docker network create [N_NAME] # 创建网络
docker network inspect [N_NAME] # 查看网络数据源
docker network rm [N_NAME] # 删除网络
docker volume rm [V_NAME] # 删除数据卷
docker volume inspect [V_NAME] # 查看数据卷详情

docker update --restart=no [NAME/ID] # 取消其的自启动
docker update --restart=always [NAME/ID] # 设置其为自启动

docker build -f file -t test:v1 . # 构建镜像:-f 设置dockerfile名,-t 设置镜像名字和版本号,点代表Dockerfile所在目录
  1. 容器生命周期管理
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
# 创建一个新的容器但不启动它(语法同run):docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 创建并启动一个新的容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-d # 后台运行容器并返回容器 ID
-p # 端口映射,格式为 host_port:container_port
-v # 挂载卷,格式为 host_dir:container_dir
-u # 指定用户
-it # 交互式运行容器,分配一个伪终端
--name # 给容器指定一个名称
--rm # 容器停止后自动删除容器
--env , -e # 设置环境变量
--network # 指定容器的网络模式
--restart # 容器的重启策略(如 no、on-failure、always、unless-stopped)

# 删除一个或多个已经停止的容器:docker rm [OPTIONS] CONTAINER [CONTAINER...]
-f, --force # 强制删除正在运行的容器(使用 SIGKILL 信号)
-l, --link # 删除指定的连接,而不是容器本身
-v, --volumes # 删除容器挂载的卷

# 在运行中的容器内执行一个新的命令:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-d, --detach # 在后台运行命令
-e, --env # 设置环境变量
-t, --tty # 分配一个伪终端
-u, --user # 以指定用户的身份运行命令
-i, --interactive # 保持标准输入打开
--detach-keys # 覆盖分离容器的键序列
--env-file # 从文件中读取环境变量
--privileged # 给这个命令额外的权限
--workdir, -w # 指定命令的工作目录

docker kill [NAME/ID] # 强制停止容器
docker pause/unpause [NAME/ID] # 暂停/恢复容器中所有的进程
docker stop/start/restart [NAME/ID] # 停止/启动/重启指定的容器
  1. 容器操作
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
# 列出容器:docker ps [OPTIONS]
-a # 显示所有的容器,包括未运行的
-f # 根据条件过滤显示的内容
-l # 显示最近创建的容器
-n # 列出最近创建的n个容器
-q # 静默模式,只显示容器编号
-s # 显示总的文件大小
--no-trunc # 不截断输出
--format # 指定返回值的模板文件

# 查看容器中运行的进程信息:docker top [OPTIONS] CONTAINER [ps OPTIONS]

# 列出指定的容器的端口映射:docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

# 获取容器的日志:docker logs [OPTIONS] CONTAINER
-f # 跟踪日志输出
-t # 显示时间戳
--since # 显示某个开始时间的所有日志
--tail # 仅列出最新N条容器日志

# 显示容器资源的使用情况:docker stats [OPTIONS] [CONTAINER...]
--all , -a # 显示所有的容器,包括未运行的
--format # 指定返回值的模板文件
--no-stream # 展示当前状态就直接退出了,不再实时更新
--no-trunc # 不截断输出
  1. 本地镜像管理
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
# 列出本地镜像:docker images [OPTIONS] [REPOSITORY[:TAG]]
-a # 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
-f # 显示满足条件的镜像
-q # 只显示镜像ID
--digests # 显示镜像的摘要信息
--format # 指定返回值的模板文件
--no-trunc # 显示完整的镜像信息

# 删除本地一个或多个镜像:docker rmi [OPTIONS] IMAGE [IMAGE...]
-f # 强制删除
--no-prune # 不移除该镜像的过程镜像,默认移除

# 查看指定镜像的创建历史:docker history [OPTIONS] IMAGE
-H # 以可读的格式打印镜像大小和日期,默认为true
-q # 仅列出提交记录ID
--no-trunc # 显示完整的提交记录

# 标记本地镜像,将其归入某一仓库:docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

# 将镜像保存成 tar文件:docker save -o xx.tar [IMAGE...]

# 导入 SAVE 导出的镜像:docker load [OPTIONS]
--input , -i # 指定导入的文件,代替 STDIN
--quiet , -q # 精简输出信息

# 从归档文件中创建镜像:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
-c # 应用docker 指令创建镜像
-m # 提交时的说明文字
  1. 其他Docker命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 从镜像仓库中拉取或者更新指定镜像:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-a # 拉取所有 tagged 镜像
--disable-content-trust # 忽略镜像的校验,默认开启

# 从 Docker Hub 中查找镜像:docker search [OPTIONS] TERM
-f stars=10 # 列出收藏数大于10的镜像
--no-trunc # 显示完整的镜像描述
--automated # 只列出 automated build 类型的镜像

# 容器与主机之间的数据拷贝:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 主机与容器之间的数据拷贝:docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
-L # 保持源目标中的链接

# 检查容器里文件结构的更改:docker diff [OPTIONS] CONTAINER

# 将容器保存为新的镜像:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a # 提交的镜像作者
-c # 使用Dockerfile指令来创建镜像
-m # 提交时的说明文字
-p # 在commit时,将容器暂停

定制Docker镜像

  1. 使用 Docker build 命令创建镜像
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 build [OPTIONS] PATH | URL | -

--build-arg=[] # 设置镜像创建时的变量
--cpu-shares # 设置 CPU 使用权重
--cpu-period # 限制 CPU CFS 周期
--cpu-quota # 限制 CPU CFS 配额
--cpuset-cpus # 指定使用的 CPU ID
--cpuset-mems # 指定使用的 内存 ID
--disable-content-trust # 忽略校验,默认开启
-f # 指定要使用的 Dockerfile 路径
--force-rm # 设置镜像过程中删除中间容器
--isolation # 使用容器隔离技术
--label=[] # 设置镜像使用的元数据
-m # 设置内存最大值
--memory-swap # 设置Swap的最大值为 内存+swap,"-1" 表示不限swap
--no-cache # 创建镜像的过程不使用缓存
--pull # 尝试去更新镜像的新版本
--quiet, -q # 安静模式,成功后只输出镜像ID
--rm # 设置镜像成功后删除中间容器
--shm-size # 设置 /dev/shm 的大小,默认值是 64M
--ulimit # Ulimit 配置
--squash # 将 Dockerfile 中所有的操作压缩为一层
--tag, -t # 镜像的名字及标签,通常 name:tag 或者 name 格式
--network # 默认 default 在构建期间设置 RUN指令 的网络模式
  1. 关于Dockerfile中常用指令的说明
指令 说明
FROM 指定基础镜像,用于后续的指令构建
EXPOSE 声明容器运行时监听的特定网络端口
ENV 在容器内部设置环境变量
RUN 在构建过程中在镜像中执行命令
CMD 指定容器创建时的默认命令(可以被覆盖)
ENTRYPOINT 设置容器创建时的主要命令(不可被覆盖)
ADD 将文件、目录或远程URL复制到镜像中
COPY 将文件或目录复制到镜像中
VOLUME 为容器创建挂载点或声明卷
WORKDIR 设置后续指令的工作目录
  1. 一个可在容器中运行systemd的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
FROM phusion/baseimage:jammy-1.0.1

ENV continer docker

EXPOSE 8006

RUN echo 'APT::Get::Clean=always;' >> /etc/apt/apt.conf.d/99AutomaticClean
RUN sed -i 's@//ports.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list

# Enable systemd.
RUN apt-get update ; \
apt-get install -y systemd systemd-sysv ; \
apt-get clean ; \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ; \
cd /lib/systemd/system/sysinit.target.wants/ ; \
ls | grep -v systemd-tmpfiles-setup | xargs rm -f $1 ; \
rm -f /lib/systemd/system/multi-user.target.wants/* ; \
rm -f /etc/systemd/system/*.wants/* ; \
rm -f /lib/systemd/system/local-fs.target.wants/* ; \
rm -f /lib/systemd/system/sockets.target.wants/*udev* ; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl* ; \
rm -f /lib/systemd/system/basic.target.wants/* ; \
rm -f /lib/systemd/system/anaconda.target.wants/* ; \
rm -f /lib/systemd/system/plymouth* ; \
rm -f /lib/systemd/system/systemd-update-utmp*

VOLUME [ "/sys/fs/cgroup" ]

CMD ["/lib/systemd/systemd"]
  1. 构建完成后的相关操作
1
2
3
4
5
6
7
8
9
# 构建镜像,-t 设置镜像名字和版本号,后面的点代表Dockerfile所在目录
docker build -t leux:ubuntu .

# 运行已构建的镜像
docker run -d --privileged --name ubuntu -p 8006:8006 --hostname PVE --env continer=docker \
--cgroupns=host --tmpfs /tmp --tmpfs /run --tmpfs /run/lock -v /sys/fs/cgroup:/sys/fs/cgroup leux:ubuntu

# 与运行的容器交互
docker exec -it ubuntu /bin/bash