项目完成后需要打包成镜像然后发布,因为镜像里包含了配置文件及所需要的包。制作镜像的三种办法:
目录
一、如果项目较小,且所需依赖不是很多,直接将项目文件上传至容器内,并安装所有程序运行需要的包。最后保存镜像。
二、在基础镜像上安装所有程序运行需要的包,最后保存镜像。(项目代码不需要放进镜像)
3.1 如果启动的是服务程序,需要指定端口映射,端口映射通过-P和-p参数来实现。
一、如果项目较小,且所需依赖不是很多,直接将项目文件上传至容器内,并安装所有程序运行需要的包。最后保存镜像。
运行镜像,打开新的命令行,查看container ID,docker ps -a
查找容器长ID
docker inspect -f '{{.ID}}' tomcat-container-id
拷贝本地文件到容器
docker cp 本地路径 容器长ID:容器路径
docker cp /usr/myfile/Test.war 38ef22f922704b32cf2650407e16b146bf61c221e6b8ef679989486d6ad9e856:/usr/local/tomcat/webapps/Test.war
注意:
1、docker run -it 一个启动容器,然后另起一个窗口连接服务器查看容器ID、查找长ID,进行复制。复制后在第一个窗口目录下 或者 利用sudo docker attach [CONTAINER ID] 进入该容器,查看是否复制成功。(这样做目的是为了保持容器STATUS为UP)
2、每次docker run -it 其实都是新建了一个容器(相应的容器ID都不一样)
二、在基础镜像上安装所有程序运行需要的包,最后保存镜像。(项目代码不需要放进镜像)
进入项目代码目录下,以挂载的方式执行python代码
1、加载保存好的本地镜像 或 拉取镜像:
docker load -i comments_classification.tar
docker pull python:3.5 # [REPOSITORY:TAG]
2、从宿主机进入要执行的脚本(test.py)所在目录:
python文件地址:/home/bx_admin/jenkins_work/test/test.py
#test.py文件
#!/usr/bin/python
import os
print(os.getcwd()) #获取当前目录
print('-------------start--------------------')
print('this is a test file')
print('----------------end---------------')
3、在宿主机执行python文件(运行容器)
docker run -v /home/bx_admin/jenkins_work/test:/usr/src/python -w /usr/src/python python:3.5 python test.py
命令说明:
- docker run 创建容器
- -v /home/bx_admin/jenkins_work/test 将主机中/home/bx_admin/jenkins_work/test目录挂载到容器的/usr/src/python
- -w /usr/src/python 指定容器的/usr/src/python目录为工作目录
- python:3.5 是镜像
- python test.py 是命令执行test.py脚本
3.1 如果启动的是服务程序,需要指定端口映射,端口映射通过-P和-p参数来实现。
3.1.1 -p指定要映射的端口,一个指定端口上只可以绑定一个容器;支持的格式如下:
①IP:HOSTPORT:CONTAINERPORT
:指定ip、指定宿主机port、指定容器port
- 适用于映射到指定地址的指定端口
eg:将容器的5000端口映射到指定地址127.0.0.1的5000端口上:
docker run -p 127.0.0.1:5000:5000 -v /home/bx_admin/jenkins_work/test:/usr/src/python -w /usr/src/python python:3.5 python test.py
②IP::CONTAINERPORT
:指定ip、未指定宿主机port(随机)、指定容器port
- 适用于映射到指定地址的任意端口
eg:将容器的4000端口映射到127.0.0.1的任意端口上:
docker run -it -d -p 127.0.0.1::4000 docker.io/centos:latest /bin/bash
注:会将容器的ip127.0.0.1和4000端口,随机映射到宿主机的一个端口上。
③HOSTPORT:CONTAINERPORT
:未指定ip、指定宿主机port、指定容器port
- 适用于将容器指定端口指定映射到宿主机的一个端口上(映射所有接口地址)
eg:将容器的80端口映射到宿主机的8000端口上:
docker run -itd -p 8000:80 docker.io/centos:latest /bin/bash
注:上边的操作默认会绑定本地所有接口上的所有地址。
查看映射端口配置:
docker port CONTAINER_ID
本节参考:https://www.cnblogs.com/wholj/p/10551999.html
4、结果
执行test.py文件后,可以看到当前目录是/usr/src/python,可以看出我们的脚本输出的是docker容器中的目录,而不是我们宿主机的目录 。
再看直接使用服务器python直接该文件的打印,当前目录是home/bx_admin/jenkins_work
5、这种方式会产生容器变化
先看执行前的容器 docker ps -a ,当前一共只有两个容器
docker执行python文件后(相当于新建了一个容器)
注意:即使文件执行失败了,但是新容器还是新生成了
删除容器:docker rm -v a7505a43e238
参考:CentOS 7上使用docker运行python脚本文件 https://blog.csdn.net/shuyaoyao/article/details/108692158
三、编写dockerfile等
python项目打包成docker镜像并发布 https://blog.csdn.net/bocai_xiaodaidai/article/details/92838984
python项目打包成docker镜像并发布运行 https://blog.csdn.net/qq_27786919/article/details/106780756?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242
Docker制作Python运行环境基础镜像的方法步骤 https://www.jb51.net/article/177259.htm
python 项目制作docker镜像 https://www.cnblogs.com/adolfmc/p/13062478.html