docker

docker

版本

组成

安装

在线安装

## ubuntu

# 卸载旧版本 docker
sudo apt-get remove docker docker-engine docker.io containerd runc

# Docker 仓库设置
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# Docker 官方 GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 验证 fingerprint
sudo apt-key fingerprint 0EBFCD88

# 添加 Docker CE 的 stable 版本的仓库
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# Docker CE 最新版本安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 存在多个 Docker 仓库时,会安装最新版本的 docker-ce

## Docker CE 指定版本安装
# 列出仓库中所有的 Docker CE 版本
apt-cache madison docker-ce

 docker-ce | 5:19.03.5~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 5:19.03.4~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 18.06.3~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 18.06.2~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages

sudo apt-get install \
    docker-ce=18.09.1~3-0~ubuntu-xenial \
    docker-ce-cli=18.09.1~3-0~ubuntu-xenial \
    containerd.io

离线安装

离线安装包:https://download.docker.com/(/dists/xenial/pool/stable)

# ubuntu
sudo dpkg -i docker-ce_<version>.deb docker-ce-cli_<version>.deb containerd.io_<version>.deb
# 查看 Docker 状态
sudo service docker status
sudo docker info

修改存储路径

默认情况下,docker 镜像的默认存储路径是 /var/lib/docker,这相当于直接挂载系统目录下,而一般在搭系统时,这个区都不会太大,所以如果长期使用 docker 开发应用,就需要把默认的路径更改到需要路径下或外挂存储。

方法1:修改 dockerd 配置文件

# 查看默认存储路径
docker info | grep "Root Dir"

  Docker Root Dir: /var/lib/docker

# 创建存储目录
mkdir -p /data/docker

# 修改 docker 的 systemd 的 docker.service 的配置文件
vim /usr/lib/systemd/system/docker.service

  # 注释原先的
  ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
  # 新增
  ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph=/data/docker

# 重启 docker 服务
systemctl daemon-reload
systemctl restart docker

# 确认
docker info | grep "Root Dir"

  Docker Root Dir: /data/docker
&#x1F628 注意:目前网上大多数配置参数是 --graph,其实这是老版本中的使用方法,新版本已经抛弃,改用了 --data-root ,具体可以通过命令 dockerd --help 查看使用的参数。

方法2:修改 docker daemon 配置文件

# /etc/docker/daemon.json
{
    "data-root": "/data/docker"
}

设置镜像

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://fird1mfg.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

设置代理

参考连接:https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

# 创建配置文件
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/proxy.conf

  [Service]
  Environment="HTTP_PROXY=http://wwwproxy.mysite.com:80"
  Environment="HTTPS_PROXY=http://wwwproxy.mysite.com:80"

# 重启
systemctl daemon-reload
systemctl restart docker.service

# 验证
systemctl show --property=Environment docker

  Environment=HTTP_PROXY=http://wwwproxy.mysite.com:80 HTTPS_PROXY=http://wwwproxy.mysite.com:80

修改运行中的容器

示例1:添加挂载路径

# 停止所有 docker 容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

# 停止 docker 服务
service docker stop

# 修改容器的配置信息
  ### /var/lib/docker/containers/<hash>/hostconfig.json
  # 修改前
  "Binds": ["/opt/jenkins:/var/jenkins_home"]
  # 修改后
  "Binds": ["/opt/jenkins:/var/jenkins_home", "/opt/data:/opt/data"]

  ### /var/lib/docker/containers/<hash>/config.v2.json
  # 修改前
  "MountPoints": {
      "/var/jenkins_home": {
          "Source": "/opt/jenkins",
          "Destination": "/var/jenkins_home",
          "RW": true,
          "Name": "",
          "Driver": "",
          "Type": "bind",
          "Propagation": "rprivate",
          "Spec": {
              "Type": "bind",
              "Source": "/opt/jenkins",
              "Target": "/var/jenkins_home"
          },
          "SkipMountpointCreation": false
      }
  }
  # 修改后
  "MountPoints": {
      "/var/jenkins_home": {
          "Source": "/opt/jenkins",
          "Destination": "/var/jenkins_home",
          "RW": true,
          "Name": "",
          "Driver": "",
          "Type": "bind",
          "Propagation": "rprivate",
          "Spec": {
              "Type": "bind",
              "Source": "/opt/jenkins",
              "Target": "/var/jenkins_home"
          },
          "SkipMountpointCreation": false
      },
      "/opt/data": {
          "Source": "/opt/data",
          "Destination": "/opt/data",
          "RW": true,
          "Propagation": "rprivate"
      }
  }

# 启动 docker 服务
service docker start

NGC 设置

