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

目录

第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.rhkb.cn/news/322710.html

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

相关文章

MySQL中JOIN连接的实现算法

目录 嵌套循环算法&#xff08;NLJ&#xff09; 简单嵌套循环&#xff08;SNLJ&#xff09; 索引嵌套循环&#xff08;INLJ&#xff09; 块嵌套循环&#xff08;BNLJ&#xff09; 三种算法比较 哈希连接算法&#xff08;Hash Join&#xff09; 注意事项&#xff1a; 工…

93、动态规划-最长回文子串

思路 首先从暴力递归开始&#xff0c;回文首尾指针相向运动肯定想等。就是回文&#xff0c;代码如下&#xff1a; public String longestPalindrome(String s) {if (s null || s.length() 0) {return "";}return longestPalindromeHelper(s, 0, s.length() - 1);…

django中的cookie与session

获取cookie request.COOKIE.GET 使用cookie response.set-cookie views.py from django.http import HttpResponse from django.shortcuts import render# Create your views here. def cookie_test(request):r HttpResponse("hello world")r.set_cookie(lan, py…

【第38天】SQL进阶-SQL设计优化-范式设计(SQL 小虚竹)

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 零、前言一、练习题目二、SQL思路初始化数据什么是范式设计第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09; 三、总结四、参考 零、前言 今天是学习 SQL …

Sealos急速部署生产用k8s集群

最近一段时间部署k8s全部使用sealos了&#xff0c;整体使用感觉良好&#xff0c;基本没有什么坑。推荐给大家。 使用 Sealos&#xff0c;可以安装一个不包含任何组件的裸 Kubernetes 集群。 最大的好处是提供 99 年证书&#xff0c;用到我跑路是足够了。不用像之前kubeadm安装…

CISCN 2023 初赛

Web unzip 文件上传页面 upload.php页面源码显示了出来 <?php error_reporting(0); highlight_file(__FILE__);$finfo finfo_open(FILEINFO_MIME_TYPE); if (finfo_file($finfo, $_FILES["file"]["tmp_name"]) application/zip){exec(cd /tmp &am…

中间件之异步通讯组件RabbitMQ进阶

这里我们必须尽可能确保MQ消息的可靠性&#xff0c;即&#xff1a;消息应该至少被消费者处理1次 那么问题来了&#xff1a; 我们该如何确保MQ消息的可靠性&#xff1f; 如果真的发送失败&#xff0c;有没有其它的兜底方案&#xff1f; 首先&#xff0c;我们一起分析一下消息…

文本批量操作技巧:内容查找不再繁琐,自动化批量移动至指定文件夹

在文本处理和信息管理的日常工作中&#xff0c;我们经常需要处理大量的文件和数据。面对这些海量的信息&#xff0c;如何快速而准确地查找特定的内容&#xff0c;并将它们批量移动至指定的文件夹&#xff0c;成为了一项关键的技能。本文将介绍办公提效工具一些实用的文本批量操…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

实践精益理念:精益生产培训助力企业持续增长

在日益激烈的市场竞争中&#xff0c;企业如何寻找持续增长的动力&#xff0c;提升整体创新能力和核心竞争力&#xff1f;张驰咨询通过多年来的深入研究和实践&#xff0c;结合众多企业的实际情况&#xff0c;带来了精益生产培训的全新视角。 在近期举办的一次精益生产培训中&am…

DDR4 SDRAM 和DDR5 SDRAM的区别

DDR4 SDRAM和DDR5 SDRAM作为两代内存技术,它们在多个方面展现出了显著的差异和改进,以下是对两者区别的详细介绍: 性能与频率 DDR4 SDRAM 的标准工作频率范围从1600MHz(DDR4-1600)到3200MHz(DDR4-3200),在非超频情况下。它的数据传输速率和带宽因此在该范围内。DDR5 S…

JavaScript手写专题——图片懒加载、滚动节流、防抖手写

图片懒加载场景&#xff1a;在一些图片量比较大的网站&#xff08;比如电商网站首页&#xff0c;或者团购网站、小游戏首页等&#xff09;&#xff0c;如果我们尝试在用户打开页面的时候&#xff0c;就把所有的图片资源加载完毕&#xff0c;那么很可能会造成白屏、卡顿等现象&a…

新手向的s2-046漏洞复现

一、前期准备 1.docker容器 作为第一次接触struts2漏洞类型的小白&#xff0c;第一步从搭建环境开始。首先我们需要准备一个服务器或者本地系统&#xff0c;我这里是使用本地的kali&#xff0c;kali里面需要有docker容器&#xff0c;docker容器的安装教程请自行搜索&#xff0c…

【C++】STL — List的接口讲解 +详细模拟实现

前言&#xff1a; 本章我们将学习STL中另一个重要的类模板list… list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是带头双向循环链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xf…

Prompt提示词教程 | 提示工程指南 | 提示词示例 入门篇

在上一节中&#xff0c;我们介绍并给出了如何赋能大语言模型的基本示例。如果还没看而且是刚入门的同学建议看下&#xff0c;有个基本概念。 Prompt提示词教程 | 提示工程指南 | 提示工程简介https://blog.csdn.net/HRG520JN/article/details/138523705在本节中&#xff0c;我…

2024 GESP6级 编程第一题 游戏

题目描述 你有四个正整数 &#xff0c;并准备用它们玩一个简单的小游戏。 在一轮游戏操作中&#xff0c;你可以选择将 减去 &#xff0c;或是将 减去 。游戏将会进行多轮操作&#xff0c;直到当 时游戏结束。 你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作…

为软件教学文档增加实践能力

为了更方便软件教学&#xff0c;我们在凌鲨(OpenLinkSaas)上增加了公共资源引用的功能。 目前可以被引用的公共资源: 微应用常用软件公共知识库Docker模板 引用公共资源 引用微应用 目前微应用包含了主流数据库&#xff0c;终端等工具&#xff0c;可以方便的进行各种相关实…

【前端】HTML基础(1)

文章目录 前言一、什么是前端二、HTML基础1、 HTML结构1.1 什么是HTML页面1.2 认识HTML标签1.3 HTML文件基本结构1.3 标签层次结构1.4 创建html文件1.5 快速生成代码框架 三、Emmet快捷键 前言 这篇博客仅仅是对HTML的基本结构进行了一些说明&#xff0c;关于HTML的更多讲解以及…

容联云孔淼:大模型落地与全域营销中台建设

近日&#xff0c;由金科创新社主办的2024区域性商业银行数智化转型研讨会顺利召开&#xff0c; 容联云产业数字云事业群副总经理、诸葛智能创始人孔淼受邀出席&#xff0c;并分享数智化转型实践经验。 他分享了容联云两大核心产品&#xff0c;“大模型应用容犀Copilot”在金融营…

Spring Security初探

url说明方法/login/oauth/authorize无登录态时跳转到/authentication/require&#xff0c;有登录态时跳转到/loginorg.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint#authorize/authentication/require自己写的用于重定向到登录页面的urlcn.merryy…