docker制作python项目镜像

docker制作python项目镜像
本文内容:讲述如何将自己开发的一个python项目,打包成docker镜像。

制作docker镜像主要有两种方法:
1、先用docker pull 命令拉取一个基础镜像,然后通过docker commit 命令在此镜像基础上制作新镜像。
2、通过dockerfile制作

第一种方法:

准备工作:已安装docker的linux系统。docker安装请参考:Ubuntu 16.04安装Docker

1、拉取基础镜像:
(1)用docker search 命令先查找有哪些镜像:
在这里插入图片描述
(2)用docker pull 拉取其中一个:
在这里插入图片描述
然后就可以用docker images命令查看到这个拉取的镜像了。

2、运行该基础镜像:
docker run -idt 镜像名:tag号
在这里插入图片描述
用docker ps 查看镜像运行状态:
在这里插入图片描述
可以看到该镜像已经运行起来了,名字叫”lucid_lalande“。容器ID是d2cc36fbcb1a。

3、进入该镜像运行起来的容器环境:

docker exec -it 容器ID  /bin/bash

在这里插入图片描述
可以看到已经以交互式方式进入了容器中。

4、在容器内部进行相关修改
创建一个文件夹,用来存放python项目代码
在这里插入图片描述
5、退出容器终端,将宿主机文件拷贝到刚刚新建的容器目录中
退出容器终端:

在这里插入图片描述
将宿主机文件拷贝到容器中:

 docker cp 宿主机项目文件存放目录  容器ID:容器中存放项目文件的目录

注意文件名中不要带空格,否则会报错。
在这里插入图片描述
6、将容器保存为新镜像

先用docker ps 查看容器运行状态:
在这里插入图片描述
该容器ID和容器名都可以看到。

然后用docker commit命令将容器保存为新镜像。

docker commit 容器名 新镜像名:版本号

在这里插入图片描述
这时用docker images命令,可以看到新创建的镜像了。
在这里插入图片描述
至此,我们自己python项目的镜像就创建好了。

下面看看怎么将镜像打包成tar包,以及如何使用镜像tar包。

1、将新镜像打包成tar包
用docker save命令:

docker save -o ***.tar   镜像名:TAG

docker save保存的镜像,默认保存在当前路径。用ll命令可以看到打包好的tar包。
在这里插入图片描述

2、使用镜像tar包
拿到tar包后,我们应该怎么使用呢?
用docker load命令:

docker load -i tar包名

加载tar包后,用docker images命令可以看到,名为feature_selection.tar的tar包,已经被加载成镜像了。然后我们就可以像使用普通镜像一样来使用它了。
在这里插入图片描述

参考:docker commit命令创建新的镜像https://www.cnblogs.com/Dev0ps/p/9969783.html

总结一下:

docker常用命令:

***************************制作镜像常用命令:***************************

1、运行镜像    docker run -idt 镜像名:tag号  或  docker run -it  镜像名:tag号  /bin/bash
-i: 交互式操作
-d :指定容器的运行模式,让容器在后台运行。默认不会进入容器,想要进入容器需要使用docker exec
-t: 终端
/bin/bash:命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash

** 加端口映射: docker run -p 16800:5000 -idt 镜像名:tag号   
(容器中的5000端口映射成宿主机的16800端口)
端口映射后,外部访问容器中服务地址:宿主机IP:16800

** 将宿主机文件挂载到容器中:
docker run -it -v /test:/soft 镜像名:tag号 /bin/bash
-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录

** 设置容器编码格式
docker run -it -e PYTHONIOENCODING=UTF-8  -v /test:/soft 镜像名:tag号 /bin/bash
-e参数设置shell的默认编码方式为 utf-8,在编译python代码的时候才不会报如下错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12

** 以特权模式运行容器:
 docker run -d --name pb --privileged=true 镜像名:id /usr/sbin/init
 进入容器:
 docker exec -it pb /bin/bash
 以特权模式运行容器后,可以在容器内使用service等后台服务。

2、进入容器     docker exec -it 容器ID  /bin/bash

3、宿主机文件拷贝到容器     docker cp 宿主机项目文件存放目录  容器ID:容器中存放项目文件的目录
可直接在运行镜像时通过-v参数将宿主机文件挂载到容器。

容器文件拷贝到宿主机: docker cp 容器ID:容器中存放项目文件的目录 宿主机项目文件存放目录

4、将容器保存为新镜像   docker commit 容器名 新镜像名:版本号

5、将新镜像打包成tar包(默认保存到当前路径)   docker save -o ***.tar   镜像名:TAG

6、加载tar包   docker load -i xxx.tar

*************************其他常用命令:*************************
1、查看容器的资源使用情况 docker top container_id
docker inspect

