目的:
为K8S制作docker的服务镜像,使得程序可以通过K8S运行,原理就是docker对应用服务的打包,生成的镜像不仅K8S能用,docker swarm
或者docker直接启动都可以
打包方式:
docker file
简单理解:
docker应用打包可以理解为拉去了一个liunx最小系统,在该系统上部署应用服务后封装成一个镜像,使其运行该镜像时能够得到一个拥有部署服务的容器
例如常用的from python、jdk等等基础镜像,无非是官方精简了linux最小系统使得该镜像只保留python、jdk等功能,我们可以不拉去官方镜像而直接拉去
debian或者Ubuntu为基础封装,一般直接拉去Debian等镜像,功能全面同时也会使得镜像包非常大,所以常规都是根据所需功能拉去单功能镜像即可
实验用例:
docker 部署python3的flask应用
操作:
在一个linux空文件夹里新建如下文件和内容:
[root@lovecat f]# ls
flask gun.conf test.py
[root@lovecat f]# cat flask
FROM python:3.6
LABEL maintainer="test@outlook.com"
RUN pip3 install flask \
&& pip3 install gunicorn \
&& pip3 install gevent \
&& mkdir -p /app
COPY test.py /app/
WORKDIR /app
EXPOSE 5000test@outlook.com
#CMD ["gunicorn","test:app","-c"]
[root@lovecat f]# cat gun.conf
workers = 5
worker_class = "gevent"
bind = "0.0.0.0:5000"
[root@lovecat f]# cat test.py
from flask import Flask
app=Flask(__name__)
@app.route('/',methods=['GET','POST'])
def index():
return 'hello'
if __name__ == '__main__':
app.run()
以上三个文件分别为:
flask:docker file文件,构建docker镜像的文件,docker file以前有单独记录,第一次构建可以先省略掉cmd中镜像启动后执行的命令,方便我们调试
gun.conf:gunicorn的配置文件
test.py:flask测试应用文件
执行docker build构建命令
docker build -t "flask:1" -f flask .
查看得到的镜像:
[root@lovecat f]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask 1 812d4040170a 19 minutes ago 957MB
python 3.6 1daf62e8cab5 4 weeks ago 914MB
quay.io/kubernetes-ingress-controller/nginx-ingress-controller-arm64 0.30.0 94eb86bd7380 4 weeks ago 318MB
mirrorgooglecontainers/pause-arm64 3.1 6cf7c80fe444 2 years ago 525kB
启动构建好的镜像:
docker run -it -d --name flask -p 80:5000 flask:1
查看容器状态:
[root@lovecat f]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d5022b7e32b flask:1 "python3" 20 minutes ago Up 20 minutes 0.0.0.0:80->5000/tcp flask
容器运行正常,把gunicorn的配置文件复制到容器中
docker cp gun.conf flask:/app
进入容器查看:
docker exec -it flask /bin/bash
[root@lovecat f]# docker exec -it flask /bin/bash
root@3d5022b7e32b:/app# ls
__pycache__ gun.conf test.py
test.py gun.conf文件都在容器内,执行启动flask应用命令:
root@3d5022b7e32b:/app# gunicorn test:app -c ./gun.conf
!!!
!!! WARNING: configuration file should have a valid Python extension.
!!!
[2020-03-26 03:30:22 +0000] [34] [INFO] Starting gunicorn 20.0.4
[2020-03-26 03:30:22 +0000] [34] [INFO] Listening at: http://0.0.0.0:5000 (34)
[2020-03-26 03:30:22 +0000] [34] [INFO] Using worker: gevent
[2020-03-26 03:30:22 +0000] [37] [INFO] Booting worker with pid: 37
[2020-03-26 03:30:22 +0000] [38] [INFO] Booting worker with pid: 38
[2020-03-26 03:30:22 +0000] [39] [INFO] Booting worker with pid: 39
[2020-03-26 03:30:22 +0000] [40] [INFO] Booting worker with pid: 40
[2020-03-26 03:30:22 +0000] [41] [INFO] Booting worker with pid: 41
这时候新开一个主机页面直接访问主机80端口:
[root@lovecat f]# curl 127.0.0.1:80
hello
访问flask应用成功,应用镜像部署成功
总结:
1、测试服务没有问题后,重新构建docker file,把配置文件、容器启动执行命令等都写入docker file中,生成的镜像即可直接使用
这里为了简单演示,所以没有直接写在docker file中,方便理解
2、flask部署(或者java等用了框架的应用),windows ide开发的时候自动配置了端口到网络层的socket服务,然而应用上liunx后初次使用不会配置这些服务
需要在docker file中指定安装,比如python的wsgi服务,需要手动install gunicorn,否之flask程序即使在运行,也没有监听到端口,会导致无法访问报错
3、docker file构建过程可能会有报错,根据报错解决问题即可,更多的docker file操作命令,自行google