docker学习笔记

学习要求

  1. 有可以稳定访问 github 的代理;
  2. 最好是 Linux 系统,windows系统可以用wsl子系统。

在 ubuntu 上安装 docker

  1. 卸载之前的 docker 并安装需要的包:
    1
    2
    sudo apt-get remove docker docker-engine docker.io containerd runc
    sudo apt install curl software-properties-common gnupg lsb-release
  2. 添加并更新 apt 源:
    1
    2
    3
    4
    5
    6
    7
    #添加 Docker 官方 GPG key
    curl -fsSL https://download.docker.com/linux/ubuntu/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] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

    sudo apt update; sudo apt-get update #更新源
  3. 安装 docker:
    1
    2
    3
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    sudo docker version #查看Docker版本
    sudo systemctl status docker #查看Docker运行状态
  4. 让用户能以 root 权限来运行 docker 指令:
    1
    2
    3
    4
    sudo groupadd docker # 添加docker用户组,一般已存在,不需要执行
    sudo gpasswd -a $USER docker # 将登陆用户加入到docker用户组中
    newgrp docker # 更新用户组
    docker version # 测试docker命令是否可以使用sudo正常使用

当然,由于安装过程可能会发生变化,这里更建议去官网查看安装教程,网址在这

给 docker 配置代理

参考自资料
我使用的是clash for windows代理,稳定的免密代理为http://127.0.0.1:7890,端口号在cfw的配置页有。

  • Dockerd 代理
    在执行 docker pull 时,是由守护进程 dockerd 来执行。因此,代理需要配在 dockerd 的环境中。
    1
    2
    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo touch /etc/systemd/system/docker.service.d/proxy.conf
    然后在文件中添加 Service:
    1
    2
    3
    4
    5
    sudo vim /etc/systemd/system/docker.service.d/proxy.conf
    # 添加以下内容
    Environment="HTTP_PROXY=http://127.0.0.1:7890/"
    Environment="HTTPS_PROXY=http://127.0.0.1:7890/"
    Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
    最后重启 docker 服务即可快速拉取镜像。
    1
    2
    3
    4
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    # 尝试拉取一个6G的镜像,看看速度怎么样
    docker pull pytorch/pytorch:2.4.0-cuda12.1-cudnn9-devel

docker 常用指令

帮助启动

作用 命令
启动docker systemctl start docker
停止docker systemctl stop docker
重启docker systemctl restart docker
查看docker状态 systemctl status docker
查看docker概要信息 docker info
查看帮助文档 docker --help
查看具体命令帮助文档 docker 具体命令 --help

镜像命令

  • docker images
    列举出下载镜像的相关信息。
    REPOS:镜像仓库源
    TAG:镜像的标签
    IMAGE ID:镜像ID
    CREATED:镜像创建时间
    SIZE:镜像大小

  • docker search / pull 项目名称
    在远程库中搜索某个项目的信息 & 从远程库中拉取某个项目。

  • docker system df
    查看镜像、容器和本地卷的数量、活动的数量、大小等等。

  • docker rmi ImageID
    删除特定的镜像。
    -f:强制删除

容器命令

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

    • --name="容器名字":给容器指定一个名字
    • -d:后台运行容器并返回容器ID
    • -i:以交互模式运行容器,通常与-t一起使用
    • -t:给容器分配一个伪输入终端
    • -P:随机端口映射
    • -p:指定端口映射
    • docker run -it --name test ubuntu:20.04 启动ubuntu的docker
  • docker ps [OPTIONS]
    查看正在运行的容器信息。

    • -a:列出所有正在运行和操作过的容器
    • -l:显示最近创建的容器
    • -n:显示最近创建的n个容器
    • -q:静默模式,只显示容器编号
  • exit & ctrl+p+q
    exit会使容器退出并停止,而ctrl+p+q只会退出容器。

  • docker start/restart/stop/kill 容器ID或容器名
    启动/重启/停止/强行停止 容器。

  • docker rm 容器ID或容器名
    删除已停止的容器。

  • docker logs 容器ID
    查看容器的日志。

  • docker top 容器ID
    查看容器中运行的进程。

  • docker inspect 容器ID
    查看容器内部运行细节,输出一个json格式的文字。

  • docker exec -it 容器ID /bin/bash
    重新进入容器,并以命令行交互。

  • docker cp 容器ID:容器内文件路径 主机路径
    将容器内文件拷贝到主机的指定路径上。

  • docker export 容器ID > name.tar
    把容器全部导出为name.tar文件(镜像)。

  • cat name.tar | docker import - 镜像用户/镜像名称:版本号
    00:02 / 06:15
    1080P 高清
    倍速
    1人正在看

    已装填 219 条弹幕

