nvidia-docker安装与维护

一、nvidia-docker安装与维护!(生产服务器需要运维人员安装,开发人员可忽略1.安装)

1. 安装

该部分运维可根据生产实际情况,进行具体问题补充


1.1 卸载系统Docker和Nvidia-container-runtime

sudo yum remove -y docker-ce docker-ce-cli containerd
sudo yum remove -y nvidia-container-runtime*  libnvidia-container*
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
# 移除daemon.json文件
mv /etc/docker/daemon.json  /tmp/daemon.json

参考博客:https://blog.csdn.net/feifeiyechuan/article/details/107706062


1.2 安装Docker(使用yum)

# 1. 安装可能用到的依赖
sudo yum install -y yum-utils \
	device-mapper-persistent-data \
	lvm2

# 2. 添加docker下载位置
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
    
# 3. 查询可以装什么docker版本
yum list docker-ce --showduplicates | sort -r

# 4. 安装指定版本
yum -y install docker-ce-18.06.1.ce-3.el7

# 5. 开启docker服务
systemctl start  docker

# 6. 设置开启自启动
systemctl enable docker

# 7. 查看 docker版本
docker version

# 8. 配置国内加速镜像
vim /etc/docker/daemon.json

配置内容:
{
 "registry-mirrors": [
    "https://xx4bwyg2.mirror.aliyuncs.com",
    "http://f1361db2.m.daocloud.io",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

# 退出并保存
:wq

# 9. 使配置生效
systemctl daemon-reload

# 10. 重启docker
systemctl restart docker

nvidia-docker安装与维护_第1张图片


1.3 Docker安装Nvidia-container-runtime(Docker容器调用gpu进行加速运算相关配置)

# 安装nvidia-container-runtime,默认安装位置:/usr/bin/
sudo apt-get install nvidia-container-runtime

# 修改 /etc/docker/daemon.json,配置默认nvidia运行
sudo vim /etc/docker/daemon.json 
# 在daemon.json文件中添加如下内容,如下示意图
{
"default-runtime": "nvidia"
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
# 重启docker服务即可生效
Sudo systemctl daemon-reload
Sudo systemctl restart docker

参考博客:https://blog.csdn.net/u010420283/article/details/104055046/


2. 基础镜像的下载

2.1 利用备份的镜像加载到本地(生产)docker

# 1. 生产环境docker镜像备份
docker save -o  【备份路径】/备份文件名.tar   【镜像id】
docker export -o 【备份路径】/备份文件名.tar   【容器id】
`其中-o表示输出到文件`

eg.

在这里插入图片描述

# 2. 利用备份镜像加载到生产环境docker镜像中
docker load -i 【备份路径】/备份文件名.tar     `保留原始镜像的tag信息,不需要自己指定`
docker import -i 【备份路径】/备份文件名.tar  【自己指定镜像tag信息:镜像名:版本号】
`其中-i表示镜像从文件输入。会成功导入镜像及相关元数据,包括tag信息

eg.

docker import /home/tpx/tpx_conda_cu101-cudnn7-ubuntu18.04.tar   docker/ai_tpx:v1
  • export导出tar文件略小于save导出的

  • export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出

  • 基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。

建议

可以依据具体使用场景来选择命令:

  1. 若是只想备份images镜像,使用save、load即可

  2. 若是在启动容器后,容器内容有变化,需要备份,则使用export、import

  3. 针对于第二点, 如果想要备份容器,可将之转换为镜像 ,然后使用备份images镜像的save、load方法进行备份到本地

  • 容器转换为镜像命令:

    • docker commit  【容器id】  【镜像名:版本号】 
      

    参考博客:https://blog.csdn.net/ncdx111/article/details/79878098


2.2 生产环境使用代理拉取镜像(有时配置不生效,故生产环境不建议)

docker代理配置

# 1. 为docker服务创建一个内嵌的systemd目录和conf文件
mkdir -p /etc/systemd/system/docker.service.d 
vim /etc/systemd/system/docker.service.d/http-proxy.conf

# http-proxy.conf文件添加以下环境变量
[Service]
Environment="HTTP_PROXY=http://proxy3.bj.petrochina:8080"
Environment="HTTPS_PROXY=http://proxy3.bj.petrochina:8080"
Environment="NO_PROXY=localhost,127.0.0.1"

nvidia-docker安装与维护_第2张图片

# 2. 查看环境变量
systemctl show --property=Environment docker

# 3. 更新配置并重启docker服务
systemctl daemon-reload
systemctl restart docker

默认从本地仓库或者国外仓库拉取基础镜像(国内仓库需要配置)

eg.

docker pull Anaconda

3. 补充:使用root用户创建本地用户,并加入sudo权限

# 创建用户,并指定sudo权限
# 1. 创建用户
#一、新建用户adduser、useradd
#	两个用户创建命令之间的区别
#1)adduser: 会自动为创建的用户指定主目录、系统shell版本,会在创建时输入用户密码。(建议使用她)
	adduser 用户A,创建用户成功
	passwd  用户A,设置密码
	进入/etc/sudoers,添加sudo权限:用户A  ALL=(ALL)  NOPASSWD: ALL,保存退出

#2)useradd:需要使用参数选项指定上述基本设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。
sudo useradd -d /home/yourname -m yourname


#2.增加sudo(root)权限
#一般三种方法:
一种是sudo usermod -aG sudo username
一种是修改/etc/sudoers文件,在root ALL=(ALL) ALL下面复制一行同样的只不过root改成你的用户名
一种是修改/etc/passwd 找到自己的用户一行吧里面的用户id改成0



# docker操作:
# 1. 如果当前服务器上没有docker组,即下面命令如果没有输出结果需要创建;
cat /etc/group|grep docker
# 2. (针对于1.没有输出)创建docker组
sudo  groupadd docker
# 3. 将自己用户(如tpx)加入到docker组中
sudo gpasswd -a tpx docker
# 4. 查看是否添加成功
cat /etc/group|grep docker
groups

二、 普通用户开发使用(非root用户,普通用户的开发操作手册)

针对于当前生产服务器中已经安装过 docker gpu服务,参考如下

官网建议:

为了避免在使用docker命令时不得不使用sudo,创建一个名为docker的Unix组,并向其中添加用户。当docker守护进程启动时,它使Unix套接字的所有权可以被docker组读写。


2.1 普通用户环境配置(需要用户有sudo权限)

***alert: 本地用户不需要再装一个docker,服务器有就可用,需要进行如下配置:***下面的操作需要使用sudo,如果没有,需要root权限的用户添加给你sudo权限

# !再次强调,下面操作用户需要有sudo权限,如果没有需要和root用户申请

# 1. 如果当前服务器上没有docker组,即下面命令如果没有输出结果需要创建;
cat /etc/group|grep docker
# 2. (针对于1.没有输出)创建docker组
sudo  groupadd docker
# 3. 将自己用户(如tpx)加入到docker组中
sudo gpasswd -a tpx docker
# 4. 查看是否添加成功
cat /etc/group|grep docker
groups

上面4.输出结果如下:(结果表示添加成功)

nvidia-docker安装与维护_第3张图片

2.2 Docker应用体验(!每个“容器"就是一个虚拟环境)

# 1. 查看本地加载的镜像
docker images

nvidia-docker安装与维护_第4张图片

其中各个序号理解:

  1. 表示镜像名
  2. 表示镜像对应的版本号。      镜像唯一表示法(镜像名:版本号)
   	1. 表示镜像id。 				  镜像唯一表示法(镜像 id)
  3. 镜像创建时间

alert: docker操作中,每次我们指定镜像,使用上面"镜像的唯一表示"代表指定镜像


2.2.1 使用指定镜像,在宿主机上运行独立的虚拟环境,即容器 <==> 运行虚拟环境(!每个“容器"就是一个虚拟 环境)
**补充:**
# 2 运行独立容器环境,并使得容器可见宿主机所有gpu
docker run -it  -d --gpus all  --restart=always  --name 【容器名】【镜像id】 /bin/bash

# 2.1 快速检查容器上是否可以访问gpu
docker run -it --rm --gpus all tensorflow/tensorflow:latest-gpu-jupyter nvidia-smi


# 2.2 或者运行独立容器环境(独立的虚拟环境)
docker run  -d  -it --name ai_tpx  docker/ai_tpx:v1  /bin/bash  

# 容器随着docker启动而启动,或者直接将参数(--restart=always)加入到docker run命令
docker update --restart=always  【容器名】

这里-it是参数作用是:

-i: 以交互模式运行容器,通常与 -t 同时使用;

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用

最后的/bin/bash是command参数。

–name="": 为独立的容器虚拟环境指定一个名称;

docker/ai_tpx:v1 使用指定镜像(使用镜像唯一表示法)

其它参数,可自行了解!

nvidia-docker安装与维护_第5张图片

# 3. 查看当前宿主机上所有的docker容器
docker ps -a

在这里插入图片描述

其中各个序号理解:

  1. 容器 ID

  2. 为镜像,镜像唯一表示法(镜像名:版本号)

  3. 为容器名称

    补充:STATUS表示容器状态,Up表示运行,Exit表示退出

# 4. 进入指定容器
 docker exec -it 【容器id/容器名】  /bin/bash

# 退出
exit

红色框表示 我们进入到虚拟容器环境的root用户下,表示成功

在这里插入图片描述

# 5. 用户进入容器后,可根据自己需求安装所需要的python环境-依赖包。(注意在安装python依赖包时候需要指定代理参数)
eg. 
pip install virtualenv -i http://pypi.douban.com/simple --trusted-host pypi.douban.com --proxy="http://proxy3.bj.petrochina:8080"
# 6. 宿主机与docker容器里的文件相互拷贝(下面命令下宿主机上使用)
# (1)宿主机文件 拷贝 到容器 
docker cp  【要拷贝到宿主机上路径】  【容器名:文件路径】 
` (eg.)
` docker cp ai_tpx:/opt/module/cv/a.txt  /home/tpx/opt/module/cv/

# (2)容器文件 拷贝 到宿主机
docker cp  【容器名:文件路径】  【要拷贝到宿主机上路径】
` (eg.)
` docker cp /home/tpx/opt/module/cv/tests  ai_tpx:/opt/module/cv/

在这里插入图片描述

# 7. 一些docker命令
#  从docker仓库,或者配置的仓库环境中拉取基础镜像
docker pull  【指定镜像名:具体仓库中指定名称不能乱写】
#  查看docker历史命令 
docker history
#  查看容器的状态
docker -ps -a
#  指定容器的运行、停止
docker start/stop 【容器id】
#  强制删除指定容器
docker  rm -f 【容器id】
#  强制删除指定镜像
docker rmi -f 【镜像id】
#  容器转换为镜像命令(在宿主机上执行)
docker commit  【容器id】  【镜像名:版本号】 
# 8. docker启动容器指定某几个gpu(某几个显卡)
# 使用第3,4张卡
--gpus='"device=3,4"'

2. DockerFile构建镜像(需要了解DockerFile指令含义)

2.1 DockerFile基本语法规则

1、 FROM(指定基础image):

构建指令,必须指定且需要在 Dockerfile其它指令的前面。后续的指令都依赖于该指令的image。FROM指令指定的基础image可以是官方远程仓库中,也可以 位于本地仓库。

example:

​ FROM centos:7.2

​ FROM centos


2、MAINTAINER(用来 指定镜像的 创建者信息 )

构建指令,用于将image的制作者相关信息写入到image中。当我们对该 image执行docker inspect命令时候,输出中有相应的字段记录该信息。

example:

​ MAINTAINER tpx “[email protected]


3、RUN(安装软件用)

构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了Centos,那么软件 管理部分只能使用Centos的包管理命令。

example:

​ RUN cd /tmp && ls -al

​ RUN ["/bin/bash", “-c”, “echo hello”]


4、CMD(设置container启动时执行的命令):

设置指令,用于container启动时指定的操作。该指令只能在文件 中存在一次,如果有多个,则只执行最后一条

example:

​ CMD echo “hello, world!”


5、ENTRYPOINT(设置container启动时执行的 操作):

设置指令,指定容器启动时执行的命令,可以多次设置,也是执行最后一个。

格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
    
注:
	ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

6、ADD(将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget)

格式:
    ADD <src>... <dest>
    ADD ["",... ""] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/

7、COPY(功能类似ADD,但是是不会自动解压文件,也不能访问网络资源)


8、LABEL(用于为镜像 添加元数据)

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

9、ENV(设置环境变量)

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

10、EXPOSE(指定于外界 交互的端口)

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080    EXPOSE 11211/tcp 11211/udp
注:
	EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

11、VOLUME(用于指定持久化目录)

格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"\
注:  
	一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
		1 卷可以容器间共享和重用
		2 容器并不一定要和其它容器共享卷
		3 修改卷后会立即生效
		4 对卷的修改不会对镜像产生影响
		5 卷会一直存在,直到没有任何容器在使用它

12、WORKDIR(工作目录,类似于cd命令)

格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
    WORKDIR b  (这时工作目录为/a/b)
    WORKDIR c  (这时工作目录为/a/b/c)
注:
	通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

13、USER(指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户)

格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

 示例:
  USER www

注:
  使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过`docker run`运行容器时,可以通过-u参数来覆盖所指定的用户。

14、ARG(用于指定传递给构建运行时的变量)

格式:  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
  
注:
	当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

15、ONBUILD(用于设置镜像 触发器)

格式:  ONBUILD [INSTRUCTION]

示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
  
注:
	当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

2.2 使用DockerFile构建镜像

# DockerFile生产镜像的命令
docker build -t   【镜像名:自己给定】    【DockerFile路径】    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r68FVnVM-1619507054386)(C:\Users\mazhe\AppData\Roaming\Typora\typora-user-images\image-20210421163113697.png)]


2.3 具体的DockerFile案例,可查看国内、外镜像仓库的DockerFile文件

以下是一个小例子:

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

#MAINTAINER 维护者信息
MAINTAINER tpx 

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]

三、常用命令

nvidia-docker安装与维护_第6张图片

nvidia-docker安装与维护_第7张图片

你可能感兴趣的:(虚拟环境,经验分享,docker)