吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2277|回复: 24
收起左侧

[Python 原创] Python项目打包成docker容器【docker build构建docker镜像】

  [复制链接]
DYDX 发表于 2023-11-22 15:09
本帖最后由 DYDX 于 2023-11-22 15:14 编辑

重点摘要

将本地Python项目打包构建docker镜像,并在docker中运行【流程1-8】
Docker Compose (Docker编配)
附录: 其他常用docker命令

1. 首先, 完成本地Python的开发、测试;

2. 将项目依赖库(即本地python环境)进行导出, 使用如下命令:

>> pip freeze > requirements.txt

执行完成后会生成一个叫requirements的TXT文件

2.1 ==requirements.txt==文件也可以根据项目需要手动编写,格式如下:

aiohttp==3.8.1
click==8.0.3
dnspython==2.2.0
elasticsearch==7.13.3
Flask==2.0.2
numpy==1.19.2
pandas==1.0.4
pip==21.3.1
py-eureka-client==0.10.2
wheel
yarl==1.6.3

3. 在宿主机上, 新建文件夹, 以es-python文件夹为例, 放入如下内容:

        es-python  (作为Python项目根目录)
        |- modules (modules文件夹: 其中的内容是Python项目子目录文件)
        |- run.py  (Python项目的执行入口)
        |- requirements.txt  (步骤2生成的项目依赖列表)
        |- Dockerfile.txt  (步骤4即将编写的文件)

4. 编写Dockerfile, 创建一个文件叫Dockerfile, 内容如下:

在es-python文件夹下,新建一个Dockerfile文件:

>> touch Dockerfile

编写==Dockerfile==内容:

    # Dockerfile 指令
    # 基于 基础镜像
    FROM python:3.6.10

    # 定义 元数据
    LABEL maintainer="HashSWAP" version="1.0"

    # 将构建环境下的文件OR目录, 复制到镜像中的/code目录下, 
    ADD . /code

    # 设置/切换 当前工作目录 为 /code
    WORKDIR /code

    # 根据需要, 定义 环境变量
    ENV IP 192.168.70.58
    ENV REFRESHED_AT 2022-07-20

    # 指定 一个OR多个 卷, 挂载到镜像 (配合后续docker cp使用)
    VOLUME ["/opt/project", "/data"]

    # 安装python环境支持(针对python项目)
    RUN pip install -r requirements.txt

    # 暴露出外界访问容器的端口
    EXPOSE 5033

    # 假设run.py是项目启动入口, 
    # ENTRYPOINT 和 CMD 指令均可用于指定容器启动时要运行的命令, 
    # 区别在于 CMD 命令可以被 docker run命令覆盖
    ENTRYPOINT ["python", "run.py"]
    CMD ["python", "run.py"]

5. 假设宿主机上已经装好docker, 此时切换到es-python路径下

>> cd /usr/hashswap/es-python

6. 执行==docker build==命令, 根据dockerfile构建出一个对应的镜像(注意, docker build命令最后有一个 ==.== )

>> docker build -t es-python-image .
OR 
>> docker build -t="es-python-image:v2022.07.21" .

出现下图所示, 则构建镜像成功
构建镜像成功.png

注:若多次构建可以使用 --no-cache 命令,忽略之前构建过程的缓存

>> docker build --no-cache -t es-python-image .

7. 上述步骤完成之后, 使用docker images命令,可列出之前生成的镜像 es-python-image

>> docker images

镜像list.png

8、根据镜像,创建、命名容器, 并执行

>> docker run --name es-python-app_0 -it es-python-image:v2022.07.20 python run.py
OR 
>> docker run --name es-python-app_1 -p 5034:5033 -it es-python-image:v2022.07.20 python run.py

==注意==: 5033端口应该是容器内项目暴漏出来的端口, 例如"SERVICE_PORT": 5033;
5034端口不应该跟宿主机上其他端口冲突。

至此,项目以docker容器格式运行了...

9、==Docker Compose (Docker编配)==

docker run如果需要的参数过多,则可以编写==docker-compose.yml==,然后使用docker-compose up命令来启动容器;
也可以==同时启动多个容器==;

9.1  在es-python文件夹下, 创建docker-compose.yml文件

>> touch docker-compose.yml

9.2  根据需要, 编写docker-compose.yml内容(仅以一个容器为例)

${**} 内容根据实际需要编写

es_python_app:
container_name: es_python_app
image: XXXXX/es_python_iamge
restart: always
environment: 
- ES_IP=${ES_IP}
- ES_PORT=${ES_HTTP_PORT}
- EUREKA_SERVER=${EUREKA}
- EUREKA_APP_NAME=es_python_app
- EUREKA_INSTANCE_HOST=${IP}
- EUREKA_INSTANCE_IP=${IP}
- EUREKA_INSTANCE_PORT=${ES_PORT}
- SERVICE_PORT=${ES_PORT}
ports:
- ${ES_PORT}:${ES_PORT}
volumes:
- ./es_python:/es_python
command: python run.py --instance_host=${USE_APP_HOST} --instance_port=${USE_APP_PORT} --eureka_server=${EUREKA}

