Docker的一个简单例子(一)

文章目录

  • 环境
  • 示例
    • 准备
    • 构建
    • 启动/停止容器
    • 更新应用
    • 分享应用
  • 参考

环境

  • RHEL 9.3
  • Docker Community 24.0.7

示例

准备

从github克隆 getting-started-app 项目:

git clone https://github.com/docker/getting-started-app.git

查看项目:

➜  getting-started-app git:(main) tree
.
├── package.json
├── README.md
├── spec
│   ├── persistence
│   │   └── sqlite.spec.js
│   └── routes
│       ├── addItem.spec.js
│       ├── deleteItem.spec.js
│       ├── getItems.spec.js
│       └── updateItem.spec.js
├── src
│   ├── index.js
│   ├── persistence
│   │   ├── index.js
│   │   ├── mysql.js
│   │   └── sqlite.js
│   ├── routes
│   │   ├── addItem.js
│   │   ├── deleteItem.js
│   │   ├── getItems.js
│   │   └── updateItem.js
│   └── static
│       ├── css
│       │   ├── bootstrap.min.css
│       │   ├── font-awesome
│       │   │   ├── all.min.css
│       │   │   ├── fa-brands-400.eot
│       │   │   ├── fa-brands-400.svg#fontawesome
│       │   │   ├── fa-brands-400.ttf
│       │   │   ├── fa-brands-400.woff
│       │   │   ├── fa-brands-400.woff2
│       │   │   ├── fa-regular-400.eot
│       │   │   ├── fa-regular-400.svg#fontawesome
│       │   │   ├── fa-regular-400.ttf
│       │   │   ├── fa-regular-400.woff
│       │   │   ├── fa-regular-400.woff2
│       │   │   ├── fa-solid-900.eot
│       │   │   ├── fa-solid-900.svg#fontawesome
│       │   │   ├── fa-solid-900.ttf
│       │   │   ├── fa-solid-900.woff
│       │   │   └── fa-solid-900.woff2
│       │   └── styles.css
│       ├── index.html
│       └── js
│           ├── app.js
│           ├── babel.min.js
│           ├── react-bootstrap.js
│           ├── react-dom.production.min.js
│           └── react.production.min.js
└── yarn.lock

10 directories, 40 files

构建

在项目根目录下,创建 Dockerfile 文件如下:

# syntax=docker/dockerfile:1

FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

其中:

  • # syntax=docker/dockerfile:1 :指定语法
  • FROM node:18-alpine :指定base image
  • WORKDIR /app :指定容器里的当前目录
  • COPY . . :从宿主机复制文件/目录到容器里
  • RUN yarn install --production :在容器里运行命令
  • CMD ["node", "src/index.js"] :在启动容器时,默认运行的命令,注意不是构建时运行
  • EXPOSE 3000 :开放端口

构建:

docker build -t getting-started .

其中:

  • -t :给image添加名字和tag,其格式为 -t <name:tag> ,其中,tag是可选的,其默认值是 latest
  • .Dockerfile 的路径

查看image:

➜  getting-started-app git:(main) ✗ docker images "get*"
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
getting-started   latest    a6895c5f1a96   28 minutes ago   223MB

启动/停止容器

docker run -dp 127.0.0.1:3000:3000 getting-started
  • -d --detach :在后台运行容器
  • -p --publish :宿主机和容器之间的端口映射,格式为 <host>:<container>
    • host :宿主机地址
    • container :容器端口

查看容器:

➜  getting-started-app git:(main) ✗ docker ps  
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                      NAMES
d893e30dba55   getting-started   "docker-entrypoint.s…"   36 minutes ago   Up 36 minutes   127.0.0.1:3000->3000/tcp   crazy_wiles

打开浏览器,访问 http://localhost:3000

在这里插入图片描述

注意:只能用 http://localhost:3000 或者 http://127.0.0.1:3000 访问,不能用IP地址 http://192.168.1.128:3000 访问,也不能在其它机器用 http://192.168.1.128:3000 访问,因为设置了只有网络回环有效。若想在别的机器也能访问,需要设置为 -p 0.0.0.0:3000:3000

添加一些item,如下:

在这里插入图片描述

停止容器:

docker stop <container ID>

现在,用 docker ps 命令看不到该容器了,不过 docker ps -a 还能看到:

➜  getting-started-app git:(main) ✗ docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS                          PORTS     NAMES
d893e30dba55   getting-started          "docker-entrypoint.s…"   46 minutes ago   Exited (0) About a minute ago             crazy_wiles
......

删除容器:

docker rm <container ID>

现在用 docker ps -a 命令也看不到该容器了。

更新应用

假设现在源代码有了一些修改,比如打开 src/static/js/app.js 文件,找到下面这一行代码:

                <p className="text-center">No items yet! Add one above!</p>

将其修改为:

                <p className="text-center">You have no todo items yet! Add one above!</p>

保存退出,然后重新构建:

