第一步:保证自己的py脚本在本地可以运行起来服务。

比如这次我想 把 方案一_输煤栈桥异物检测_正式版 的 本地 按运行可以 run的一个foreign_OD_service1_trail.py ,如下:


python脚本导出网络设备配置 将python脚本放到服务器_ubuntu


第二步:加载镜像,和创建容器


python脚本导出网络设备配置 将python脚本放到服务器_ubuntu_02


第二步:创建算法镜像

把算法工程拷贝到/data目录

我这边是 虚拟机,我先把 脚本 拷贝 到 VMware的共享文件夹 D:\VMSharedFolders,然后进

虚拟机 Ubuntu 把 文件拷贝到

记得要创建新的算法镜像,需要修改三个文件,分别依次是 :

Dockerfile , start.sh , run_server.sh

第一个:Dockerfile

FROM 5121a6577a7f
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh
WORKDIR /root
ENTRYPOINT /root/start.sh && tail -f /dev/null

FROM 5121a6577a7f,表示我的基础镜像,这里我选用最开始上传的那个基础镜像,也就是 15 months ago的,而不是 12天前的,因为那些是 我 生成的服务的镜像。


python脚本导出网络设备配置 将python脚本放到服务器_微服务_03


内容修改如下,并剪切到 /data/xxx/,这里为/data/foreign_OD

FROM 5121a6577a7f
COPY start1.sh /root/ start1.sh
RUN chmod +x /root/ start1.sh
WORKDIR /root
ENTRYPOINT /root/start1.sh && tail -f /dev/null

第二个:start.sh

#!/bin/bash
sleep 3
cd /data/fire_yolo && sh run_server.sh

第一次生成的start.sh在 /data/docker_auto_start/。

名字改成 start1.sh,内容修改如下,并剪切到 /data/xxx/,这里为/data/foreign_OD

#!/bin/bash
sleep 3
cd /data/ foreign_OD

第三个:run_server.sh

#!/bin/bash
nohup python3 run_fire_detect.py >>./run_server.log 2>&1

内容修改如下,并剪切到 /data/foreign_OD/

#!/bin/bash
nohup python3 foreign_OD_service1_docker.py >>./run_server.log 2>&1

cd 到 /data/foreign_OD/ 、在目录下执行

sudo docker build -t foreign_OD_service1_testv0:1 .

这里注意一下,就是 Dockerfile 的名字 不能 为 Dockerfile2 什么的,不然提示找不到文件,是Dockerfile2 的 要改回来。命令:

cp Dockerfile2 ./Dockerfile

G、执行sudo docker images并记录下添加了自启动脚本的新镜像的IMAGE ID

创建docker容器

最后通过 可以启动起来 服务。

sudo docker run -itd --name foreign_od_service1_testV --network host -v /data:/data -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 -e PYTHONIOENCODING=utf-8 --restart=no ba53d98a9ac3

或者

sudo docker run -itd --name yuto_algorithm --network host -v /data:/data -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 -e PYTHONIOENCODING=utf-8 --restart=always cbc8879a04a0

关于docker容器里时间和宿主机不一致的问题:

您可以在启动容器时,使用参数"-v /etc/localtime:/etc/localtime:ro"来将宿主机的时间同步到容器内部。具体操作可以参考以下命令:

docker run -v /etc/localtime:/etc/localtime:ro <image_name> <command>

其中,<image_name>是您要启动的镜像名称,<command>是您要在容器内部执行的命令。

sudo docker run -itd --name yuto_algorithmV4 --network host -v /data:/data -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=:0 -e PYTHONIOENCODING=utf-8 --restart=no 91c25b480615

注:这个命令中的 /data:/data 表示将本地的 /data 目录挂载到 Docker 容器中的 /data 目录,前面的 /data 是本地路径,后面的 /data 是 Docker 容器中的路径。

最开始的我的Ubuntu下的路径是:

打包 Dockerfile start.sh 两个文件的路径在:

/data/docker_auto_start

代码路径在:

/data/fire_yolo_n

疑虑点二:

我在 Dockerfile 里用 下面这句失败了,

# 将本地文件夹拷贝到 Docker 镜像中

COPY /home/lenovo/managerAPI/foreignODdjango /root/

,而观察到 yuto 起docker服务的方式是这样子的,

step1: 先把 docker 里 /data 和 本地的 /data 关联起来。

step2: 在 start.sh 里,用 cd /data/fire_yolo && sh run_server.sh 运行 保存在本地python脚本,所以根本不需要再拷贝 foreignODdjango 文件夹至 docker内。

至于怀疑这样起的服务 是否 是不是 docker 里的进程,用下面方式,我已经验证确实是属于 docker里的进程。

怎么确定,用起的服务是位于 docker 里的进程。

您可以使用以下命令来查看 Docker 容器中运行的进程:

docker top <container_id>

同时进入 docker 里,使用以下命令来查看运行的进程详细信息:

ps aux

Django的服务一直起不来,后来进 docker服务后发现,是

bash run_server.sh 报错,改成下面这句是可以 work的,记录一下。

nohup python3 manage.py runserver 8085 >./run_server23.log 2>&1 &

这次备注:

用 0.0.0.0:8050 启动一个 Django服务,则本地任意IP + 该端口(8050)可以访问该服务。

或者局域网内其他主机 通过 宿主机的 IP + 该端口(8050) 可以访问该服务。

nohup python3 manage.py runserver 0.0.0.0:8050 >./run_server8050.log 2>&1 &