docker学习笔记(四)制作镜像

news2024/11/19 15:14:21

目录

第1步:编辑Dockerfile 

 第2步:编辑requirements.txt文件

第3步:编辑app.py文件,我们的程序文件

 第4步:生成镜像文件

第5步:使用镜像,启动容器

第6步: 启动redis容器、将容器链接到redis容器 

第7步:测试


制作一个自己的镜像(本文的例子是flask web服务),并使用其启动容器,访问服务
从镜像的制作到代码编写,启动容器

midkr /mydocker
cd /mydocker

 所有用于制作镜像所需文件都会放在mydocker这个文件里

第1步:编辑Dockerfile 

[root@docker1 mydocker]# vim Dockerfile
[root@docker1 mydocker]# cat Dockerfile
FROM python:2.7-slim	
WORKDIR /app
ADD . /app
RUN pip install --trusted-host  pypi.python.org -r requirements.txt
EXPOSE 80
ENV NAME World
ENV AUTHOR cali
CMD ["python","app.py"]

FROM python:2.7-slim 导入基础镜像,镜像里已经安装了python 2.7
WORKDIR /app 进入到容器后,会进入的文件夹
ADD . /app 复制Linux系统当前目录下的内容到容器的/app目录下,相当于docker cp
RUN 在容器内部执行的命令
EXPOSE 80 容器监听80端口
ENV NAME World 定义环境变量NAME复制world
ENV AUTHOR cali 定义环境变量AUTHOR复制cali
CMD [“python”,“app.py”] 容器启动时执行命令

RUN和CMD指令是不同的阶段执行的
RUN是在执作镜像的过程中执行的; CMD是镜像制作完成,启动容器使用镜像的时候执行的

注意:这里的Dockerfile是用于构建 Docker 容器镜像的文本文件,其中包含了一系列指令,用于描述如何构建一个特定的 Docker 镜像。通过 Dockerfile,你可以定义容器的环境、运行命令、安装软件包、设置文件和目录等操作,最终将这些指令逐步执行,生成一个可运行的 Docker 镜像。

也就是说他是一个配置文件

 第2步:编辑requirements.txt文件

[root@docker1 mydocker]# vim requirements.txt
[root@docker1 mydocker]# cat requirements.txt
Flask
Redis

这意味着你的应用程序依赖于 Flask 和 Redis 这两个 Python 包。通常情况下,当你使用 Docker 镜像制作工具时,比如 Dockerfile,你可以将这个 requirements.txt 文件用作安装依赖项的基础。例如,在 Dockerfile 中可能会有一行类似于:

RUN pip install -r requirements.txt

 这样的命令将会在构建 Docker 镜像时安装 requirements.txt 文件中列出的所有 Python 依赖包,以确保你的应用程序在容器中能够正常运行。

第3步:编辑app.py文件,我们的程序文件

这里是python 编写的一个简单的基于flask框架的web服务,也就是核心代码

[root@docker1 mydocker]# vim app.py
[root@docker1 mydocker]# cat app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

这段代码是一个简单的 Flask 应用程序。它使用 Flask 来创建一个 Web 服务器,并在根路径 ("/") 上定义了一个路由。当访问该路径时,它会尝试连接到 Redis 数据库,并增加一个名为 "counter" 的计数器。然后,它会返回一个包含一些信息的 HTML 页面,其中包括访问者的主机名、访问次数等信息。

这段代码中的 redis 变量是一个连接到 Redis 数据库的客户端。在 hello() 函数中,它尝试递增一个名为 "counter" 的计数器,如果连接到 Redis 失败,则会返回一个指示计数器不可用的消息。

if __name__ == "__main__": 语句下,它调用了 Flask 应用程序的 run() 方法,以便在主机的端口 80 上运行应用程序。

 此时,,ls当前目录,有三个文件

[root@docker1 mydocker]# ls
app.py  Dockerfile  requirements.txt

 第4步:生成镜像文件

docker build -t [name] .

