1. Docker安装
2. Docker简介
趁着等待安装成功的时间,我们了解一下Docker的三个基本的概念:
- Image(镜像) :镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角。
- Container(容器) :容器 (container) 的定义和镜像 (image) 几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。
- Repository(仓库):Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry (仓库注册服务器)就是这样的服务。一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。
Docker架构
Docker 使用的是 C/S 结构,即客户端/服务器体系结构。Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像。 也知道了Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。
Docker 的核心组件包括:
- Docker Client : Docker 客户端。它其实就是 Docker 提供命令行界面 (CLI) 工具,是许多 Docker 用户与 Docker 进行交互的主要方式。最常用的 Docker 客户端就是 docker 命令,我们可以通过 docker 命令很方便地在 host 上构建和运行 docker 容器。
- Docker daemon :Docker daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。它负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。
Docker Daemon 可以认为是通过 Docker Server 模块接受 Docker Client 的请求,并在 Engine 中处理请求,然后根据请求类型,创建出指定的 Job 并运行。 - Docker Image
- Docker Registry
- Docker Container
3. Docker创建镜像
首先,编写一个Dockerfile文件。
FROM python:3.8-slim-buster
MAINTAINER haozheng <hhz21@mails.tsinghua.edu.cn>
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
RUN apt-get update
RUN apt-get install ffmpeg libsm6 libxext6 -y
CMD [ "python", "main.py" ]
语法说明:
- FROM是用于指定基础的 images ,一般格式为 FROM <image> or FORM <image>:<tag> ,所有的
Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM
以后的所有指令都会在 FROM 的基础上进行创建镜像。这里,从 Docker Hub 上 pull 下python 3.8-slim-buster,指定为基础镜像 - MAINTAINER
- WORKDIR指定docker服务器上的工作路径为
/app
- COPY当前目录到容器中的 /app 目录下 复制本地主机的 ( Dockerfile 所在目录的相对路径)到容器里
- RUN 运行环境安装指令
- CMD 在命令行运行main.py文件
使用下列指令创建一个命为my-cvxtest的镜像:
docker build -t my-cvxtest:v1 .
我们解释一下, -t
是为新镜像设置仓库和名称,即my-cvxtest,v1表示标签。若不设置标签,默认为latest。.
表示本地主机Dockerfile的位置,因此不能省略。
4. Docker容器的启动和使用
创建镜像后,我们使用如下命令启动容器。
docker run -v /src:/app -dit --name cvx my-cvxtest /bin/bash
-v
表示目录挂载,将本地主机目录/src挂载到docker服务器/app,这样在主机或docker容器中修改文件时就可以同步到另一端
-dit
表示挂载程序,不中断。
--name cvx
表示容器名为cvx
/bin/bash
表示执行docker默认bash程序创建容器
然后,我们可以使用exec
命令,执行(进入)容器环境。
docker exec -it cvx /bin/bash
-it
表示交互式启动docker容器,本地主机可以直接读写容器中的文件。
进入容器后,我们就可以按照linux终端的操作方式来运行和调试程序了。
P.S.在docker容器中使用cv2会遇到报错:
Traceback (most recent call last):
File "main.py", line 5, in <module>
import cv2
File "/usr/local/lib/python3.8/site-packages/cv2/__init__.py", line 181, in <module>
bootstrap()
File "/usr/local/lib/python3.8/site-packages/cv2/__init__.py", line 153, in bootstrap
native_module = importlib.import_module("cv2")
File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
这个问题的解决方法可以参考这篇文章docker中cv2报错解决办法
4. Docker镜像打包和删除
为了方便复用环境,我们可以将生成的docker镜像打一个tar包。
docker save -o mycvx.tar my-cvxtest:v1
save
是镜像保存指令
-o XXX.tar
表示的生成的tar包名称
my-cvxtest:v1
cvx-test表示镜像名,v1表示tag
复用同一个镜像时,我们只需要运用如下命令构建新容器。
docker load -i mycvx.tar ---- 从 tar 包导入镜像
导入镜像后,通过 docker images 便可看到导入的镜像。
docker run -itd -p <本地端口>:<容器端口> <镜像名>:<tag> ---- 通过镜像起容器
使用以后,我们要及时清理不需要的镜像和容器。
docker stop cvx ----停止运行中的容器
docker rm cvx ----删除容器