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.lock10 directories, 40 files

构建

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

# syntax=docker/dockerfile:1FROM 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.mzph.cn/news/589358.shtml

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

相关文章

I.MX8QM flexcan移植

Android SDK&#xff1a;imx8_13.0.0_1.2.0(android 13 u-boot 2022.04 kernel 5.15.74) 一、kernel 内核配置&#xff1a; # 相应的defconfig中添加使能下面两个宏。 # 官方默认的配置可能是以模块的方式编译&#xff0c;这里直接将can驱动编译到内核中 CONFIG_CANy CONFIG…

C++面试宝典第12题:数组元素相除

题目 从控制台输入若干个整数作为数组,将数组中每一个元素除以第一个元素的结果,作为新的数组元素值。比如:可以先输入3,作为数组元素的个数;然后输入3个整数,作为数组元素的值。 解析 这道题本身并不复杂,但里面隐藏了不少“坑点”和“雷区”,主要考察应聘者全面思考问…

vue项目中实现预览pdf

vue项目中实现预览pdf 1. iframe <iframe :src"pdfSrc"></iframe> ​data() {return {pdfSrc: http://192.168.0.254:19000/trend/2023/12/27/5635529375174c7798b5fabc22cbec45.pdf,}},​iframe {width: 100%;height: calc(100vh - 132px - 2 * 20px -…

MATLAB --- interp1( )函数的用法

interp1() 是 MATLAB 中用于一维插值的函数&#xff0c; 它可以根据给定的数据点进行插值&#xff0c;从而在给定的插值点处估计函数的值 下面是 interp1() 函数的用法&#xff1a; Vq interp1(X, V, Xq) Vq interp1(X, V, Xq, method) Vq interp1(X, V, Xq, method, extr…

数据结构:堆的三部曲 (一)堆的实现

堆的实现 1.堆的结构1.1堆的定义理解 2.堆的实现&#xff08;以小根堆为例&#xff09;2.1 堆结构体的定义2.2 堆的插入交换函数向上调整算法插入函数的代码 2.3 堆的删除向下调整算法&#xff1a;删除函数的代码&#xff1a; 2.4其他操作 3.测试以及完整源代码实现3.1测试代码…

typore自定义删除线快捷键

打开高级设置 设置快捷键 重新打开typore

Java实现短信发送业务

1、业务需求 发送短信功能是一个很普遍的需求&#xff0c;比如验证码&#xff0c;快递单号&#xff0c;通知信息一类。 而在Java中实现短信功能相对简单&#xff0c;只需要调用短信服务商提供的API。接下来以阿里云为例&#xff0c;介绍如何实现短信发送功能&#xff0c;其他短…

x-cmd pkg | bat - cat 命令的现代化替代品

目录 简介首次用户功能特点进一步阅读 简介 bat 是 cat 命令的替代品&#xff0c;对 cat 命令进行功能扩展&#xff0c;如语法高亮、自动分页等&#xff0c;为用户提供更友好的显示和定制选项。对于需要在终端频繁查看文本内容的用户&#xff0c;推荐用 bat。 首次用户 使用 …

xinference

xinference Xorbits Inference&#xff08;xinference&#xff09;是一个性能强大且功能全面的分布式推理框架。可用于大语言模型&#xff08;LLM&#xff09;&#xff0c;语音识别模型&#xff0c;多模态模型等各种模型的推理。通过 Xorbits Inference&#xff0c;你可以轻松地…

计算机基础面试题 |01.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

linux 休眠唤醒中设备、总线、用户进程、内核线程调试分析流程

一、suspending consoles打印 代码位置&#xff1a;Kernel/power/suspend.c 函数调用流程&#xff1a;devices_and_enter(suspend_state_t state) --> suspend_console(); void suspend_console(void) { if (!console_suspend_enabled) 注释这一行&#xff0c;可以看到…

企业级依赖管理: 深入解读 Maven BOM

一、背景 当开发者在一个大型项目中使用 Maven 进行依赖管理时&#xff0c;项目往往会包含多个模块或子项目&#xff0c;并且这些模块会共享相同的依赖项。但是&#xff0c;不同模块可能会独立地指定各自的依赖版本&#xff0c;这可能导致以下问题&#xff1a; 依赖版本不一致…

头歌:实验十六 matplotlib数据可视化

第1关 各省gdp的和生成条状图 import pandas import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt matplotlib.rcParams[font.family]SimHei matplotlib.rcParams[font.sans-serif] [SimHei] datapandas.read_excel("test/各省GDP.xlsx",dtype…

在多Module项目中,给IDEA底部选项卡区域添加Services选项卡

一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时&#xff0c;如果要调试测需要依次启动各个项目比较麻烦。 idea其实提供了各module的启动管理工具了&#xff0c;可以快速启动和关闭各个服务&#xff0c;也能批量操作&#xff0c;比如一次…

25. 数组作为函数参数

写代码时&#xff0c;我们会将数组作为参数传给函数 冒泡排序&#xff1a; 两两相邻的元素进行比较&#xff0c;可能的话进行交换 一趟冒泡排序会将一个元素放在其最后应该在的位置 10个数字只需9趟&#xff0c;第一趟10个数字待排序&#xff0c;9对比较&#xff1b;第二趟…

计算机科学速成课【学习笔记】(1)——计算机早期历史

本集课程B站链接&#xff1a; 【计算机科学速成课】[40集全/精校] - Crash Course Computer Science_哔哩哔哩_bilibili【计算机科学速成课】[40集全/精校] - Crash Course Computer Science共计40条视频&#xff0c;包括&#xff1a;1. 计算机早期历史-Early Computing、2. 电…

【2024最新版】neo4j安装配置

neo4j安装 写在最前面下载配置环境&#xff08;还是不行&#xff1f;&#xff09;启动neo4jpython中调用 写在最前面 之前我安装过&#xff0c;还写了一篇笔记 结果意外发现没有了&#xff0c;而且和之前安装的步骤不一样了&#xff0c;因此再次记录安装过程 下载 https://ne…

vue3安装vue-json-viewer实现json格式化

一、安装插件 直接看效果&#xff1a;json格式化 安装版本不宜过旧也不宜过新&#xff0c;针对vue3安装这个版本即可 yarn add vue-json-viewer;"dependencies": {"vue-json-viewer": "3",}, 二、使用插件 <script> import JsonViewe…

Vue中的keep-alive缓存组件的理解

<keep-alive> 是一个抽象组件&#xff0c;用于将其内部的组件保留在内存中&#xff0c;而不会重新渲染。这意味着当组件在<keep-alive> 内部切换时&#xff0c;其状态将被保留&#xff0c;而不是被销毁和重新创建。 <keep-alive>用来缓存不经常变化的组件&am…

HLS 2017.4 导出 RTL 报错:ERROR: [IMPL 213-28] Failed to generate IP.

软件版本&#xff1a;HLS 2017.4 在使用 HLS 导出 RTL 的过程中产生如下错误&#xff1a; 参考 Xilinx 解决方案&#xff1a;https://support.xilinx.com/s/article/76960?languageen_US 问题描述 DESCRIPTION As of January 1st 2022, the export_ip command used by Vivad…