[root@docker1 mydocker]# docker build -t sc-hello_1 .
Sending build context to Docker daemon  4.608kB
Step 1/8 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
123275d6e508: Pull complete
dd1cd6637523: Pull complete
0c4e6d630f2c: Pull complete
13e9cd8f0ea1: Pull complete
。。。。。
Step 8/8 : CMD ["python","app.py"]
 ---> Running in 37b5eab93347
Removing intermediate container 37b5eab93347
 ---> 4a40df3dba49
Successfully built 4a40df3dba49
Successfully tagged sc-hello_1:latest
#  查看是否建立成功
[root@docker1 mydocker]# docker images
REPOSITORY   TAG        IMAGE ID       CREATED          SIZE
sc-hello_1   latest     4a40df3dba49   11 seconds ago   159MB
mysql        5.7.39     daff57b7d2d1   4 days ago       430MB
nginx        1.22.0     1b84ed9be2d4   6 days ago       142MB
nginx        latest     2b7d6430f78d   6 days ago       142MB
python       2.7-slim   eeb27ee6b893   2 years ago      148MB

使用 docker images就可以看到已经创建的镜像

第5步:使用镜像,启动容器

docker run 一个容器,使用自己刚刚生成的镜像

[root@docker1 mydocker]# docker run -d -p 5080:80 --name my-hello-1 sc-hello_1
00cfc6f5255916bbed6aee48039acf1697938002d4be80f010348ec48d439acd

 访问容器的web服务
curl或者chrome浏览器访问
宿主机ip:5080然后去访问这个服务看是否成功

因为redis数据库容器没有启动,flask web服务不能连接到redis数据库 

第6步: 启动redis容器、将容器链接到redis容器 

[root@docker1 mydocker]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
7a6db449b51b: Already exists
05b1f5f3b2c0: Pull complete
f0036f71a6fe: Pull complete
cd7ddcecb993: Pull complete
8cfc9a467ed7: Pull complete
2a9998409df9: Pull complete
Digest: sha256:495732ba570db6a3626370a1fb949e98273a13d41eb3e26f7ecb1f6e31ad4041
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
[root@docker1 mydocker]# docker run -d -p 6379:6379 --name sc-redis-1 redis
3345b96604508aed60492c9bc0e50e08751f00e76cdd8b1b0f3c40b31a27ab37

再次启动一个自己制作镜像的容器,连接到redis容器

[root@docker1 mydocker]# docker run -d --name my-hello-2 -p 5081:80 --link sc-redis-1:redis sc-hello_1
3470e6ddeaa2367e026b768b2178d83d17c9f246a046ea4303fdc42851e1cf10

这个命令启动了一个名为 my-hello-2 的 Docker 容器,使用了 -d 参数让容器在后台运行。它映射了容器内部的 80 端口到主机的 5081 端口(-p 5081:80),这意味着你可以通过访问主机的 5081 端口来访问该容器中运行的应用程序。

另外,--link sc-redis-1:redis 参数建立了与名为 sc-redis-1 的 Redis 容器的连接,并将其命名为 redis,这样在你的 Flask 应用程序中就可以使用 redis 这个主机名来访问 Redis 容器。

最后,sc-hello_1 是指你要运行的 Docker 镜像的名称或 ID。

容器的 ID 是 3470e6ddeaa2367e026b768b2178d83d17c9f246a046ea4303fdc42851e1cf10

第7步:测试

[root@docker1 mydocker]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                   PORTS                                       NAMES
3470e6ddeaa2   sc-hello_1     "python app.py"          4 minutes ago    Up 4 minutes             0.0.0.0:5081->80/tcp, :::5081->80/tcp       my-hello-2
3345b9660450   redis          "docker-entrypoint.s…"   6 minutes ago    Up 5 minutes             0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   sc-redis-1
00cfc6f52559   sc-hello_1     "python app.py"          57 minutes ago   Up 57 minutes            0.0.0.0:5080->80/tcp, :::5080->80/tcp       my-hello-1

