docker 学习笔记

一 docker 是什么?

    Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
    docker容器其实就是拉取相应的镜像并启动它,可以理解成以前用过的虚拟机,但与虚拟机相比优势更大,那么这个容器便是一个基于Linux的独立的"操作系统"了。
    容器技术使用宿主操作系统的底层内核,比如Ubuntu的镜像文件仅包含必要的依赖,整体大小非常小。相对于完整的Ubuntu系统镜像的2GB+的大小,Ubuntu容器的镜像文件仅74MB。
    总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

二、ubuntu 安装docker

先决条件
    操作系统要求
    要安装 Docker Engine,您需要以下 Ubuntu 版本之一的 64 位版本:
    Ubuntu Hirsute 21.04
    Ubuntu Groovy 20.10
    Ubuntu 焦点 20.04 (LTS)
    Ubuntu 仿生 18.04 (LTS)
    Docker Engine 在x86_64(或amd64)armhf、 和arm64架构上受支持。

1、卸载旧版本

旧版本被称为docker,docker.io或docker-engine。如果安装了这些,请卸载它们:
     sudo apt-get remove docker docker-engine docker.io containerd runc
卸载新版本的方法:新版本的名字叫:docker-ce
    sudo apt-get --purge remove docker-ce
在/var/lib/docker/下,包括图像、容器、卷和网络,将被保留,如果想删除:
    sudo rm -rf /var/lib/docker

2、安装方法

您可以根据需要以不同方式安装 Docker Engine:
    1、大多数用户 设置 Docker 的存储库并从中安装,以便于安装和升级任务。这是推荐的方法。
    2、一些用户下载 DEB 包并 手动安装并完全手动管理升级。这在诸如在无法访问互联网的气隙系统上安装 Docker 等情况下非常有用。
    3、在测试和开发环境中,一些用户选择使用自动化的 便捷脚本来安装 Docker。

2.1、 使用存储库安装

在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新     Docker。
2.1.1 、设置存储库
1、更新apt包索引并安装包以允许apt通过 HTTPS 使用存储库:
    sudo apt-get update
    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
2、添加Docker官方的GPG密钥:
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
3、使用以下命令设置稳定存储库。
    echo \
      "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
2.1.2 、安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
2.1.3 、要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装一种:
列出您的存储库中可用的版本:
apt-cache madison docker-ce
使用版本字符串安装特定版本,例如5:18.09.1~3-0~ubuntu-xenial
sudo apt-get install docker-ce= docker-ce-cli= containerd.io
2.1.4、 通过运行hello-world 映像验证 Docker Engine 是否已正确安装
sudo docker run hello-world

此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条信息性消息并退出

3、升级 Docker 引擎

要升级 Docker Engine,首先运行sudo apt-get update,然后按照 安装说明,选择要安装的新版本。

4、docker 支持gpu

为了在docker中支持GPU,需要安装NVIDIA Container Toolkit

4.1、 配置nvidia-docker源

 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

4.2、 安装nvidia-container-toolkit并重启docker

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

4.3、使用最新的CUDA官方图测试nvidia-smi

sudo docker run --gpus all nvidia/cuda:10.0-base nvidia-smi

三、一些基本命令

1、显示docker版本信息

命令:docker version

2、 镜像

1、查看本机中所有的docker镜像

命令:docker images
REPOSITY代表所在仓库,TAG表示该镜像标签(版本)

2、docker 拉取镜像

docker image pull 镜像名(python:3.8.3)

3、docker 删除镜像

docker rmi [image]  或者:docker image rm [image]
支持的子命令如下:
-f, -force: 强制删除镜像,即便有容器引用该镜像;
-no-prune: 不要删除未带标签的父镜像;

4、docker 构建镜像

在Dockerfile同级目录下执行:sudo docker build -t 镜像名称 .

默认使用缓存,可以通过传递--no-cache=True给docker build关闭缓存。

如果你要对指令进行更改,那么接下来的每一层都将频繁地重新构建。要利用缓存,请在 Dockerfile 中尽可能低地放置可能更改的指令。

5、docker 给镜像重命名

docker tag 镜像ID 镜像名称:镜像版本

6、docker 运行镜像,生成容器,并将容器目录挂载到本地目录

