Docker介绍及常用命令大全
AI魔法学院
2024-05-05
分享海报

Docker中的三个重要构成:Image(镜像)Container(容器)Repository(仓储)Image相当于OOP中的类,Container相对于类实例,Repository是存放位置。

image:是一个只读模板,带有创建Docker容器的说明。

通常一个镜像是基于另一个镜像,并进行一些额外的拓展自定义。例如,用户可以构建一个基于ubuntu映像的映像,并安装Apache web服务器、应用程序以及所需的配置信息。也就是说,镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

操作系统分为内核用户空间,Linux内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像就相当于是一个root文件系统,这个文件系统里面包含可以运行在 Linux 内核的程序以及相应的数据。可以创建自己的镜像,也可以只使用他人创建并在仓库中发布的镜像。

要构建自己的镜像,可以创建一个Dockerfile定义创建映像和运行映像所需的步骤。Dockerfile中的每个指令都会在映像中创建一个层。当更改Dockerfile并重建图像时,只会重建那些已更改的层。

Container镜像运行时的实例

类似运行起来的虚拟机,里面运行着用户的的应用程序。通过一个镜像可以创建许多个互不影响的Container容器。Docker 镜像类似 Linux Root FileSystem,通过镜像启动一个容器。一个镜像就是一个可执行的包,其中包括运行应用程序所需要的代码、运行时、库、环境变量和配置文件等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于独立的命名空间。容器存储层的生存周期和容器一样,皮之不存毛将焉附,容器消亡时,容器存储层也随之消亡。

Repository
集中存放镜像文件的地方

镜像构建完成后,可以在当前宿主上运行,但是如果需要在其它服务器上使用这个镜像,就需要一个类似Git仓库那样的集中存储、分发镜像的服务,Docker Registry就是这样的服务。

一个Docker Registry中可以包含多个仓库,每个仓库可以包含多个Tag,每个Tag对应一个镜像。镜像仓库是Docker用来集中存放镜像文件的地方,类似于之前常用的代码仓库。

通常一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。

docker 镜像操作

# dockerfile创建镜像

  docker build -t image_name Dockerfile_path

  eg: docker build -t ip_check . (代表当前目录)

# 列出镜像

  docker images

 

# 拉取镜像

  docker pull 镜像名

  eg:docker pull python:3.5 :指定版本

 

# 删除镜像

  docker rmi 镜像名

docker 容器操作

# 创建容器

  docker run [option] 镜像名 [向启动容器中传入的命令]-i 表示以交互模式运行容器

     -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。

     --name 为创建的容器命名

     -v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用         多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。

     -d run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -         t 两个参数,创建后就会自动进去容器)

     -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射

     -e 为容器设置环境变量

     --network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同

     -i 表示以交互模式运行容器

     -t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。

# 查看容器列表

   docker ps -a

  

# 交互式启动容器

   docker run -it --name=mycentos centos /bin/bash

  

# 启动已停止容器

   docker start b750bbbcfd88

# 停止正在运行的容器

   docker stop <容器 ID>

# 进入容器终端

   docker exec -it 243c32535da7 /bin/bash

# 删除容器

   docker rm 容器Id/容器名

  

# 保存容器为镜像

   docker commit 容器名 镜像名

镜像打包与迁移

# 镜像打包成文件

   docker save -o 保存的文件名 镜像名

  

# 异地加载镜像

   docker load -i ./centos.tar

其他

# 启动docker服务

   systemctl start docker

# docker 安装(centos7

   curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

常用命令

docker 进程

docer 进程启动、停止、重启等三种 常见操作

service docker start   # 启动docker

service docker stop    # 关机docker

service docker restart # 重启docker

镜像操作

镜像是容器执行的前提条件,一般需要掌握命令注意有搜索下载删除创建

docker images      # 镜像列表

docker search xxx  # 检索镜像, 从镜像仓库中检索

docker pull xxx    # 下载镜像

docker rmi xxx     # 删除镜像

容器操作

容器的各种操作主要包括,启动、关闭、重启和日志查询。

容器创建 :run

加载镜像,创建容器run 后面可以跟很多的参数,比如容器暴露端口指定,存储映射,权限等等,由于参数过多,下面只给出几个不同的例子,来具体的演示参数可以怎么加

docker run

         -i              # 打开 STDIN,用于控制台交互

         -t              # 支持终端登录

         -d              # 要求容器后台运行,默认前台 前三个标签可连写为itd

         -v              # 挂载数据卷

         --name=dc_nm    # 指定容器名

         -p 8080:80      # 暴露容器端口 80,并与宿主机端口 8080 绑定 

         centos:latest   # 镜像名:版本

更多参见文章

基本操作:

容器本操作主要包括启动、停止、重启、删除

docker ps -a                       # 查看容器列表, 列出所有的容器

docker exec -it "ct_id" /bin/bash  # 进入容器,ct_id是容器id

# xxx可以是容器名,也可以是容器id

docker start   xxx                 # 打开容器

docker stop    xxx                 # 关闭容器

docker restart xxx                 # 重启

docker rm      xxx                 # 删除

复制文件

# 宿主机容器

docker cp 宿主机文件路径 容器名称:/home/your_path

