docker的内容默认保存到/var/lib/docker
查看保存路径 docker info | grep “Docker Root Dir”

0. 安装

推荐!阿里云加速安装docker教程:https://www.cnblogs.com/chengmf/p/13122013.html
官方安装docker教程(用的是国外的源):https://docs.docker.com/engine/install/ubuntu/
NVIDIA官网安装步骤:NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs (github.com)

  1. # Ubuntu
  2. #卸载旧版本docker
  3. sudo apt-get remove docker docker-engine docker-ce docker.io
  4. #清空旧版docker占用的内存
  5. sudo apt-get remove --auto-remove docker
  6. #更新系统源
  7. sudo apt-get update
  8. sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  9. curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  10. sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  11. #更新
  12. sudo apt-get update
  13. # 查看有哪些可以安装的版本
  14. apt-cache madison docker-ce
  15. #安装5:19.03.6~3-0~ubuntu-bionic版
  16. sudo apt-get install -y docker-ce=5:19.03.6~3-0~ubuntu-bionic
  17. # 重启docker
  18. sudo systemctl restart docker
  19. # 配置阿里云镜像加速器
  20. sudo mkdir -p /etc/docker
  21. sudo tee /etc/docker/daemon.json <<-'EOF'
  22. {
  23. "registry-mirrors": ["https://7ixh250y.mirror.aliyuncs.com"]
  24. }
  25. EOF
  26. sudo systemctl daemon-reload
  27. sudo systemctl restart docker
  28. # 验证
  29. sudo docker version
  30. sudo docker run hello-world
  31. # 安装docker-compose
  32. sudo apt install python3-pip
  33. sudo apt-get update
  34. sudo pip3 install --upgrade pip
  35. sudo pip3 install docker-compose
  36. docker-compose --version
  37. # 安装NVIDIA Container Toolkit
  38. # 首先要确保已经安装了nvidia driver
  39. # 添加源
  40. distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
  41. curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
  42. curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
  43. # 安装并重启
  44. sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
  45. sudo systemctl restart docker
  46. # 测试 NVIDIA gpu
  47. # 其中最后的参数nvidia/cuda:10.0-base 是Nvidia官方的镜像,
  48. # 需要根据工作站主机中实际安装的cuda版本进行修改,版本可以用nvcc -V查看。
  49. # 进入容器之后可以跑一下nvidia-smi命令看看
  50. sudo docker run -it --name test_nvidia_docker -p 26006:6006 --gpus all nvidia/cuda:10.0-base

1. 常用命令

注意:命令中方括号中的内容需要自行替换

  1. 查看已有的docker 镜像(image)和对应的 IMAGE ID

    1. docker images
  2. 镜像导入导出删除

    1. # 导入
    2. docker load -i [retinaface.tar]
    3. # 导入后使用下述命令给images 命名
    4. docker tag 8ca8dfe44635 retinaface
    5. # 导出
    6. docker save [IMAGE ID] > [retinaface.tar]
    7. # 指定名称删除镜像
    8. docker rmi [java:8]
  3. 容器导入导出停止删除

    1. # 导入
    2. docker import [name.tar]
    3. # 导出
    4. docker export [container ID] > [name.tar]
    5. # 停止所有正在运行的容器
    6. docker stop $(docker ps -q)
    7. # 删除(如果容器正在运行,需要加-f)
    8. docker rm [container ID]
    9. # 删除所有正在运行的容器
    10. docker rm -f $(docker ps -q)
  4. 创建或运行容器(container) ```bash

    从image中创建container并运行,具体参数见 docker run —help

    docker run -d [retinaface:v1] /bin/bash

在容器内使用gpu,使用—runtime = nvidia设置选项

docker run —runtime=nvidia —rm nvidia/cuda nvidia-smi

在Docker 19.03或更高版本中,设置选项—gpus all

指定GPU: —gpus “device=1”

docker run —gpus all —rm nvidia/cuda nvidia-sm

进入正在运行的container,exec退出使用ctrl+D

docker exec -it [name/id] /bin/bash

或者,attach退出使用ctrl+p ctrl+q

docker attach [name/id]

docker exec 和docker attach 都可以进到container的shell, 但是有区别。

docker exec在容器内会起一个新的进程,docker attach 只会把标准输出输入连接到容器内的PID1

Attach就像投屏,如果你从两个终端attach到一个container,当你在一个终端输入的时候,

内容会出现在另一个终端,两个终端是连接在同一个tty上的。

用attach方式进到container,当从终端退出来的时候,container是会被关闭的。

exec是不会这样的,不同终端连接到不同的tty,退出终端的时候不会关闭container的main process.

启动未在运行的container

docker start [name/id]

查看所有container或查看正在运行的container

docker ps -a docker ps

容器导出为image, -a为名字,-m为更改信息

docker commit -a “baozoudelimi” -m “add 20170309 xxxx message” [contain_id] [image_name]

  1. 5. 管理
  2. ```bash
  3. # 查看运行日志
  4. docker logs [container-id]
  5. # 查看哪些容器在跑代码
  6. docker stats # cpu占用高的,大概在跑代码
  7. docker top [containerName] # 查看容器在跑的进程PID
  8. docker inspect [containerName] | grep Mounts -A 20