docker build -t getting-started .

启动容器:

docker run -dp 127.0.0.1:3000:3000 getting-started

注意:如果刚才的旧容器仍然在运行,则需要先把旧容器停止,否则这一步会失败,因为3000端口被占用了。

打开浏览器,访问 http://localhost:3000

在这里插入图片描述

可见,修改已经生效了。

分享应用

可以把构建好的image push到registry。

打开 http://hub.docker.com ,登录:

在这里插入图片描述

点击“Create repository”按钮:

在这里插入图片描述

在Repository Name处输入 getting-started ,然后点击“Create”按钮:

在这里插入图片描述

现在,repository就创建好了:

在这里插入图片描述
如图上所示,可用以下命令把本地image push到repository:

docker tag <image>:<tag> <new-repo>:<tag>
docker push <new-repo>:<tag>

现在,我们来push一下试试。

首先要在命令行登录Docker Hub:

docker login -u <ID>

按提示输入密码。

注:并没有指定registry,默认值就是Docker Hub。

查看本地image:

➜  getting-started-app git:(main) ✗ docker images "get*"
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
getting-started   latest    a89b3880eee8   36 minutes ago   223MB

通过 docker tag 命令,打上正确的tag:

docker tag getting-started <ID>/getting-started

注:没有指定tag,默认是 latest

然后再查看本地image:

➜  getting-started-app git:(main) ✗ docker images         
REPOSITORY                 TAG       IMAGE ID       CREATED             SIZE
kaiding1/getting-started   latest    a89b3880eee8   39 minutes ago      223MB
getting-started            latest    a89b3880eee8   39 minutes ago      223MB
......

现在,我们就可以push image了:

docker push <ID>/getting-started

接下来,我们使用 Play with Docker 来测试一下刚刚push的image。

打开浏览器,访问 http://play-with-docker.com

在这里插入图片描述

点击“Login”按钮,选择“Docker”,弹出登录页面,输入Docker Hub的用户名和密码。

进入主界面后,点击左边的“ADD NEW INSTANCE”,在右边会出现一个终端。如下图所示:

在这里插入图片描述
在终端里,启动刚才push的image:

docker run -dp 0.0.0.0:3000:3000 <ID>/getting-started

在这里插入图片描述

接下来,点击页面上的“OPEN PORT”按钮,输入“3000”,或者直接点击页面上的“3000”链接,会打开一个新页面:

在这里插入图片描述
至此,我们在一个全新的环境上部署了刚刚push的image,测试其工作正常。

参考

  • https://docs.docker.com/get-started/

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

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

相关文章

vue-springboot基于JavaWeb的家装一体化商城平台guptn

针对用户需求开发与设计&#xff0c;该技术尤其在各行业领域发挥了巨大的作用&#xff0c;有效地促进了家装一体化的发展。然而&#xff0c;由于用户量和需求量的增加&#xff0c;信息过载等问题暴露出来&#xff0c;为改善传统线下管理中的不足&#xff0c;本文将提出一套基于…

vue写了这么久了你对slot的理解是什么?slot使用场景有哪些?

一、slot是什么 在HTML中 slot 元素 &#xff0c;作为 Web Components 技术套件的一部分&#xff0c;是Web组件内的一个占位符 该占位符可以在后期使用自己的标记语言填充 举个栗子 <template id"element-details-template"><slot name"element-na…

2023-12-25 LeetCode每日一题(不浪费原料的汉堡制作方案)

2023-12-25每日一题 一、题目编号 1276. 不浪费原料的汉堡制作方案二、题目链接 点击跳转到题目位置 三、题目描述 圣诞活动预热开始啦&#xff0c;汉堡店推出了全新的汉堡套餐。为了避免浪费原料&#xff0c;请你帮他们制定合适的制作计划。 给你两个整数 tomatoSlices …

【网络面试(1)】浏览器如何实现生成HTTP消息

我们经常会使用浏览器访问各种网站&#xff0c;获取各种信息&#xff0c;帮助解决工作生活中的问题。那你知道&#xff0c;浏览器是怎么帮助我们实现对web服务器的访问&#xff0c;并返回给我们想要的信息呢&#xff1f; 1. 浏览器生成HTTP消息 我们平时使用的浏览器有很多种&…

osg::DrawElements*系列函数及GL_QUAD_STRIP、GL_QUADS绘制四边形效率对比

目录 1. 前言 2. osg::DrawElements*系列函数用法说明 3. GL_QUADS、GL_QUAD_STRIP用法及不同点 4. 效率对比 5. 总结 6. 参考资料 1. 前言 利用osg绘制图元&#xff0c;如&#xff1a;三角形、四边形等&#xff0c;一般用osg::PrimitiveSet类。其派生出了很多子类&#…

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测预测效…

Spring Cloud Gateway集成Knife4j