访问容器的web服务
curl或者chrome浏览器访问
宿主机ip:5081

界面显示应该如下,即表示成功
Hello World!
Hostname: aad7da1892b5
Visits: 1

同时刷新的时候会看见Visits会加一(相当于自动计数访问量)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PLC数据采集网关的功能和特点-天拓四方

一、引言 随着工业自动化程度的不断提高&#xff0c;数据在生产线上的作用愈发重要。PLC作为工业自动化的核心设备&#xff0c;其数据采集和处理能力直接影响到整个生产线的效率和稳定性。而PLC数据采集网关&#xff0c;作为连接PLC与外部系统的桥梁&#xff0c;正日益受到人们…

我的Transformer专栏来啦

五一节前吹的牛&#xff0c;五一期间没完成&#xff0c;今天忙里偷闲&#xff0c;给完成了。 那就是初步拟定了一个《Transformer最后一公里》的写作大纲。 之前一直想写一系列Transformer架构的算法解析文章&#xff0c;但因为一直在忙&#xff08;虽然不知道在忙啥&#xf…

YOLOv8 Tensorrt Python/C++部署详解

按照大佬的方法进行部署&#xff0c;但是中间出现了很多问题&#xff0c;这里进行一下总结。 YOLOv8 Tensorrt Python/C部署教程_yolo 安装tensorrt-CSDN博客https://blog.csdn.net/weixin_45747759/article/details/130341118 Monday-Leo/Yolov5_Tensorrt_Win10: A simple i…

即插即用 | YOLOv8热力图可视化方法详解,揭秘AI如何「看」世界!【附完整源码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

TypeScript学习日志-第十七天(泛型约束)

泛型约束 当我们使用泛型时非常方便&#xff0c;但是在使用的过程中也会遇到很多问题&#xff0c;如图&#xff1a; 这时候就会提示错误&#xff0c;因为返回的是相加的值&#xff0c;但是不是所有的类型都能相加的&#xff0c;例如来个undefined类型的 就不能进行相加了&…

锂电池恒流恒压CCCV充电模型MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; CCCV简介 CCCV充电过程是恒流充电&#xff08;CC&#xff09;和恒压充电&#xff08;CV&#xff09;的结合。在CC阶段对电池施加恒定电流&#xff0c;以获得更快的充电速度&#xff0c;此时电池电压持续升高…

docker安装Debian:11 freeswitch1.10.5

文章目录 一、生成一个镜像二、切换一个镜像源为阿里源三、安装一些相关依赖和freeswitch3.1第一步&#xff1a;安装freeswitch-mod和下载所需的依赖项3.2 设置密钥3.3 安装freeswitch所需的依赖项3.4 报错3.4.1 报错13.4.2 报错23.4.3 报错3 四、运行4.1 通话三十秒自动挂断 一…

Hotcoin Research | 模块化将是大势所趋:拆解模块化区块链的现状和未来

关于模块化区块链叙事的讨论源于Celestia和其代币TIA的亮眼表现。实际上&#xff0c;模块化是未来区块链设计的主要发展方向和大势所趋。模块化区块链就像乐高积木一样&#xff0c;将区块链系统拆分为可重用的模块&#xff0c;通过定制组合可实现不同功能的区块链网络。这种灵活…

【半个月我拿下了软考证】软件设计师高频考点--系统化教学-网络安全

&#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件设计师考点暴击 ⭐&#x1f170;️进入狂砍分⭐ ⭐软件设计师高频考点文档&#xff0c; ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ &#x1f3b6;&#xff08;A) 考点1&#xff0c;网络攻击 理解记忆 &#…

融知财经:期货在哪里可以交易?期货交易有哪些交易规则?

作为当前金融市场的一种投资方式&#xff0c;期货只适合一些投资者&#xff0c;比如想获得高收益的投资者&#xff0c;因为期货的风险系数很高。但是很多投资者还不知道期货的意思&#xff0c;在一个固定的交易场所&#xff0c;期货是买卖标准化商品或金融资产的远期合约的交易…

