一 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