当前位置:   article > 正文

使用Dockerfile生成docker自定义镜像_dockerfile 生成docker镜像

dockerfile 生成docker镜像

Dockerfile常用指令

• FROM 构建镜像基于哪个镜像
• MAINTAINER 镜像维护者姓名或邮箱地址
• RUN 构建镜像时运行的指令,执行一条RUN镜像就会叠加一层,因此RUN尽可能一条写完
• ADD 拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
• COPY 拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
• CMD 运行容器时执行的shell命令,CMD指令可以被run时的命令覆盖
• ENTRYPOINT 运行容器时执行的shell命令, ENTRYPOINT不会被覆盖
PS注意: 如 CMD ENTRYPOINT 都存在,则 CMD 为 ENTRYPOINT 参数
• EXPOSE 声明容器的服务端口(仅仅是声明)
• VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
• USER 为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
• WORKDIR 切换工作目录(cd)
• ARG 构建时指定的一些参数,ARG定义的变量仅在Dockerfile中可用
• ENV 设置容器环境变量,ENV定义的变量不仅在Dockerfile中可用,而且在运行的容器中都可用
• HEALTHCHECH 健康检查

通过编写dockerfile实现定制镜像

首先创建一个空白目录

然后编写Dockerfile文件

[root@server159 python]# ls
app.py  Dockerfile
  • 1
  • 2
[root@server159 python]# cat Dockerfile
FROM centos:7
MAINTAINER "10086@qq.com"
USER root

RUN mkdir -p /app && yum install -y python3 python3-devel
RUN pip3 install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN cp -r /usr/local/lib64/python3.6/site-packages/flask /app

COPY ./app.py /app/

WORKDIR /app
EXPOSE 8080

CMD ["python3","app.py"]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

还有脚本文件,脚本文件要跟Dockerfile文件放在同一目录下才行

[root@server159 python]# cat app.py 
#coding=utf-8
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello docker,I am python flask."
if __name__ == "__main__":
    app.run(host='0.0.0.0',port=8080)


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

然后构建镜像

[root@server159 python]# docker build -t centos7-python:v1 .
[+] Building 53.7s (11/11) FINISHED                      docker:default
 => [internal] load build definition from Dockerfile               0.0s
 => => transferring dockerfile: 350B                               0.0s
 => [internal] load .dockerignore                                  0.0s
 => => transferring context: 2B                                    0.0s
 => [internal] load metadata for docker.io/library/centos:7        0.0s
 => CACHED [1/6] FROM docker.io/library/centos:7                   0.0s
 => [internal] load build context                                  0.0s
 => => transferring context: 235B                                  0.0s
 => [2/6] RUN mkdir -p /app && yum install -y python3 python3-de  36.4s
 => [3/6] RUN pip3 install flask -i https://pypi.tuna.tsinghua.e  15.7s 
 => [4/6] RUN cp -r /usr/local/lib64/python3.6/site-packages/flas  0.1s 
 => [5/6] COPY ./app.py /app/                                      0.0s 
 => [6/6] WORKDIR /app                                             0.0s 
 => exporting to image                                             1.3s 
 => => exporting layers                                            1.3s 
 => => writing image sha256:e6a497c56c1c697ddf24eef187cc0d625e0cf  0.0s 
 => => naming to docker.io/library/centos7-python:v1               0.0s

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

查看生成的镜像

[root@server159 python]# docker images
REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
centos7-python   v1        e6a497c56c1c   2 minutes ago   526MB
php-fpm          v1        0474bd7488fa   23 hours ago    698MB
debian           latest    676aedd4776f   2 weeks ago     117MB
centos           7         eeb6ee3f44bd   2 years ago     204MB
nginx            1.18.0    c2c45d506085   2 years ago     133MB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

用镜像构建容器,然后访问网页映射的80端口

[root@server159 python]# docker run --name pythontest -d -p 80:8080 centos7-python:v1 
c3ef2e932730eaf3fcfb268e6ca4627361af37041ae8d8760e65dedd86bc7f79
[root@server159 pythen]# curl 192.168.121.159
Hello docker,I am python flask.[root@server159 python]# 
  • 1
  • 2
  • 3
  • 4

可以看到是可以访问到的,去浏览器试试

在这里插入图片描述

可以看到没问题

dockerfile实现定制镜像的原理

Dockerfile构建镜像相当于shell脚本,将我们要执行的命令一次性完成

下面用单步操作来展现上面的过程

用基础镜像centos7创建容器并进入

[root@server159 python]# docker run -dt --name pytest -p80:8080  centos:7
4263466478e64e02ce0a19db4c6e4ad9f284785ff5a54b6fc19a930e2c0e7507
[root@server159 python]# docker exec -it pytest bash
  • 1
  • 2
  • 3

创建目录工作目录

[root@4263466478e6 /]# mkdir /app
  • 1

然后下载python环境

[root@4263466478e6 /]# yum install -y python3 python3-devel
  • 1

然后下载flask模块

[root@4263466478e6 /]# pip3 install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 1

然后将flask拷贝到/app工作目录下

[root@4263466478e6 /]# cp -r /usr/local/lib64/python3.6/site-packages/flask /app
  • 1

然后将app.py文件从宿主机拷贝到容器中的工作目录

[root@server159 ~]# ls
anaconda-ks.cfg  default.conf  original-ks.cfg  Python-3.9.7.tgz
app.py           index.html    pythen           www.conf
[root@server159 ~]# cat app.py 
#coding=utf-8
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello docker,I am python flask."
if __name__ == "__main__":
    app.run(host='0.0.0.0',port=8080)
[root@server159 ~]# docker cp ./app.py pytest:/app
Successfully copied 2.05kB to pytest:/app
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

回到容器里查看工作目录

[root@4263466478e6 /]# ls /app
app.py  flask
  • 1
  • 2

然后运行python脚本 ,启动后我直接去浏览器访问的,所以下面有一条访问记录

[root@4263466478e6 app]# python3 ./app.py 
 * Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.17.0.2:8080/ (Press CTRL+C to quit)
192.168.121.3 - - [01/Nov/2023 12:30:28] "GET / HTTP/1.1" 200 -
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

Dockerfile定制容器不过是将我们执行的动作写到文件里

相当于shell脚本,容器的定制就是这样了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/543072
推荐阅读
相关标签
  

闽ICP备14008679号