参考链接:https://ngc.nvidia.com/setup/installers/cli

  1. 获取 API Key
  1. 安装 NGC
wget --content-disposition https://ngc.nvidia.com/downloads/ngccli_linux.zip && unzip ngccli_linux.zip && chmod u+x ngc-cli/ngc

find ngc-cli/ -type f -exec md5sum {} + | LC_ALL=C sort | md5sum -c ngc-cli.md5

sudo ln -s $(pwd)/ngc-cli/ngc /usr/local/bin/ngc

ngc config set
# 填写 API Key

# 卸载 dirname `which ngc` | xargs rm -r

nvidia-docker

组件 功能 最低 Docker 版本要求
nvidia-docker 旧版工具包,2014 年发布,依赖于 Docker 插件模型,主要通过 nvidia-docker 命令和 nvidia-docker-plugin 来实现 GPU 支持。 Docker 1.12 或更高版本
nvidia-docker2 新版工具包,2018 年 12 月发布,基于 nvidia-container-runtime,不再依赖插件,深度集成到 Docker 中。 Docker 1.13 或更高版本,建议 Docker 19.03 或更高版本
nvidia-container-toolkit 独立工具包,2019 年发布,为 Docker 和 Kubernetes 等平台提供兼容的GPU支持。包含 nvidia-container-runtime Docker 1.13 或更高版本,建议 Docker 19.03 或更高版本

产品组件

组件名称 所属产品 用途
nvidia-docker nvidia-docker 最早的 NVIDIA GPU 容器工具,提供基础 GPU 支持,现已被 nvidia-docker2 替代。
nvidia-docker-plugin nvidia-docker nvidia-docker 的核心插件,负责 GPU 资源挂载和环境变量设置,现已被 nvidia-docker2 替代。
nvidia-container-runtime nvidia-docker2 GPU 容器的运行时,替代 Docker 默认的 runc,实现 GPU 容器的环境配置和资源管理。
nvidia-docker2 nvidia-docker2 Docker GPU 支持插件,简化 GPU 容器配置和启动,整合了 nvidia-container-runtime
libnvidia-container1 nvidia-container-toolkit 核心库,提供 GPU 隔离和管理功能,所有 GPU 容器工具的基础组件。
libnvidia-container-tools nvidia-container-toolkit 命令行工具,支持 GPU 容器的配置、调试和管理。
nvidia-container-toolkit nvidia-container-toolkit 包含 GPU 支持配置和工具,负责与 Docker 集成,提供 GPU 容器环境设置。
nvidia-container-toolkit-base nvidia-container-toolkit 提供 nvidia-container-toolkit 的基础库,包含基础的配置和依赖项支持。
libnvidia-container-devel nvidia-container-toolkit 开发库,包含头文件,用于开发者集成 GPU 支持。
libnvidia-container-static nvidia-container-toolkit 静态库,用于开发者在编译时静态链接 libnvidia-container

安装

nvidia-docker

依赖项:

离线安装

版本 docker版本要求 NVIDIA Driver版本要求 备注
1.0.0 >=1.10 >= 367.57 nvidia-docker_<version>.debnvidia-docker_<version>.rpm文件中包含nvidia-docker-plugin
1.0.1 >=1.10 >= 367.57 nvidia-docker_<version>.debnvidia-docker_<version>.rpm文件中包含nvidia-docker-plugin
# Ubuntu
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

# CentOS
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm
sudo rpm -i /tmp/nvidia-docker*.rpm && rm /tmp/nvidia-docker*.rpm
sudo systemctl start nvidia-docker

# Other
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1_amd64.tar.xz
sudo tar --strip-components=1 -C /usr/bin -xvf /tmp/nvidia-docker*.tar.xz && rm /tmp/nvidia-docker*.tar.xz
# Run nvidia-docker-plugin
sudo -b nohup nvidia-docker-plugin > /tmp/nvidia-docker.log

## Test nvidia-smi
nvidia-docker run --rm nvidia/cuda nvidia-smi

nvidia-docker2

各版本依赖项:

nvidia-docker2 docker版本要求 NVIDIA Driver版本要求 libnvidia-container1 libnvidia-container-tools nvidia-container-runtime nvidia-container-toolkit
2.0.0 >= 1.12 >= 384.81 1.0.0 1.0.0 2.0.0  
2.1.0 >= 1.12 >= 384.81 1.0.1 1.0.1 2.0.0  
2.2.0 >= 1.12 >= 384.81 1.1.0 1.1.0 2.1.0  
2.3.0 >= 1.12 >= 396.26 1.2.0 1.2.0 2.2.0  
2.4.0 >= 18.09 >= 410.48 1.2.0 1.2.0 2.3.0  
2.5.0 >= 18.09 >= 410.48 1.2.0 1.2.0 2.3.0  
2.6.0 >= 19.03 >= 410.48 1.3.0 1.3.0 3.4.0  
2.7.0 >= 19.03 >= 418.87 1.3.3 1.3.3 3.6.0 1.6.0
2.8.0 >= 19.03 >= 440.33 1.3.4 1.3.4 3.7.0 1.7.0
2.9.0 >= 19.03 >= 450.51 1.4.0 1.4.0 3.8.0 1.8.0
2.9.1 >= 19.03 >= 450.51 1.4.1 1.4.1 3.8.1 1.8.1
2.10.0 >= 20.10 >= 460.32 1.5.0 1.5.0 3.9.0 1.9.0
2.11.0 >= 20.10 >= 465.19 1.5.1 1.5.1 3.10.0
3.11.0
1.10.0
1.11.0
2.12.0 >= 20.10 >= 470.57 1.6.0 1.6.0 3.12.0 1.12.0
2.13.0 >= 20.10 >= 495.29 1.7.0 1.7.0 3.13.0 1.13.0
2.14.0 >= 20.10 >= 510.39 1.14.0   3.14.0 1.14.0
&#x1F628 注意:
  1. 从版本 2.7.0 开始,nvidia-docker2 包直接依赖 nvidia-container-toolkit。不再需要安装 nvidia-container-runtime,其功能已经被整合进 nvidia-container-toolkit,不再是单独的依赖项。
  2. 1.14.0 是最后一个包含 nvidia-container-runtime 和 nvidia-docker2 包的版本。从此版本开始,所有必需的功能都已集成到 nvidia-container-toolkit 包中。这意味着以后不再需要单独安装 nvidia-container-runtime 或 nvidia-docker2。

在线安装

# Ubuntu
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
    && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
    sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install nvidia-docker2
#sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

离线安装

sudo dpkg -i libnvidia-container1_<version>.deb
sudo dpkg -i libnvidia-container-tools_<version>.deb
sudo dpkg -i nvidia-container-runtime_<version>.deb
sudo dpkg -i nvidia-docker2_<version>.deb

sudo systemctl restart docker

nvidia-container-toolkit

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/release-notes.html

在线安装

# Apt
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit


# Yum or Dnf
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
  sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

sudo yum install -y nvidia-container-toolkit


# Zypper
sudo zypper ar https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo
sudo zypper --gpg-auto-import-keys install -y nvidia-container-toolkit

离线安装

各版本包含内容:

nvidia-container-toolkit docker版本要求 NVIDIA Driver版本要求 libnvidia-container1 libnvidia-container-tools nvidia-container-runtime nvidia-docker2
1.0.0 >= 1.12 >= 384.81 1.0.0 1.0.0    
1.1.0 >= 1.12 >= 384.81 1.1.0 1.1.0    
1.2.0 >= 1.12 >= 396.44 1.2.0 1.2.0    
1.3.0 >= 18.09 >= 410.48 1.2.0 1.2.0    
1.4.0 >= 18.09 >= 410.48 1.3.0 1.3.0    
1.5.0 >= 18.09 >= 418.40 1.3.3 1.3.3    
1.6.0 >= 19.03 >= 418.40 1.6.0 1.6.0    
1.7.0 >= 19.03 >= 440.33 1.7.0 1.7.0    
1.8.0 >= 19.03 >= 450.51 1.8.0 1.8.0    
1.8.1 >= 19.03 >= 450.51 1.8.1 1.8.1    
1.9.0 >= 19.03 >= 460.32 1.9.0 1.9.0    
1.10.0 >= 19.03 >= 465.19 1.10.0 1.10.0    
1.11.0 >= 20.10 >= 470.57 1.11.0 1.11.0    
1.12.0 >= 20.10 >= 470.57 1.12.0 1.12.0    
1.13.0 >= 20.10 >= 495.29 1.13.0 1.13.0    
1.13.1 >= 20.10 >= 495.29 1.13.1 1.13.1    
1.13.2 >= 20.10 >= 495.29 1.13.2 1.13.2    
1.13.3 >= 20.10 >= 495.29 1.13.3 1.13.3    
1.13.4 >= 20.10 >= 495.29 1.13.4 1.13.4    
1.13.5 >= 20.10 >= 495.29 1.13.5 1.13.5    
1.14.0 >= 20.10 >= 510.39 1.14.0   3.14.0 2.14.0
1.14.1 >= 20.10 >= 510.39 1.14.1 1.14.1    
1.14.2 >= 20.10 >= 510.39 1.14.2 1.14.2    
1.14.3 >= 20.10 >= 510.39 1.14.3 1.14.3    
1.14.4 >= 20.10 >= 510.39 1.14.4 1.14.4    
1.14.5 >= 20.10 >= 510.39 1.14.5 1.14.5    
1.14.6 >= 20.10 >= 510.39 1.14.6 1.14.6    
1.15.0 >= 20.10 >= 515.43 1.15.0 1.15.0    
1.16.0 >= 20.10 >= 520.56 1.16.0 1.16.0    
1.16.1 >= 20.10 >= 520.56 1.16.1 1.16.1    
1.16.2 >= 20.10 >= 520.56 1.16.2 1.16.2    
1.17.0 >= 20.10 >= 525.60 1.17.0 1.17.0    
# 依次安装
sudo dpkg -i libnvidia-container1_<version>.deb
sudo dpkg -i libnvidia-container-tools_<version>.deb
sudo dpkg -i nvidia-container-runtime_<version>.deb
sudo dpkg -i nvidia-container-toolkit-base_<version>.deb
sudo dpkg -i nvidia-container-toolkit_<version>.deb

