草庐IT

将把python项目打包成Docker镜像(linux版)

monkey_susu 2023-10-15 原文

1.前提

1.1 安装anconda,并创建虚拟环境,安装python项目所需的包。

Anconda:https://www.anaconda.com/products/distribution#Downloads

1.2 打包python项目所需的依赖:

pip freeze > reauirments.txt

1.3 下载python项目所需依赖包到指定文件夹py_pkgs:

pip download -d py_pkgs -r requirments.txt

2.在线安装Docker

2.1 查看当前linux系统是否支持docker版本:

Docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安账docker。

>uname -r

2.2 安装yum工具

注意:先切换root用户:su root

yum install -y yum-utils \
>            device-mapper-persistent-data \
>            lvm2 --skip-broken

2.3 更新本地镜像源

2.3.1 设置docker镜像源

yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

2.3.2 安装Docker

yum install -y docker-ce

2.4 查看docker 版本

docker version

2.5 先输入:sudo systemctl start docker,再输入:sudo systemctl enable docker

sudo systemctl start docker
sudo systemctl enable docker

2.6 再次输入:docker version,出现了client和server就代表安装成功了。

2.7 查看docker启动状态:systemctl status docker(如下图即启动成功)

2.8 卸载命令:

a.查询docker安装过的包:
yum list installed | grep docker

b.删除安装包:
yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y

c.删除镜像/容器等:
rm -rf /var/lib/docker

3.离线安装Docker

安装步骤:

1、获取docker安装文件,官方地址如下:

https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz

2、将下载的安装文件进行解压,命令如下:

tar zxvf docker-19.03.9.tgz

3、将上述解压后文件(docker文件夹)全部移动至/usr/bin目录下(必须),命令如下:

cp -p docker/* /usr/bin

4、将docker注册为service,步骤如下:

①输入如下命令:

vi /usr/lib/systemd/system/docker.service

②点击i,下面出现-----insert----进入编辑状态

复制下面内容至docker.service,复制内容如下:

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
[Service]
Type=notify
EnvironmentFile=-/run/flannel/docker
WorkingDirectory=/usr/local/bin
ExecStart=/usr/bin/dockerd \
                -H tcp://0.0.0.0:4243 \
                -H unix:///var/run/docker.sock \
                --selinux-enabled=false \
                --log-opt max-size=1g
ExecReload=/bin/kill -s HUP $MAINPID
#Having non-zero Limit*s causes performance problems due to accounting overhead
#in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
#Uncomment TasksMax if your systemd version supports it.
#Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
#set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
#kill only the docker process, not all processes in the cgroup
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

复制完成之后,点击esc键,并输入:wq!保存并强制退出;

可执行如下命令,查看上述复制内容是否正确

cat /usr/lib/systemd/system/docker.service

5、重新加载docker配置文件,命令如下:

$ systemctl daemon-reload

6、启动docker,命令如下:

$ systemctl start docker

7、设置docker开机启动,命令如下:

$ systemctl enable docker

8、查看docker是否安装成功,命令如下:

$ docker version

4.将python web项目打包成镜像

4.1 先安装一个基础的镜像,如python3.6

docker pull silverlogic/python3.6

4.1.2 如在离线环境,可在联网电脑的docker中pull python的镜像到docker容器,并将python打包成image导出。


打包python:
docker save -o python.tar python:3.6.2

4.2 在当前项目文件目录下,编写gunicorn配置文件gunicorn.conf.py文件

sudo vim gunicorn.conf.py

添加一下代码:

workers = 5
worker_class = "gevent"
bind = "0.0.0.0:8080"

查看当前目录结构:

4.3 编写Dockerfile文件

3.1 创建Dockerfile文件

sudo vim Dockerfile

先借一张图介绍一下 dockerfile:

添加以下代码到Dockerfile文件中:

FROM python:3.6.2
MAINTAINER susu
COPY requirements.txt ./
RUN pip install  -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
ADD ./engineSystem.tar.gz /flask_project/
WORKDIR /flask_project/engineSystem
COPY requirements.txt ./
CMD ["gunicorn", "app_flask:app", "-c", "./gunicorn.conf.py"]

4.4 制作docker image

我这里镜像的名字直接做成flask_demo了

docker build -t flask_demo:1.0 .

制作完成了,可以看到还是蛮大的,接下来就是使用它了

docker image ls -a | grep flask_demo
docker images | grep flask_demo
两个命令一样,喜欢用哪一个看你自己啊

4.5 使用testflask

创建:

docker run -it --name=flask_app -p 5001:8080 flask_demo:1.0

解释一下参数
–name # 是给你创建的容器起一个名字,在后续进行容器操作的时候可以直接使用名字,不用在使用id
-p # 将宿主机的端口映射到容器中

4.6 查看docker容器内容

docker ps -a | grep flask_app
docker container ls -a | grep flask_app
两个命令一样啊,用哪个都可以

再次启动:

docker container start flask_app

进入容器中看看:

docker exec -it flask_app /bin/bash

4.7 制作成为tar,这样就可以发布到任何一台安装过docker的机器,我这里命名为flask_image.tar用于区别

docker save -o flask_image.tar flask_demo:1.0

查看当前文件目录结构:

打开看一下(这个命令是打开当前路径的文件夹)

nautilus ./

可以看到文件是存在的

4.8 载入

下边这个文件,你可以添加绝对路径来导入,我是由于就在当前路径下,直接这样写了

docker load --input flask_image.tar

是载入成功的,由于我之前的镜像没有删除,这里没有区别开:

到此,flask项目使用docker就完整完成了。

有关将把python项目打包成Docker镜像(linux版)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  5. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