【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  


 

 【完】

原文地址:https://www.cnblogs.com/BH8ANK/p/15439152.html