# 设定 Docker 使用 NVIDIA Driver
sudo nvidia-ctk runtime configure — runtime=docker

# 重启 Docker
sudo systemctl restart docker

docker-compose

模板

version: "3"

services:
  # 服务名
  triton-server-20.09:
    # 镜像标签
    image: nvcr.io/nvidia/tritonserver:20.09-py3
    # 重启策略
    restart: always
    # 网络
    # network_mode: "bridge"
    networks:
      front-tier:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10
    # 容器名称
    container_name: triton-server-20.09
    # 主机名
    #   hostname: "leinao_devel"
    # env_file:
    #   - .env/xq_cross_border
    working_dir: /workspace
    # 容器的标准输入保持打开。相当于 docker run 的 -i
    # stdin_open: true
    # 分配一个虚拟终端并绑定到容器的标准输入上。相当于 docker run 的 -t
    # tty: true
    # 共享内存大小
    shm_size: 1gb
    # 限制容器使用的系统资源
    ulimits:
      # 堆栈的最大值
      stack: 67108864
    # 获取主机root权限
    privileged: true
    # 容器中添加的功能
    cap_add:
      - SYS_PTRACE
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    ports:
      - "8000:8000"
      - "8001:8001"
      - "8002:8002"
    environment:
    #   - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
    volumes:
        - /home/zkln/workspace/triton-r20.09/model_repository:/workspace/model_repository
    command:
      - tritonserver
      - --model-repository=/workspace/model_repository
      # - /bin/bash
    # docker-compose > 1.28.0
    deploy:
      resources:
        reservations:
          devices:
            - capabilities: [gpu]
              driver: nvidia
              device_ids: ["1"]

networks:
  front-tier:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

restart:容器重启策略。

shm_size:容器允许的共享内存(Linux上的/dev/shm分区)的大小。单位b(bytes),k or kb(kilo bytes),m or mb(mega bytes),g or gb(giga bytes)。

privileged:出于安全考虑,docker容器中默认的root用户只是相当于主机上的一个普通用户权限,不允许访问主机上的任何设备。使用该参数让容器获取主机root权限,允许容器访问连接到主机的所有设备(位于/dev文件夹下)。

cap_add:为容器添加指定功能。

security_opt:覆盖容器的默认标签方案。

附:常见问题

  1. python 提示错误 UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position

    docker 中 python 代码的 print(“中文”) 出现错误,但宿主机不会出现该错误,如下:

     UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-127: ordinal not in range(128)
    

    原因:

    因为 locale 的设置导致 shell 的stdin/stdout/stderr 的默认编码为 ascii,当用ascii编码去解释 python3 默认 unicode 编码的时候,则会有问题

    解决方法:

    python3 的解决方式是 容器在初始化时候 需要设置 shell 的 stdin/stdout/stderr 的默认编码方式为 utf-8, 需要重启容器

     # docker run 方式
     docker run -e PYTHONIOENCODING=utf-8 m_container:latest my-python3
     # docker-compose 方式
     environment:
     - PYTHONIOENCODING=utf-8
    
  2. docker: Error response from daemon: Unknown runtime specified nvidia

    解决方法:

     # 重启 docker 服务
     sudo systemctl daemon-reload
     sudo systemctl restart docker
    
  3. docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: signal: segmentation fault (core dumped), stdout: , stderr:: unknown.

    解决方法:

     # 降级
     sudo apt-get install nvidia-docker2=2.4.0-1
     # 重启 docker 服务
     sudo systemctl daemon-reload
     sudo systemctl restart docker
    
Table of Contents