docker的知识

docker的理解

  • Linux是类似轻量虚拟机的东西,但它是进程级别的,不像虚拟机一样是系统级别的
  • docker将应用程序和该程序的依赖,打包在一个文件里,运行该文件,就生成一个容器,应用程序就在该容器里运行,就像在真实的物理机上运行一样
  • 镜像可以认为是源代码,容器可以认为是操作系统,根据镜像的源代码创建了一个容器操作系统
  • 一个liuyancheng做的实例可以参考 百度网盘->工作->c++_project->dockerLearning.tar.gz,自己做的一个例子  百度网盘->工作->python_project->dockerLearning,自己做的这个例子可以当作虚拟机使用,可以看下面的“docker的重现,迁移”
  • 如何使用docker,建议直接在dockerLearning.tar.gz上制作自己的镜像,不要从头开始写
  • 如果只要anaconda就能完成独立的环境,不建议使用docker,直接使用anaconda打包,然后还原环境就可以,毕竟docker感觉还是相对于anaconda,要麻烦的多

安装docker

  • 方法1.按照官网的方法安装,有三种方法,建议通过仓库安装(Install using the repository)
  • 方法2.官网的中文翻译
  • 以非root用户使用docker,无sudo权限使用docker

修改docker国内源

  • 方法1修改国内源
  • 有时候即使修改了国内源,依然很慢,可以多试几个,找个快的,自己尝试的https://hub-mirror.c.163.com/
    是比较快的
  • 方法2修改国内源(清华源官网的方法但自己测试失败)
  • docker进入容器后就像一个操作系统了,这时候也需要替换源,否则apt-get update等这样的命令是无法使用的或者提示无法访问(eg: Err:1 http://archive.ubuntu.com/ubuntu focal InRelease Connection failed),替换的方法为进入容器后,
    echo "deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse" >> /etc/apt/sources.list

    这样就可以替换为国内的阿里源,当然也可以替换为其他的源。这里有个问题就是源和镜像对应版本的问题,xenial对应16.04(LTS),Ubuntu Bionic 18.04 (LTS),Ubuntu Focal 20.04 (LTS),Ubuntu Groovy 20.10,最好这样,是否不对应也可以并没有尝试过。

  • 也可以在Dockerfile文件中加入替换sources.list的命令来实现源的替换

    ADD sources.list /etc/apt/sources.list

    sources.list填写国内的源,例如阿里源

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse

启动docker的一些命令实例

sudo docker run -it --name shuailing --ipc=host --gpus all -v /mnt:/mnt hub.phigent.io/dlp/pytorch/pytorch:1.11.0-cuda11.3-cudnn8-devel-mmflow-v2-cuda bash

sudo docker run -it -v /mnt:/mnt -v $your_path/:/home/docker hub.phigent.io/ti/edgeai-tidl-tools-08_04_00_06.x86:v1.5

sudo docker run -it --user `id -u $USER`:`id -g $USER` --ipc=host --gpus all -v /mnt:/mnt -v $PWD:$PWD -w $PWD hub.phigent.io/dlp/pytorch/pytorch:1.11.0-cuda11.3-cudnn8-devel-mmflow-v3-mmseg-cmake bash

docker run -it -v /home/cheng.huang/gitPro/:/home/docker -v /mnt/:/mnt hub.phigent.io/avp/cuda11.3.1-trt8.0.3.4-ros2-desktop-ubuntu20.04:v2.0

docker常用的命令

docker ps #列出正在运行的容器
docker ps -a #列出所有的容器,运行和非运行的
docker rm -f ID #删除容器
sudo docker stop #停止容器
sudo docker attach 容器ID/容器名 #进入正在运行中的容器
exit #退出容器,或者ctrl+D,启动容器docker start 容器ID/容器名
docker start 容器ID/容器名 #启动容器
docker #查看所有的docker命令
docker CMD --help #查看命令CMD的具体用法
docker rm -f ID #删除容器
docker attach ID #进入后台运行的容器,exit推出容器终端后,容器即停止,如果重启容器时没有进入到交互式shell,可以试试这个命令
docker exec ID #类似docker attach ID, exit推出容器终端后,容器不停止
docker exec -it containerID /bin/bash
sudo docker start containerName #重启已经停止的容器
docker top containerName #查看容器内的所有进程

RUN, CMD, ENTRYPOINT区别

RUN: docker build时运行

CMD:docker run时默认运行的应用程序(只能一个,若多个只最后一个有效,故若docker run有参数,则CMD被覆盖)

ENTRYPOINT:与CMD的区别时不会被docker run的参数覆盖(且docker run的参数会传到ENTRYPOINT中,同样只最后一个生效)

docker的第一个例子

  1. Dockerfile的内容
    #FROM nvidia/cuda:8.0-cudnn6-devel-ubuntu16.04
    FROM hackeryx/ubuntu:16.04
    
    MAINTAINER zhaoshuailing  
    
    # environment variables
    ARG DEBIAN_FRONTEND=noninteractive
    
    # 替换源
    #COPY sources.list /etc/apt/sources.list
    
    RUN mkdir /work && mkdir /software/
    
    COPY testDocker.py /work
    
    WORKDIR /work/ #work后的‘/’必须有,否则找不到应用程序。该命令使得容器运行时,直接到/work/目录下,所以有该命令,后面执行时应用时就变成了python testDocker.py,没有该命令执行应用时就变成了python /work/testDocker.py 否则找不到testDocker.py
    #ENTRYPOINT python testDocker.py

  2. build生成镜像
    docker build -t helloworld:v1 ./
    docker images

安装nvidia-docker

  1. 检查docker能支持的安装平台(eg:ubuntu16.04等)
  2. 安装nvidia的驱动
  3. 检查安装nvidia-docker的先决条件
  4. 安装docker(如果已经安装请跳过这个步骤)
  5. 卸载nvidia-docker1.0(如果没有安装过,请跳过该步骤)
  6. 设置Repository(Setup the stable repository and the GPG key)
    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

  7. 安装nvidia-docker2.0(Install the nvidia-docker2 package (and dependencies) after updating the package listing)
    sudo apt-get update
    sudo apt-get install -y nvidia-docker2

  8. 重启docker守护进程(Restart the Docker daemon to complete the installation after setting the default runtime)
    sudo systemctl restart docker

  9. 测试nvidia-docker2.0
    sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

如果成功会显示显卡信息

一些参考资料

安装nvidia-docker2.0的详细步骤(推荐)

中文博客参考

已经弃用的官网文档

Docker的一些参考资料

Docker(三):Dockerfile 命令详解 - 纯洁的微笑 - 博客园

在 /etc/apt/sources.list:52 和 /etc/apt/sources.list.d/docker.list:1 中被配置了多次

打开/etc/apt/sources.list,把相应的行注释掉就可以了,因为这两个地方指定了同一个源,所以重复了

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:

将用户改成非root用户操作,按照官网步骤就可以,如果还是出错,就reboot机器

查看docker服务活docker守护进程是否启动:

systemctl status docker

若未启动,则启动docker服务:

sudo systemctl start docker

docker中安装vim

The following packages have unmet dependencies: vim : Depends: libpython3.5 ,依赖什么就装什么,一直安装下去,虽然麻烦但可以解决问题

docker常用命令

sudo docker start containerName #重启已经停止的容器
sudo docker attach containerName #如果重启容器时没有进入到交互式shell,可以试试这个命令

docker上传, docker push

制作镜像时需要指定自己的账户docker hub,这里必须是自己的账户zhaosl为前缀,否则上传不成功

sudo docker build -t="zhaosl/static_web:v05" .

登录自己的账户,必须登录,因为登录成功后会在本机生成一个密码文件/home/zhaosl/.docker/config.json.,push的时候会使用到,不登录push会出错

sudo docker login

查看生成的images

docker images

上传镜像

sudo docker push zhaosl/static_web:v05

删除镜像

sudo docker rmi zhaosl/static_web:v03

如果报错类似什么容器在使用镜像,无法删除Error response from daemon: conflict: unable to remove repository reference "jamtur01/static_web:v03" (must force) - container 3de555f7b1fb is using its referenced image 880678979b3d,那么就需要把使用该镜像的所有容器删除后再删除该镜像,根据提示的容器id,3de555f7b1fb,进行删除

sudo docker rm 3de555f7b1fb

然后重新删除镜像,途中可以使用docker ps -a和docker images查看所有的容器和镜像,以及是否删除成功

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

可能是docker服务没有起来,所以需要重启docker服务sudo systemctl start docker

docker镜像中安装anaconda

使用Docker搭建Anaconda Python3.6的练习环境_SnailTyan的博客-CSDN博客,这其中可能需要修改的地方为文章中是网址下载安装的,a.我们可以下载 Anaconda3-5.0.1-Linux-x86_64.sh下载后add(拷贝)到docker上下文中安装,b.它指定的安装目录/opt/conda,我们可以默认目录即/root/Anaconda3

docker的重现,迁移

首先编写完整的dockerfile文件,里面安装完成自己需要的环境和工具,然后编译生成镜像,打包,拷贝到需要运行的服务器上,解压并加载镜像,运行该docker容器,这样这个容器就是一个类似虚拟机一样的东西了,完全隔离的环境供自己使用,最后在客户端ssh向连接服务器一样连接该容器就可以了完整的dockerfile文件的内容在 百度网盘->工作->python_project->dockerLearning->Dockerfile,操作步骤的命令如下

sudo docker build -t="zhaosl/pytorch1.5:latest" .# 生成镜像
sudo docker save zhaosl/pytorch1.5:latest | gzip > zhaosl_pytorch1.5.tar.gz #打包镜像
scp zhaosl_pytorch1.5.tar.gz [email protected]:/home/zhaosl/python_project #拷贝到服务器上
gunzip -c zhaosl_pytorch1.5.tar.gz | sudo docker load #解压并加载镜像
sudo docker run --ipc=host  -p 49154:22 -it zhaosl/pytorch1.5:latest #在服务器上运行容器
ssh -X [email protected] -p 49154 #在客户端上连接

解释1,解释2 

docker视频教程

Docker 命令大全 - Docker 教程 - 菜鸟学堂-脚本之家

你可能感兴趣的:(笔记,docker,ubuntu,linux)