# 容器宿主机 注意,命令执行是在容器之外

docker cp 容器名称:/home/file.txt /home/宿主机目录

案例:搭建深度学习环境

创建docker

sudo apt-get install docker.io

docker -v  #

# 避免docker操作必须要sudo,将当前用户加入docker用户组

sudo usermod -aG docker ${YOUR_NAME_HERE} # 自己好像没起作用

docker image ls

Nvidia-docker安装

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \

      && 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/$distribution/libnvidia-container.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-docker2

sudo pkill -SIGHUP dockerd

检查安装是否成功

sudo docker run --rm --gpus all nvidia/cuda:11.3.1-base-ubuntu20.04 nvidia-smi

输出

创建容器

NVIDIADocker创建了CUDAimage,所以我们只需要找相应的镜像来直接生成container就好。

sudo docker pull nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

拉取镜像成功之后,创建容器

sudo docker run -itd -v ~/work:/work

                -rm  # 代表退出容器后就删除容器

                --name=UOS20_NERF

                --gpus all nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

运行起container,通过nvidia-sminvcc -V进行检查,如果打印信息版本显示正常,则说明成功。

问题nvidia-smi显示的是cuda 12.1,不是我预想的11.3nvcc -V得到的是预期结果,不知道是不是安装有问题?

部署深度学习环境

进入容器

sudo docker exec -it 7d911f22e498 /bin/bash   // 方法1

sudo docker attach 容器名称                   // 方法2

安装所需要的环境,

apt-get update

apt-get install sudo

sudo apt-get install vim

替换源

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

sudo vim /etc/apt/sources.list

# sources.list内粘贴以下内容

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

#deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

安装GCC 10cmake

sudo apt install gcc-8 g++-8

# Ubuntu20默认情况下没有安装gccg++等工具

sudo apt install gcc-11 g++-11 # 这样装不上

sudo apt-get install software-properties-common

sudo apt-get update

sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test

sudo apt install -y gcc-11

sudo apt install -y g++-11

sudo apt install cmake        # 可能默认的低版本不是自己需要的

安装3.21

sudo apt install wget

wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz

sudo tar -xvzf cmake-3.22.1.tar.gz -C /usr/share

cd /usr/share/cmake-3.22.1

sudo ./configure

sudo chmod 777 ./configure

sudo apt install libssl-dev # 上一句失败,运行这一句

sudo make -j4

sudo make install

sudo update-alternatives --install /usr/bin/cmake cmake /usr/local/bin/cmake 1 --force

安装python

sudo apt install python3

sudo ln -s /usr/bin/python3 /usr/bin/python

# 替换pip

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

pip config set install.trusted-host mirrors.aliyun.com

安装miniconda

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

bash *.sh

export PATH=/root/miniconda3/bin:$PATH # conda 的位置

source ~/.bashrc

后面的深度学习环境部署就和直接在本地机器上部署一样了。

Dockerfile编写

以上步骤可以通过Dockerfifile配置文件完成。Dockerfifile 是一个文本文件,包含了一条条的指令。每一条指令构建一层。基于基础镜像,最终构建出一个新的镜像。

在本地新建docker环境文件夹,将Dockerfile放入文件夹中,执行

mkdir docker

cd docker

vim Dockerfile

# 制作docker image

docker build -t IMAGE_NAME .

# 运行生成容器

docker run --runtime=nvidia -it --rm IMAGE_NAME /bin/bash

即可快速搭建相应的镜像环境,也可以自己写Dockerfile,来创建环境,环境有修改的时候可以直接修改Dockerfile,这样下次再创建相同环境的时候就很方便了,并且可以push到自己的私有库,方便异地使用

Dockerfile配置文件(根据网络参考改写,自己尚未运行,可能有问题)

# 定义父镜像

sudoFROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

# 定义作者信息

MAINTAINER Winston

# 定义工作目录

WORKDIR /src

 

# install basic dependencies

RUN apt-get update

RUN apt-get install -y wget vim cmake

 

# install miniconda3

RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/Miniconda3-latest-Linux-x86_64.sh.sh

RUN bash ~/Miniconda3-latest-Linux-x86_64.sh.sh -b -p /home/miniconda3 && rm ~/Miniconda3-latest-Linux-x86_64.sh.sh

ENV PATH /home/miniconda3/bin:$PATH

 

# change mirror

RUN mkdir ~/.pip && cd ~/.pip     

RUN echo -e "[global]\nindex-url = https://pypi.mirrors.ustc.edu.cn/simple/" >> ~/pip.conf

 

RUN /home/miniconda3/bin/pip install --upgrade pip

RUN /home/miniconda3/bin/pip install numpy==1.16.0

RUN /home/miniconda3/bin/pip install matplotlib

RUN /home/miniconda3/bin/pip install scipy

RUN /home/miniconda3/bin/pip install sklearn

RUN /home/miniconda3/bin/pip install echarts

RUN /home/miniconda3/bin/pip install tensorflow-gpu==1.9.0

RUN /home/miniconda3/bin/pip install torch===1.2.0 torchvision===0.4.0

                                    -f https://download.pytorch.org/whl/torch_stable.html

参考:

© THE END

转载请联系本网站获得授权

投稿或版权问题请加微信:skillupvip