sudo docker run -it --name 容器名称 -v 本地目录:/容器目录 -p 5009:5000 镜像名称:版本 [命令][/bin/bash]

运行需要使用gpu的镜像
docker run -it --name 容器名称 -v 本地目录:/容器目录 --gpus all -p 5009:5000 镜像名称:版本
注:
    -p 端口映射,可以使用多个-p来映射多个端口,例如:-p 5000:5000 -p 10001:10001
    -v 目录映射,可以使用多个-v来映射多个目录。

7、docker 本地镜像的导出、导入

导出镜像
1、使用 docker export 命令根据容器 ID 将镜像导出成一个文件,对应 docker import。 
    docker export f299f501774c > contain.tar
2、使用 docker save 命令根据 镜像ID 将镜像保存成一个文件,对应 docker load。 
    docker save 0fdf2b4c26d3 > hangge_server.tar
导入镜像
1、使用 docker import 命令导入镜像文件。
    docker import - newImage < contain.tar
2、使用 docker load 命令载入镜像文件。
    docker load < contain.tar

3、 容器

1、查看所有docker容器

命令:docker ps -a
CONTAINER ID表示该容器在Docker中的唯一ID,稍后的相关操作可以使用该ID进行,
IMAGES表示该容器使用的镜像,NAMES表示我们给当前镜像起的花名,与ID一样是唯一的。

2、进入容器

前提是容器已经运行起来了。
命令:docker exec -it 【CONTAINER ID】 /bin/bash

3、退出容器

exit
或者
Ctrl+P+Q

4、docker 删除容器

docker rm 容器id

5、docker容器开机自动启动(在宿主机重启后或者Docker服务重启后)

在Docker run的时候使用--restart参数来设置。

no - container:不重启
on-failure - container:退出状态非0时重启
always:始终重启

docker run -it --name 容器名称 --gpus all -p 5009:5000 --restart=always 镜像名称:版本

6、 设置Docker容器日志文件大小限制

1.新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,样例如下:
    # vim /etc/docker/daemon.json

    {
      "log-driver":"json-file",
      "log-opts": {"max-size":"500m", "max-file":"3"}
    }

    max-size=500m,意味着一个容器日志大小上限是500M, 
    max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

2.然后重启docker的守护线程
    命令如下:
    systemctl daemon-reload
    systemctl restart docker
    
注意:设置的日志大小规则,只对新建的容器有效!!!

四、 制作镜像

1、编写Dockerfile

常用命令:
FROM 基础镜像名称 (指定基础镜像,必须为第一个命令,只能有一个基础镜像)
MAINTAINER: 维护者信息
RUN:构建镜像时执行的命令
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
WORKDIR:工作目录,类似于cd命令
CMD:构建容器后调用,也就是在容器启动时才进行调用。
...
详见:https://www.cnblogs.com/panwenbin-logs/p/8007348.html

例子:
FROM cudapythonimage
ADD ./foodparser_paddle /home/foodparser
WORKDIR /home/foodparser/IvaFoodParserService
RUN pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
RUN apt update
RUN echo y | apt install libgl1-mesa-glx 
CMD ["python", "/home/foodparser/IvaFoodParserService/server.py"]

经验:
当python项目中用到opencv时,出现opencv库错误时,可用:
RUN apt update
RUN echo y | apt install libgl1-mesa-glx 

2、制作CUDA+Python基础镜像

1、由于项目要使用GPU,所以需要docker支持GPU,详见二-4。
2、接着需要安装nvidia驱动,这需要根据自己显卡安装相应的驱动,网上有很多类似教程,此处不再介绍,推荐一个链接https://blog.csdn.net/wf19930209/article/details/81877822-t
3、不要以为这样就可以安心的使用gpu了,你的镜像还必须要有cuda才行,这也很简单,去dockerhub上找到和自己tensorflow相对应的cuda版本的镜像,再基于该镜像生成自己的镜像就可以轻松使用gpu了。这里需要额外多说一句,如果你的docker 本身就基于了某个镜像(例如基于本公司仓库的镜像),docker是不允许from两个镜像的,那么就得自己制作基础镜像啦。

2.1、拉取cuda镜像

# 查看Linux系统版本
    lsb_release -a
# 查看Linux内核版本
    cat /proc/version
# 查看gcc 版本
    gcc -v