docker 容器数据卷

备份docker容器内的重要数据(数据卷)到本机目录。
在运行容器时加上 --privileged=true

命令:docker run --privileged=true -v /宿主机绝对路径目录:容器内目录 镜像名
可以简单理解为两个目录下的文件是同步的。可以通过docker inspect来查看。
在运行了docker run -it --privileged=true --net=host -v /tmp/host_data:/tmp/docker_data ubuntu后,inspect会显示以下信息:

1
2
3
4
5
6
7
8
9
10
11
"Mounts": 
[
{
"Type": "bind",
"Source": "/tmp/host_data",
"Destination": "/tmp/docker_data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]

Dockerfile

Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。

关键字含义

  • FROM:基础镜像,当前镜像是基于哪个镜像的;
  • RUN:容器构建时运行的命令,有shell和exec两种格式;
  • WORKDIR:容器创建后默认的工作目录;
  • ENV:在构建镜像过程中设置环境变量;(例:ENV DEBIAN_FRONTEND=noninteractive)
  • COPY:将宿主机文件复制到镜像内;
  • ADD:将宿主机路径下的文件拷贝进镜像,并能自动处理URL和解压tar安装包,约等于COPY+解压;

构建镜像的命令

docker build [OPTIONS] PATH | URL | -

  • PATH: 包含 Dockerfile 的目录路径或 .(当前目录)。
  • URL: 指向包含 Dockerfile 的远程存储库地址(如 Git 仓库)。
  • -: 从标准输入读取 Dockerfile。
    常见参数:
  1. -t:后面接为构建的镜像指定名称和标签;

例子

以操作系统的Lab1为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
RUN apt-get update && \
apt-get install -y \
cmake=3.16.* \
cmake-curses-gui=3.16.* \
make \
ninja-build \
cpio \
binutils \
binutils-aarch64-linux-gnu \
binutils-riscv64-linux-gnu \
gcc=4:9.3.* \
gcc-aarch64-linux-gnu=4:9.3.* \
gcc-riscv64-linux-gnu=4:9.3.* \
g++=4:9.3.* \
g++-aarch64-linux-gnu=4:9.3.* \
g++-riscv64-linux-gnu=4:9.3.* \
grub-common \
grub-pc-bin \
xorriso && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

新建文件Dockerfile,写入以上内容,然后运行 docker build -t lab1:1.0 . 即可,表示在当前目录下根据Dockerfile文件创建一个lab1:1.0的镜像。

Docker 网络

运行 docker 服务后,会产生一个 docker0 的虚拟网桥。管理容器间的互联及网络映射,容器IP变动时可通过服务名直接网络通信而不受影响。

常用命令

  • docker network ls
    查看当前网络状态。

  • docker network inspect XXX
    查看网络原数据。

网络模式

  • bridge
    为每一个容器分配、设置IP,并将容器连接到 docker0虚拟网桥,默认为该模式;用 --network bridge 指定。
    docker 容器内部的IP是可能改变的!

  • host
    容器使用宿主机的IP和端口,并不虚拟出自己的网卡。用 --network host 指定。


docker学习笔记
https://kingdom-of-warriors.github.io/2024/09/29/docker学习笔记/
作者
Rayy
发布于
2024年9月29日
许可协议