1、前提 网关路由能够正常工作。 案例 基于 Spring Cloud Gateway Nacos 实现动态路由拓展的参考地址&#xff1a;Spring Cloud Gateway Nacos 实现动态路由 详细官网案例&#xff1a;https://doc.xiaominfo.com/docs/middleware-sources/spring-cloud-gateway/spring-gatewa…

【快速全面掌握 WAMPServer】10.HTTP2.0时代,让 WampServer 开启 SSL 吧!

网管小贾 / sysadm.cc 如今的互联网就是个看脸的时代&#xff0c;颜值似乎成了一切&#xff01; 不信&#xff1f;看看那些直播带货的就知道了&#xff0c;颜值与出货量绝对成正比&#xff01; 而相对于 HTTP 来说&#xff0c;HTTPS 绝对算得上是高颜值的帅哥&#xff0c;即安…

08-接口文档管理工具-项目集成knife4j__ev

2、knife4j快速入门 2.1 knife4j介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! gitee地址&#xff1a;knife4j: Knife4j是一个集Swagger2 和 OpenAPI3为一体的增…

挥别2023,喜迎2024,我在CSDN赚了15000+F

Hello小伙伴们&#xff0c;大家好&#xff0c;我是 还是大剑师兰特&#xff0c; 今天是2024年的1月1日&#xff0c;首先祝大家元旦快乐&#xff01; 文章目录 不平凡的20232023博客之星&#xff0c;年度第63名6月份城市之星&#xff0c;北京第11名2023年末&#xff0c;互动总成…

机器人中的数值优化之线性共轭梯度法

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 本文ppt来自深蓝学院《机器人中的数值优化》 目录 1.无约束优化方法对比 2.Hessian-vec product 3.线性共轭梯度方法的步长​编辑 4.共轭梯度…

付费进群系统源码带定位完整独立版(12月30日)再次修复首发

搭建教程 nginx1.2 php5.6–7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;shujuku.sql&#xff09; 第三步修改/config/database.php里面的数据库地址 第四步修改/config/extra/ip.php里面的域名 第四步设置伪静态thinkphp 总后台账号&…

OpenCV实战 -- 维生素药片的检测记数

文章目录 检测记数原图经过操作开始进行消除粘连性--形态学变换总结实现方法1. 读取图片&#xff1a;2. 形态学处理&#xff1a;3. 二值化&#xff1a;4. 提取轮廓&#xff1a;5. 轮廓筛选和计数&#xff1a; 分水岭算法&#xff1a;逐行解释在基于距离变换的分水岭算法中&…

智慧园区物联综合管理平台之架构简述

总体架构 系统总体划分为物联感知系统层、 核心平台层、 综合运营服务平台和展示层四部分。 物联感知系统层 物联感知系统主要是支撑园区智能化运行的各子系统, 包括门禁系统、 视频监控系统、 车辆管理系统等。 核心平台层 核心平台层包括: 园区物联综合管理平台和园区…

PyTorch的Tensor(张量)

一、Tensor概念 什么是张量&#xff1f; 张量是一个多维数组&#xff0c;它是标量、向量、矩阵的高维拓展 Tensor与Variable Variable是torch.autograd中的数据类型&#xff0c;主要用于封装Tensor&#xff0c;进行自动求导。 data: 被包装的Tensorgrad: data的梯度&…

【Spring Security】快速入门之案例实操

目录 一、简介 1、什么是安全框架 2、主流的安全框架 3、为什么使用Spring Security 二、引言 1、什么是Spring Security 2、Spring Security工作原理 3、特点 三、快速入门 1、引入依赖 2、配置 3、启动测试 4、配置自定义账号密码 四、Web安全配置类 1.HttpSe…

【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS &…

ACES 增强版不丹水稻作物地图(2016-2022 年)

ACES 增强版不丹水稻作物地图&#xff08;2016-2022 年&#xff09; 用于改善粮食安全决策的 2016-2022 年年度作物类型稻米地图仍然是不丹的一项挑战。这些地图是与不丹农业部和 SERVIR 合作开发的。通过专注于发展不丹的科学、技术、工程和数学 (STEM)&#xff0c;我们共同开…

【瞎折腾/3D】无父物体下物体的旋转与移动

目录 说在前面移动World SpaceLocal Space 旋转World SpaceLocal Space 代码 说在前面 测试环境&#xff1a;Microsoft Edge 120.0.2210.91three.js版本&#xff1a;0.160.0其他&#xff1a;本篇文章中只探讨了无父对象下的移动与旋转&#xff0c;有父对象的情况将在下篇文章中…

Oracle merge into 语句用法 Oracle merge into 批量更新 关联更新 批量修改 关联修改

Oracle merge into 语句用法 Oracle merge into 批量更新 关联更新 批量修改 关联修改 一、概述 在开发任务中&#xff0c;遇到一个需求&#xff0c;同一批次的名单&#xff1b;根据一定的条件判断是否存在&#xff0c;若存在&#xff0c;则进行更新操作&#xff1b;若不存在&a…
最新文章