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-toolkitdockerhub 上搜索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 multiversedocker 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.listhttp://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-devlibsqlite3-dev wgetapt-get -y install vimgcc make automake libtool zlibc aptitudeapt-get -y install libglib2.0-dev libsm6 libxrender1aptitude install libxext-devtk-devecho 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.0docker 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.0docker 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

    推荐阅读