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