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.mfbz.cn/a/606598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开启智慧生活,家政服务触手可及——家政小程序全新上线

繁忙生活中的贴心助手 在快节奏的现代生活中&#xff0c;我们时常为家庭琐事所困扰&#xff0c;无暇享受生活的美好。为了帮助您解决这一难题&#xff0c;我们倾力打造了一款家政小程序&#xff0c;让您的生活更加轻松、便捷。 家政小程序&#xff0c;您的生活管家 1. 全方位…

社媒营销中的截流获客是怎么一回事?

如果你要问&#xff0c;现在做社媒营销是通过哪些方式进行引流的&#xff0c;那么必然有一种是截流&#xff0c;顾名思义也就是分取别人的流量&#xff0c;方法其实很简单&#xff0c;主要分为两种&#xff1a;&#xff08;1&#xff09;抓取别人的粉丝出来进行群发私信&#x…

nestjs 全栈进阶--Module和Provider的循环依赖

视频教程 21_nest中的循环依赖_哔哩哔哩_bilibili 1. 循环依赖 当两个类相互依赖时&#xff0c;就会发生循环依赖。比如 A 类需要 B 类&#xff0c;B 类也需要 A 类。Nest中 模块之间和 提供器之间也可能会出现循环依赖。 nest new dependency -p pnpm nest g res aaa --n…

【Java EE】网络原理——UDP

目录 1.应用层 2.传输层 2.1端口号 2.1.1端口号的范围划分 2.1.2一个端口号可以被多个进程绑定吗&#xff1f; 2.1.3一个进程可以绑定多个端口号吗&#xff1f; 3.UDP协议 3.1UDP的格式 3.1.1 UDP的源端口号 3.1.2 UDP的目的端口号 3.1.3 UDP长度 3.1.4UDP校验和 3…

springboot项目中前端页面无法加载怎么办

在springboot前后端分离的项目中&#xff0c;经常会出现前端页面无法加载的情况&#xff08;比如&#xff1a;前端页面为空白页&#xff0c;或者出现404&#xff09;&#xff0c;该怎么办&#xff1f;&#xff1f;&#xff1f; 一个简单有效的方法&#xff1a;&#xff1a; 第…

24 | MySQL是怎么保证主备一致的?

MySQL 主备的基本原理 内部流程 备库 B 跟主库 A 之间维持了一个长连接。主库 A 内部有一个线程,专门用于服务备库 B 的这个长连接。一个事务日志同步的完整过程是这样的: 在备库 B 上通过 change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始…

钉钉群定时发送消息1.0软件【附源码】

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 有时候需要在钉钉群里提醒一些消息。要通知的群成员又不方便用定时钉的功能&#xff0c;所以写了这么一个每日定时推送群消息的工具。 易语言程序&#xff0c;附上源码与模块&#x…

【记录42】centos 7.6安装nginx教程详细教程

环境&#xff1a;腾讯云centos7.6 需求&#xff1a;安装nginx-1.24.0 1. 切入home文件 cd home 2. 创建nginx文件 mkdir nginx 3. 切入nginx文件 cd nginx 4. 下载nginx安装包 wget https://nginx.org/download/nginx-1.24.0.tar.gz 5. 解压安装包 tar -zxvf nginx-1.24.0.…

ESD静电问题 | 选型TVS单向还是双向?

【转自微信公众号&#xff1a;Amazing晶炎科技】

Mysql进阶-索引篇

Mysql进阶 存储引擎前言特点对比 索引介绍常见的索引结构索引分类索引语法sql分析索引使用原则索引失效的几种情况sql提示覆盖索引前缀索引索引设计原则 存储引擎 前言 Mysql的体系结构&#xff1a; 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接…

C语言例题38、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,最后留下来的是原来第几号人员?

#include <stdio.h> #define MAX_CALLER 3void main() {int j 0;int p_total;//人数int p_caller 0;//每3人循环计数&#xff1a;1,2,3int p_exit 0; //退出游戏的人数int people[255] {0};//参与游戏人员名单printf("请输入参与游戏人数&#xff1a;");s…

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

Macbook pnpm 安装 node-sass 报错(node-gyp)

换了 Macbook M3 Pro 后安装项目依赖时报错&#xff0c;提示 node-sass 安装出错。 &#xff08;此外&#xff0c;ValueError: invalid mode: rU while trying to load binding.gyp 也是类似原因。只需要确保 node-gyp 运行条件就可以&#xff09; 原因是 node-gyp 运行环境缺…

手写SpringBoot核心功能流程

本文通过手写模拟实现一个简易版的Spring Boot 程序&#xff0c;让大家能以非常简单的方式知道Spring Boot大概的工作流程。 工程依赖 创建maven工程&#xff0c;并创建两个module springboot模块&#xff1a;手写模拟springboot框架的源码实现 test模块&#xff1a;业务系统…

提升工作效率,用ONLYOFFICE打造高效团队协作环境

作为一名深耕技术领域已有六七年的开发者&#xff0c;同时又是断断续续进行技术创作将近六年的一个小小作者&#xff0c;我在工作和日常生活中&#xff0c;使用过各色各样的软件。 而在最近几年&#xff0c;一款名为ONLYOFFICE的开源办公套件逐渐走进并融入我的工作与生活&…

使用Vue连接Mqtt实现主题的订阅及消息发布

效果如下&#xff1a; 直接贴代码&#xff0c;本地创建一个html文件将以下内容贴入即可 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …

为什么职场关系越来越冷漠?

不知道从什么时候开始&#xff0c;我们的职场关系变得越来越冷漠了。 早上上班打卡的时候&#xff0c;一个个都低着头&#xff0c;眼神紧紧盯着手机&#xff0c;生怕错过什么重要的信息&#xff1b; 下班后大家一哄而散&#xff0c;各自抱着手机“享受”生活&#xff0c;谁也…

如何添加、编辑、调整WordPress菜单

我们最近在使用WordPress建站建设公司网站。我们是使用的hostease的主机产品建设的WordPress网站。在建设网站使用遇到了一些WordPress菜单使用方面的问题。好在hostease提供了不少帮助。 下面把WordPress菜单使用心得分享一下。 本文将详细介绍WordPress菜单的各种功能&#x…

Total Store Orderand(TSO) the x86 MemoryModel

一种广泛实现的内存一致性模型是总store顺序 (total store order, TSO)。 TSO 最早由 SPARC 引入&#xff0c;更重要的是&#xff0c;它似乎与广泛使用的 x86 架构的内存一致性模型相匹配。RISC-V 还支持 TSO 扩展 RVTSO&#xff0c;部分是为了帮助移植最初为 x86 或 SPARC 架…

1-3ARM_GD32点亮LED灯

简介&#xff1a; 最多可支持 112 个通用 I/O 引脚(GPIO)&#xff0c;分别为 PA0 ~ PA15&#xff0c;PB0 ~ PB15&#xff0c;PC0 ~ PC15&#xff0c;PD0 ~ PD15&#xff0c;PE0 ~ PE15&#xff0c;PF0 ~ PF15 和 PG0 ~ PG15&#xff0c;各片上设备用其来实现逻辑输入/输出功能。…
最新文章