https://www.jianshu.com/p/38e5eb3d1e41

2. Dockerfile

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

  • FROM: 用来告诉Docker使用哪个base Image或者主平台,基础镜像可以从dockerhub找,如pytorch(选devel版):https://hub.docker.com/r/pytorch/pytorch/tags?page=1&ordering=last_updated
  • WORKDIR: 为其他的docker指令如RUN、CMD设置一个工作目录
  • ENV: 设置app所需的环境变量。
  • ARG: 设置构建参数,ARG <参数名>[=<默认值>]
  • COPY: 格式为COPY SOURCE DESTINATION,拷贝文件
  • RUN: 在当前的image新建一个layer,并在这个新的layer运行命令
  • CMD: 在container中运行命令
  • ENTRYPOINT: 将container配置为可执行文件,如 ENTRYPOINT [“flask”, “run”]

更多命令可参考:https://docs.docker.com/engine/reference/builder/#run

注意:RUN和CMD的区别——Dockerfile不能等同于shell命令来写,
在 Shell 中,连续两行是同一个进程执行环境,因此前一个命令修改的内存状态,会直接影响后一个命令;
而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是两个完全不同的容器。
每一个 RUN 都会启动一个容器、执行命令、然后提交存储层文件变更。
第二层RUN启动的是一个全新的容器,跟第一层的容器完全没关系,自然不可能继承前一层构建过程中的内存变化。
因此如果需要改变以后各层的工作目录的位置,那么应该使用 WORKDIR 指令。

Dockerfile示例:

  1. FROM pytorch/pytorch:1.3-cuda10.1-cudnn7-devel
  2. MAINTAINER kppkkp <920315842@qq.com>
  3. ENV DEBIAN_FRONTEND=noninteractive
  4. RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
  5. RUN apt-get update \
  6. && apt-get install -y sudo build-essential cmake curl vim wget tree screenfetch \
  7. htop zip openssh-server screen unzip graphviz ca-certificates \
  8. && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libxrender-dev \
  9. && apt-get clean \
  10. && rm -rf /var/lib/apt/lists/*
  11. # python3 related
  12. RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
  13. RUN pip config set install.trusted-host mirrors.aliyun.com
  14. RUN pip install cython
  15. RUN pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
  16. RUN git clone --recursive https://github.com/LingyvKong/CenterTrack.git /CenterTrack
  17. WORKDIR /CenterTrack
  18. RUN pip install -r requirements.txt
  19. # RUN sh /CenterTrack/src/lib/model/networks/DCNv2/make.sh
  20. # Add user root
  21. RUN echo "root:123456" | chpasswd
  22. RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers
  23. # config ssh
  24. RUN mkdir /var/run/sshd && \
  25. sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config && \
  26. sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
  27. EXPOSE 22
  28. # set environment
  29. RUN ldconfig
  30. ENV LANG C.UTF-8
  31. RUN export LC_ALL=C.UTF-8 >> /root/.bashrc
  32. RUN export LANG=C.UTF-8 >> /root/.bashrc
  33. CMD ["/usr/sbin/sshd", "-D"]

从Dockerfile构建image

  1. # 进入Dockerfile所在路径后运行
  2. docker build -t flask_app:1.0 .

构建完后会在本机上创建一个image,可以使用docker images查看。

3. Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
https://www.runoob.com/docker/docker-compose.html
docker-compose.yaml中使用GPU(注意观察示例yaml中的层级结构):
注意docker-compose -v,docker-compose版本需要高于1.19

  1. version: '2.4'
  2. services:
  3. nvsmi:
  4. image: ubuntu:16.04
  5. runtime: nvidia
  6. environment:
  7. - NVIDIA_VISIBLE_DEVICES=all
  8. command: nvidia-smi

常用命令

  1. # 创建并运行容器
  2. docker-compose up -d
  3. docker-compose up
  4. # 停止并删除容器
  5. docker-compose down
  6. # 停止容器
  7. docker-compose stop
  8. # 删除停止状态的容器
  9. docker-compose rm
  10. # 查看日志
  11. docker-compose logs
  12. # 查看所有容器
  13. docker-compose ps -a

4. ssh连接docker容器

进入容器,安装ssh apt install openssh-server;并修改ssh配置允许root登录

  1. # 编辑文件/etc/ssh/sshd_config
  2. # 添加一行PermitRootLogin yes表示ssh允许root登录
  3. echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
  4. # 随后一定要重启ssh服务
  5. service ssh restart

进入容器,设置root密码

  1. passwd root

之后就可以直接ssh远程连接进容器了
如果ssh连接容器后没办法使用python等环境,

  1. vim ~/.bashrc
  2. # 然后添加下面三行到文件中
  3. export LIBRARY_PATH=/usr/local/cuda/lib64/stubs
  4. export LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64
  5. export PATH=/opt/conda/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  6. # 保存退出后运行
  7. source ~/.bashrc