2、删除镜像    docker rmi   IMAGE ID
(如果镜像正在被某个容器使用,则会报错,这时只需先删除容器就好了)

3、删除容器   docker rm 容器ID

4、启动容器   docker start 容器ID
   停止容器   docker stop 容器ID

5、更名   docker tag  dl-4a:1.7.1  dl-4a:1.5.7

6、查看容器中进程信息:
在宿主机直接运行:docker exec 容器ID ps -ef
或者在容器中运行:jobs -l
停掉容器中进程:进入该容器,kill pid 

7、查看容器中端口映射信息:docker container port 容器ID
结果:15500/tcp -> 0.0.0.0:15400,容器内port 15500映射成了宿主机port 15400

第二种方法:
dockerfile示例:

FROM python:2.7
MAINTAINER Angel_Kitty <angelkitty6698@gmail.com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]

这个例子是启动一个 python flask app 的 Dockerfile ( flask 是 python 的一个轻量的 web 框架)我们可以分析一下上面这个过程:

1、从 Docker Hub 上 pull 下 python 2.7 的基础镜像
2、显示维护者的信息
3、copy 当前目录到容器中的 /app 目录下 复制本地主机的 <src> ( Dockerfile 所在目录的相对路径)到容器里 <dest>
4、指定工作路径为 /app
5、安装依赖包
6、暴露 5000 端口
7、启动 app

Dockerfile 是由一行行命令语句组成,并且支持已 # 开头的注释行。
一般来说,我们可以将 Dockerfile 分为四个部分:
基础镜像(父镜像)信息指令 FROM
维护者信息指令 MAINTAINER
镜像操作指令 RUN 、 EVN 、 ADD 和 WORKDIR 等
容器启动指令 CMD 、 ENTRYPOINT 和 USER 等

docker build -t feature_selection:1.0.0 .
docker run -p 4000:80 feature_selection

参考:docker python 提示错误UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java8新特性及实战视频教程完整版Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda 表达式可以使代码变的更加简洁紧凑。Java8实战视频-01让方法参数具备行为能力Java8实战视频-02Lambda表达式初探Java8实战视频-03Lambda语法精讲Java8实战视频-04Lambda使用深入解析Java8实战视频-05Lambda方法推导详细解析-上.wmvJava8实战视频-06Lambda方法推导详细解析-下Java8实战视频-07Stream入门及Stream在JVM中的线程表现Java8实战视频-08Stream知识点总结Stream源码阅读Java8实战视频-09如何创建Stream上集Java8实战视频-10如何创建Stream下集.wmvJava8实战视频-11Stream之filter,distinct,skip,limit,map,flatmap详细介绍Java8实战视频-12Stream之Find,Match,Reduce详细介绍Java8实战视频-13NumericStream的详细介绍以及和Stream之间的相互转换Java8实战视频-14Stream综合练习,熟练掌握API的用法Java8实战视频-15在Optional出现之前经常遇到的空指针异常.wmvJava8实战视频-16Optional的介绍以及API的详解Java8实战视频-17Optional之flatMap,综合练习,Optional源码剖析Java8实战视频-18初识Collector体会Collector的强大Java8实战视频-19Collector使用方法深入详细介绍-01Java8实战视频-20Collector使用方法深入详细介绍-02Java8实战视频-21Collector使用方法深入详细介绍-03.wmvJava8实战视频-22Collector使用方法深入详细介绍-04Java8实战视频-23Collector原理讲解,JDK自带Collector源码深度剖析Java8实战视频-24自定义Collector,结合Stream的使用详细介绍Java8实战视频-25Parallel Stream编程体验,充分利用多核机器加快计算速度Java8实战视频-26Fork Join框架实例深入讲解Java8实战视频-27Spliterator接口源码剖析以及自定义Spliterator实现一个Stream.wmvJava8实战视频-28Default方法的介绍和简单的例子Java8实战视频-29Default方法解决多重继承冲突的三大原则详细介绍Java8实战视频-30多线程Future设计模式原理详细介绍,并且实现一个Future程序Java8实战视频-31JDK自带Future,Callable,ExecutorService介绍Java8实战视频-32实现一个异步基于事件回调的Future程序.wmvJava8实战视频-33CompletableFuture用法入门介绍Java8实战视频-34CompletableFuture之supplyAsync详细介绍Java8实战视频-35CompletableFuture流水线工作,join多个异步任务详细讲解Java8实战视频-36CompletableFuture常用API的重点详解-上Java8实战视频-37CompletableFuture常用API的重点详解-下Java8实战视频-38JDK老DateAPI存在的问题,新的DateAPI之LocalDate用法及其介绍.wmvJava8实战视频-39New Date API之LocalTime,LocalDateTime,Instant,Duration,Period详细介绍Java8实战视频-40New Date API之format和parse介绍

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值