软件1班20240509

文章目录 1.JDBC本质2.增3.改4.删5.查6.JDBC标准写法 1.JDBC本质 重写 接口的 方法 idea 报错 – 不动脑 alt enter 知道没有重写方法 CTRL o 重写 方法 快捷键 package com.yanyu;/*** Author yanyu666_508200729qq.com* Date 2024/5/9 14:42* description:*/ public interf…

使用QLoRA在自定义数据集上finetuning 大模型 LLAMA3 的数据比对分析

概述: 大型语言模型(LLM)展示了先进的功能和复杂的解决方案,使自然语言处理领域发生了革命性的变化。这些模型经过广泛的文本数据集训练,在文本生成、翻译、摘要和问答等任务中表现出色。尽管LLM具有强大的功能,但它可能并不总是与特定的任务或领域保持一致。 什么是LL…

oracle 数据库找到UDUMP的文件名称

oracle 数据库找到UDUMP的文件名称 select p.value||\||i.instance_name||_ora_||spid||.trc as "trace_file_name" from v$parameter p ,v$process pro, v$session s, (select sid from v$mystat where rownum1) m, v$instance i where lower(p.name)user_dump_…

红米Turbo3小米平板6SPro澎湃OS系统强解BL锁-跳小米社区绑定-刷ROOT权限

红米Turbo3小米平板6SPro这2款设备都出厂为澎湃OS系统&#xff0c;官方提供都是小米社区申请解锁权限&#xff0c;然后自己答题解锁&#xff0c;门槛非常高&#xff0c;想要玩机root的用户&#xff0c;都在堵在门外。还在这目前这两款机型官方并没有加入强制验证&#xff0c;在…

Python turtle绘制图形详解

Python 的 Turtle 模块是一个简单而直观的绘图工具&#xff0c;可以帮助初学者理解基本的图形绘制概念。 1.导入 Turtle 模块&#xff1a; import turtle 2.创建 Turtle 对象&#xff1a; t turtle.Turtle() 3.绘制图形&#xff1a; 4.移动Turtle对象&#xff1a;t.forward(di…

基于Spring Boot的酒店管理系统设计与实现

基于Spring Boot的酒店管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统首页界面图&#xff0c;在系统首页可以查看首页…

pgsql查看指定模式的存储过程

pgsql查看指定模式的存储过程 在 PostgreSQL 中&#xff0c;如果你想要查看指定模式的存储过程&#xff08;也称为函数&#xff09;&#xff0c;你可以使用 \df 或 \df 命令在 psql 命令行工具中&#xff0c;或者使用 SQL 查询来从 pg_catalog 系统模式中查询。 \df命令行查询…

容器集群管理系统Kubernetes(K8S)

目录 一、前言 1.1什么是云原生&#xff1f; 1.2云要素的四要素&#xff1f; 1.2.1微服务 1.2.2容器化 1.2.3DevOps 1.2.4持续交付 1.3云平台有哪些&#xff1f; 1.4SRE 二、Kubernetes 概述 2.1K8S 是什么 2.2K8S作用 2.3K8S版本 2.4为什么要用 K8S 2.5K8S 的特…

从零开始打造个性化生鲜微信商城小程序

随着移动互联网的普及&#xff0c;小程序商城已经成为越来越多商家的选择。本文将通过实战案例分享&#xff0c;教您如何在五分钟内快速搭建个性化生鲜小程序商城。 步骤一&#xff1a;登录乔拓云网后台&#xff0c;进入商城管理页面 打开乔拓云官网&#xff0c;点击右上角的“…

unaipp推荐算法的汽车租赁系统zaxzu 微信小程序hbuiderx

随着现代汽车租赁管理的快速发展&#xff0c;可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统&#xff0c;传统的汽车租赁管理已经无法适应高速发展&#xff0c;…