- 0. 安装
- 1. 常用命令
- 从image中创建container并运行,具体参数见 docker run —help
- 在容器内使用gpu,使用—runtime = nvidia设置选项
- 在Docker 19.03或更高版本中,设置选项—gpus all
- 指定GPU: —gpus “device=1”
- 进入正在运行的container,exec退出使用ctrl+D
- 或者,attach退出使用ctrl+p ctrl+q
- docker exec 和docker attach 都可以进到container的shell, 但是有区别。
- docker exec在容器内会起一个新的进程,docker attach 只会把标准输出输入连接到容器内的PID1
- Attach就像投屏,如果你从两个终端attach到一个container,当你在一个终端输入的时候,
- 内容会出现在另一个终端,两个终端是连接在同一个tty上的。
- 用attach方式进到container,当从终端退出来的时候,container是会被关闭的。
- exec是不会这样的,不同终端连接到不同的tty,退出终端的时候不会关闭container的main process.
- 启动未在运行的container
- 查看所有container或查看正在运行的container
- 容器导出为image, -a为名字,-m为更改信息
- 2. Dockerfile
- 3. Docker Compose
- 4. ssh连接docker容器
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)
# Ubuntu#卸载旧版本dockersudo apt-get remove docker docker-engine docker-ce docker.io#清空旧版docker占用的内存sudo apt-get remove --auto-remove docker#更新系统源sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-commoncurl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"#更新sudo apt-get update# 查看有哪些可以安装的版本apt-cache madison docker-ce#安装5:19.03.6~3-0~ubuntu-bionic版sudo apt-get install -y docker-ce=5:19.03.6~3-0~ubuntu-bionic# 重启dockersudo systemctl restart docker# 配置阿里云镜像加速器sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://7ixh250y.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker# 验证sudo docker versionsudo docker run hello-world# 安装docker-composesudo apt install python3-pipsudo apt-get updatesudo pip3 install --upgrade pipsudo pip3 install docker-composedocker-compose --version# 安装NVIDIA Container Toolkit# 首先要确保已经安装了nvidia driver# 添加源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 -y nvidia-container-toolkitsudo systemctl restart docker# 测试 NVIDIA gpu# 其中最后的参数nvidia/cuda:10.0-base 是Nvidia官方的镜像,# 需要根据工作站主机中实际安装的cuda版本进行修改,版本可以用nvcc -V查看。# 进入容器之后可以跑一下nvidia-smi命令看看sudo docker run -it --name test_nvidia_docker -p 26006:6006 --gpus all nvidia/cuda:10.0-base
1. 常用命令
注意:命令中方括号中的内容需要自行替换
查看已有的docker 镜像(image)和对应的 IMAGE ID
docker images
镜像导入导出删除
# 导入docker load -i [retinaface.tar]# 导入后使用下述命令给images 命名docker tag 8ca8dfe44635 retinaface# 导出docker save [IMAGE ID] > [retinaface.tar]# 指定名称删除镜像docker rmi [java:8]
容器导入导出停止删除
# 导入docker import [name.tar]# 导出docker export [container ID] > [name.tar]# 停止所有正在运行的容器docker stop $(docker ps -q)# 删除(如果容器正在运行,需要加-f)docker rm [container ID]# 删除所有正在运行的容器docker rm -f $(docker ps -q)
创建或运行容器(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]
5. 管理```bash# 查看运行日志docker logs [container-id]# 查看哪些容器在跑代码docker stats # cpu占用高的,大概在跑代码docker top [containerName] # 查看容器在跑的进程PIDdocker 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示例:
FROM pytorch/pytorch:1.3-cuda10.1-cudnn7-develMAINTAINER kppkkp <920315842@qq.com>ENV DEBIAN_FRONTEND=noninteractiveRUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.listRUN apt-get update \&& apt-get install -y sudo build-essential cmake curl vim wget tree screenfetch \htop zip openssh-server screen unzip graphviz ca-certificates \&& apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libxrender-dev \&& apt-get clean \&& rm -rf /var/lib/apt/lists/*# python3 relatedRUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simpleRUN pip config set install.trusted-host mirrors.aliyun.comRUN pip install cythonRUN pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'RUN git clone --recursive https://github.com/LingyvKong/CenterTrack.git /CenterTrackWORKDIR /CenterTrackRUN pip install -r requirements.txt# RUN sh /CenterTrack/src/lib/model/networks/DCNv2/make.sh# Add user rootRUN echo "root:123456" | chpasswdRUN echo "root ALL=(ALL) ALL" >> /etc/sudoers# config sshRUN mkdir /var/run/sshd && \sed -ri 's/^PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config && \sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_configEXPOSE 22# set environmentRUN ldconfigENV LANG C.UTF-8RUN export LC_ALL=C.UTF-8 >> /root/.bashrcRUN export LANG=C.UTF-8 >> /root/.bashrcCMD ["/usr/sbin/sshd", "-D"]
从Dockerfile构建image
# 进入Dockerfile所在路径后运行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
version: '2.4'services:nvsmi:image: ubuntu:16.04runtime: nvidiaenvironment:- NVIDIA_VISIBLE_DEVICES=allcommand: nvidia-smi
常用命令
# 创建并运行容器docker-compose up -ddocker-compose up# 停止并删除容器docker-compose down# 停止容器docker-compose stop# 删除停止状态的容器docker-compose rm# 查看日志docker-compose logs# 查看所有容器docker-compose ps -a
4. ssh连接docker容器
进入容器,安装ssh apt install openssh-server;并修改ssh配置允许root登录
# 编辑文件/etc/ssh/sshd_config# 添加一行PermitRootLogin yes表示ssh允许root登录echo "PermitRootLogin yes" >> /etc/ssh/sshd_config# 随后一定要重启ssh服务service ssh restart
进入容器,设置root密码
passwd root
之后就可以直接ssh远程连接进容器了
如果ssh连接容器后没办法使用python等环境,
vim ~/.bashrc# 然后添加下面三行到文件中export LIBRARY_PATH=/usr/local/cuda/lib64/stubsexport LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64export PATH=/opt/conda/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# 保存退出后运行source ~/.bashrc
