使用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
[root@server159 python]# cat Dockerfile
FROM centos:7
MAINTAINER "10086@qq.com"
USER rootRUN 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 /appCOPY ./app.py /app/WORKDIR /app
EXPOSE 8080CMD ["python3","app.py"]

还有脚本文件,脚本文件要跟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)

在这里插入图片描述

然后构建镜像

[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

查看生成的镜像

[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

用镜像构建容器,然后访问网页映射的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]# 

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

在这里插入图片描述

可以看到没问题

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

创建目录工作目录

[root@4263466478e6 /]# mkdir /app

然后下载python环境

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

然后下载flask模块

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

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

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

然后将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

回到容器里查看工作目录

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

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

[root@4263466478e6 app]# python3 ./app.py * Serving Flask app 'app' (lazy loading)* Environment: productionWARNING: 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 -

在这里插入图片描述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/160091.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缺陷之灵魂操作bug

一、前言 正常来说,我们在测试缺陷的时候都是按照case来测试的,但是有些场景,例如说发散思维这种场景,就会找到一些比较不太正常、不好复现的缺陷,然后如果要辅助研发修复,就会极为痛苦。 二、场景描述 大…

加速软件开发和交付的革命性方法-DevOps

“ 随着信息技术的快速发展,现代软件开发和交付已经经历了巨大的变革。DevOps(Development和Operations的结合)已经成为这一变革的关键推动力,让开发团队和运维团队之间的界限变得模糊,以加速软件的开发、测试和部署过…

京东数据平台:2023年Q3季度黄金市场数据分析

继9月国内黄金市场持续上涨后,进入10月中下旬后,黄金行情再度反转,多家品牌金饰价格再次突破600元/克,达到611元/克。 今年以来,黄金行情不断走俏,销售市场也有明显增长。根据鲸参谋平台的数据显示&#xf…

算法随想录算法训练营第四十七天| 647. 回文子串 516.最长回文子序列

647. 回文子串 题目:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字…

一、技术选型(从零开始撸斗地主)

将心沉下来,构建一个自己属于自己的城堡。 最近准备搞一个能承载上万人同时在线的斗地主游戏。 技术选型 客户端:Unity3D 目前有俩个选项,unity3d,cocosCreator 思考了很久,最终决定选用自己擅长的框架来搞。 服务器&#xff…

安装docker可视化工具:Portainer

文章目录 前言一、安装Portainer(docker可视化工具)1.拉镜像2. 启动容器3.查看4.访问 总结 前言 一、安装Portainer(docker可视化工具) 1.拉镜像 docker pull portainer/portainer2. 启动容器 docker run -d -p 8100:8000 -p 9…

全功能测试框架 - Carina

Carina是一个基于Java的测试自动化框架,它将所有测试层结合在一起:移动应用程序(web、本机、混合)、web应用程序、REST服务和数据库。 github:GitHub - zebrunner/carina: Carina automation framework (TestNG): Web…

循环链表(单循环、双循环)(数据结构与算法)

循环链表:循环单链表、循环双链表 1. 循环单链表 循环单链表(Circular Singly Linked List)是一种特殊类型的单链表,其中最后一个节点的指针指向头节点,形成一个循环。 循环单链表与普通单链表的主要区别在于&#xf…

我用 ChatGPT 的探索与实践

本文主要介绍在实际的开发过程当中,如何使用GPT帮助开发,优化流程;本文所有代码和脚本均是利用GPT生成。 技术交流群 建了技术答疑、交流群!想要进交流群、资料的同学,可以直接加微信号:mlc2060。加的时候…

Leetcode-509 斐波那契数列

使用循环 class Solution {public int fib(int n) {if(n 0){return 0;}if(n 1){return 1;}int res 0;int pre1 1;int pre2 0;for(int i 2; i < n; i){res pre1 pre2;pre2 pre1;pre1 res;}return res;} }使用HashMap class Solution {private Map<Integer,Int…

项目实战:展示第一页数据

1、在FruitDao接口中添加查询第一页数据和查询总记录条数 package com.csdn.fruit.dao; import com.csdn.fruit.pojo.Fruit; import java.util.List; //dao &#xff1a;Data Access Object 数据访问对象 //接口设计 public interface FruitDao {void addFruit(Fruit fruit);vo…

软件开发项目文档系列之十如何撰写测试用例

目录 1 概述1.1 编写目的1.2 定义1.3 使用范围1.4 参考资料1.5 术语定义 2 测试用例2.1 功能测试2.1.1 用户登录功能2.1.2 商品搜索功能 2.2 性能测试2.2.1 网站响应时间2.2.2 并发用户测试 附件&#xff1a; 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…