# 查看 显卡型号
    lspci | grep -i nvidia
# 查看显卡驱动
    nvidia-smi
# 查看cuda 版本
    nvcc -V
# 查看cudnn 的版本
    cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2  
# 查看 nvidia-container-toolkit 版本
    dpkg -l | grep nvidia-container-toolkit
    
dockerhub 上搜索cuda 镜像根据自己的cuda 版本,cudnn 版本,操作系统环境 选择 镜像 ,并pull到本地

docker pull nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04

2.2、运行cuda镜像

docker run -it --name cudapython --gpus all nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04

2.3、更改安装源为国内源

在linux主机的工作目录编写 sources.list:vim sources.list
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

docker cp sources.list cudapython:/etc/apt/sources.list    # (主机中执行)
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 # (容器中执行)
apt-get update                                          # (容器中执行)
apt-get upgrade


备用源:https://pypi.tuna.tsinghua.edu.cn/simple
scipy==1.7.1
另一种方法:
    一键更改:
        wget -O /etc/apt/sources.list     http://mirrors.cloud.tencent.com/repo/ubuntu18_sources.list
    更新缓存:
        apt-get clean all
        apt-get update

2.4、安装Python(容器中执行)

# 安装相关软件
apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev  libsqlite3-dev wget

apt-get -y install vim  gcc make automake libtool zlibc aptitude

apt-get -y install libglib2.0-dev libsm6 libxrender1  

aptitude install libxext-dev  tk-dev

echo y | apt install libgl1-mesa-glx

# 下载并解压 Python 源码(Gzipped source tarball)
cd /root && wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar -xf Python-3.8.3.tgz

# 安装 Python
cd Python-3.8.3
./configure  --prefix=/usr/local --with-ssl    # 生成 Makefile
make && make install                           # 编译并安装python

升级pip到指定版本:
python -m pip install --upgrade pip==21.0.1

建立软连接
ln -s /usr/local/bin/python3.8 /usr/bin/python3
ln -s /usr/local/bin/pip3.8 /usr/bin/pip3

2.5 安装项目所需的python库

1、将项目所需的库打包到requirements.txt中
2、docker cp requirements.txt cudapython:/home/requirements.txt    # (主机中执行)
3、pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple #(容器中执行)
说明:如果将来更新程序,需要新的库文件,可以在Dockerfile中用pip 安装。
至此,基础容器已经做好啦

2.6 将cudapython基础容器打包成镜像

1、将容器打包:docker export 容器Id > cudapythondevel.tar
2、导入镜像:docker import - cudapythondevelimage < cudapythondevel.tar

2.7基于cudapythondevel基础镜像制作项目镜像

1、编写Dockerfile
    FROM cudapythondevelimage
    ADD ./foodparser_paddle /home/foodpaddle
    WORKDIR /home/foodpaddle/IvaFoodParserService
    CMD ["python3", "/home/foodpaddle/IvaFoodParserService/server.py"]
2、将Dockerfile 和foodparser_paddle 放在同级目录下
3、 构建镜像: docker build -t 镜像名称 .

2.8 运行镜像生成容器

docker run -it --name 容器名称 -v 本地目录:/容器目录 --gpus all -p 5009:5000 镜像名称:版本


docker run -it --name foodpaddlecontain -v /home/xzx/foodparser_paddle:/home/foodpaddle --gpus all --restart=always --env HOST_MAC=$(ip link show eno1 | awk '/ether/ {print $2}')  -p 5000:5000 --log-opt max-size=10m --log-opt max-file=1 foodpaddle:v1.0.0


docker run -it --name foodpaddlecontain5002 -v /home/xzx/foodparser_paddle5002:/home/foodpaddle --gpus all --restart=always --env HOST_MAC=$(ip link show enp0s31f6 | awk '/ether/ {print $2}')  -p 5002:5000 foodpaddle:v1.0.0


docker run -it --name foodpaddlecontain5002 -v /home/xzx/foodparser_paddle5002:/home/foodpaddle --gpus all --restart=always --env HOST_MAC=$(ip link show enp0s31f6 | awk '/ether/ {print $2}')  -p 5002:5000 --log-opt max-size=10m --log-opt max-file=1 foodpaddle:v1.0.0

你可能感兴趣的:(docker容器前端)