【Docker】从零开始将自己的应用打包到docker镜像
背景是这样:
有一个python写的web服务,希望打包到容器中,通过容器去启动。
参考了网上各种文档,都感到说的不清不楚,实际操作过程中,又遇到了不少的坑,这里摸索OK后记录一下。
docker的安装和部署此处不再赘述。以下从docker安装完成后开始讲。
首先,我们写一个demo,使用了python的flask框架,文件名为 app.py 。
我们的目的是,将这个代码以服务的形式,打包到docker镜像中。
from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return 'hello world' if __name__=='__main__': app.run(host='0.0.0.0',debug=True,port='7777')
本地路径如下图
可以看到,最外层目录是 mydocker ,内部是bdtools,app.py就放置在最内层。
首先,requirements.txt的内容如下图,这为了安装python依赖包:
然后我们开始编写Dockerfile
FROM python:3.8
# 拉取一个基础镜像,基于python3.8
MAINTAINER BH8ANK
# 维护者信息
ADD ./bdtools/ /code/bdtools/
# 将你的项目文件放到docker容器中的/code/bdtools文件夹,这里code是在根目录的,与/root /opt等在一个目录
# 这里的路径,可以自定义设置,主要是为了方便对项目进行管理
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
# 设置容器时间,有的容器时区与我们的时区不同,可能会带来麻烦
ENV LANG C.UTF-8
# 设置语言为utf-8
WORKDIR /code/bdtools
# 设置工作目录,也就是下面执行 ENTRYPOINT 后面命令的路径
RUN /usr/local/bin/pip3 install -r requirements.txt
# 根据requirement.txt下载好依赖包
EXPOSE 7777
# EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
# 此处填写7777,是因为我们上面的app.py提供的web服务就需要使用7777端口
ENTRYPOINT ["python3","app.py"]
Dockerfile编写完成后,我们就可以构建镜像了。
使用命令
docker build -t new Dockerfile
意思是,使用当前路径下的DockerFile进行构建,镜像名称为new
如上图,看到最后一行Successfully就表示构建成功了。图中红色部分报错是pip包版本不是最新的告警,不影响构建过程,可以忽略。
现在,我们可以查看一下镜像情况
使用命令
docker images
如上图,镜像已经构建出来了。
那么,开始启动容器。
执行命令
docker run -p 3333:7777 -dit d7d7df1b3dd5
这里需要说明一下:
1,-p参数,注意是小写,3333,表示宿主机的端口,7777表示容器内部的端口。
整条参数的意思是:将容器内的端口7777,映射到宿主机的3333端口。
如果我们需要从宿主机外部访问这个容器服务,只需要访问3333端口即可。
2,-dit ,这个参数我们只说-d,就是后台运行的意思。整行命令最后的那一串字符串,其实是上面构建出的镜像ID.
执行效果如下:
此刻,容器即已启动了。
我们可以通过命令查看容器的运行情况
docker ps -a
此处,我们一般关注的是容器ID、STATUS和PORTS,可以看到,容器的端口7777已经映射到宿主机的3333端口。
那么,我们如何进入到容器内部呢?
可以使用命令
docker exec -it 容器ID /bin/bash
需要注意,是容器ID,不是镜像ID
执行效果如上图,可以看到,命令行提示符已经到了容器内部。
那么,我们还需要确认一下,这个python服务到底启动了没有。
我们首先可以在宿主机查看端口占用情况
此外,也可以在本地PC浏览器,去访问宿主机的3333端口即可。如下图
综上,我们已经完成了从镜像制作到服务部署的全部流程。
此外,还有个别常用的docker相关的管理命令也一并贴上来
# 删除镜像 docker rmi 镜像ID # 删除容器 docker rm 容器ID # 杀容器,会将运行中的容器停下来 docker kill 容器ID # 启动容器,并将进入容器中的bash命令行 docker run -it 镜像ID /bin/bash
【完】