目的:
    为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