趁着等待安装成功的时间,我们了解一下Docker的三个基本的概念:
Docker架构
Docker 使用的是 C/S 结构,即客户端/服务器体系结构。Docker 客户端与 Docker 服务器进行交互时, Docker 服务端负责构建、运行和分发 Docker 镜像。 也知道了Docker 客户端和服务端可以运行在一台机器上,可以通过 RESTful 、 stock 或网络接口与远程 Docker 服务端进行通信。
Docker 的核心组件包括:
首先,编写一个Dockerfile文件。
FROM python:3.8-slim-buster
MAINTAINER haozheng <[email protected]>
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" ]
语法说明:
/app
使用下列指令创建一个命为my-cvxtest的镜像:
docker build -t my-cvxtest:v1 .
我们解释一下, -t
是为新镜像设置仓库和名称,即my-cvxtest,v1表示标签。若不设置标签,默认为latest。.
表示本地主机Dockerfile的位置,因此不能省略。
创建镜像后,我们使用如下命令启动容器。
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报错解决办法
为了方便复用环境,我们可以将生成的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 ----删除容器