9.3  进入docker-compose.yml所在文件路径, 运行>> docker-compose up 命令, 即可启动这些容器

# 以后台守护进程的模式, 启动DockerCompose
>> docker-compose up -d
>> docker-compose --file $DEPLOY_PATH/lib/docker-compose.yml up -d

附录: 其他常用docker命令

docker run 的其他参数:

    -d                          将容器放到后台运行
    -it                         交互式运行
    --name es-python-con01      命名 
    -p 8081:80                  将容器的80端口绑定到本地宿主机的8081端口上
    -p 80                       将容器的80端口绑定到本地宿主机的随机端口上
    -e "WEB_PORT=8090"          传递环境变量
    --restart=always            自动重启容器
    -v ./es_python:/es_python   挂载某个卷
    -w /var/log                 覆盖工作目录
        -c "while true; do echo  hello world; sleep 1; done" 
eg: 
        >> docker run --name es_python_app -p 5033:5033 -it es-python-image:v2022.07.21 python run.py            

获取容器详细信息

>> docker inspect es-python 

查看容器日志

>> docker logs es-python
            -f 动态监控日志
            -t 为每条日志项加上时间戳
            --tail 10 获取最后十条日志
            --tail 0 -f 跟踪最新日志

查看容器内部所有进程

>> docker top es-python

列出所有镜像

>> docker images

查找镜像

>> docker search python

停止容器

>> docker stop pm1n8d9jd9n

删除容器

>> docker rm ji0382h0hf

删除镜像

>> docker rmi a7sha923

在已经存在的容器中, 运行交互命令

>> docker exec -t -i es-python-app-1 /bin/bash

重启docker

>> sudo systemctl restart docker

保存/备份镜像文件 image

# 格式: docker save [options] images [images...]
>> docker save -o ~/software/es-python/es-python-image.tar es-python-image:latest
>> docker save > ~/software/es-python/es-python-image.tar es-python-image:v2022.07.21
# -o 和 > 表示输出到文件, ****.tar为目标文件, name:tag为源镜像名

导入镜像文件 image

>> docker load --input /images/ubuntu_14.04.tar
# OR 通过符号的方式来导入
>> docker load < /images/ubuntu_14.04.tar

保存容器 container

# 格式: >> docker export [options] container
#            >> docker export #ID or #Name > /app/export.tar
>> docker export -o ~/software/es-python/es-python-cont.tar es-python-app-1
>>> docker export es-python-app-1 > ~/software/es-python/es-python-cont.tar
# -o > 表示输出到文件, 

载入容器 container

注: docker import用来载入容器包,但会恢复为镜像

# 格式: >> docker import [options] file|URL|- [REPOSITORY[:TAG]]
>> docker import ~/software/es-python/es-python-cont.tar es-python-image:v202207new

免费评分

参与人数 7吾爱币 +7 热心值 +4 收起 理由
OazilAnihc + 1 谢谢@Thanks!
Tianzui0504 + 1 我很赞同!
云zone + 1 + 1 谢谢@Thanks!
丨七七七 + 1 用心讨论,共获提升!
ssdlh + 1 + 1 我很赞同!
lsir + 1 + 1 我很赞同!
lcg2014 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Batcher 发表于 2023-11-22 19:44
当 CMD 和 ENTRYPOINT 指令同时存在于 Dockerfile 中时,它们的行为会结合起来。具体来说:
  • 如果没有指定 CMD,但指定了 ENTRYPOINT,容器启动时将执行 ENTRYPOINT 指定的命令,并且可以通过 docker run 命令的参数来提供参数。
  • 如果同时指定了 CMD 和 ENTRYPOINT,则 CMD 的内容将作为 ENTRYPOINT 命令的默认参数。可以通过 docker run 命令的参数来覆盖 CMD 中的默认参数。
ysjd22 发表于 2023-11-22 16:34
每年工资两千五 发表于 2023-11-22 17:19
一个镜像就1.18G,楼主能不能找到缩小容器包的方法
漁滒 发表于 2023-11-22 18:04
每年工资两千五 发表于 2023-11-22 17:19
一个镜像就1.18G,楼主能不能找到缩小容器包的方法

可以使用slim后缀的镜像(我在用的),或者使用最小的alpine后缀镜像
Recalled123 发表于 2023-11-22 19:29
哇,我最近就在学这些,,感谢大佬分享太及时了
moruye 发表于 2023-11-22 20:19
这就有意思了,刚好学习了
jesssy 发表于 2023-11-22 20:26
楼主在做数据分析么?现在这行怎么样?
d1y2j3 发表于 2023-11-22 21:12
很详细的例子。感谢!
QuGeNet 发表于 2023-11-22 22:08
学习了,很详细!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 11:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表