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 -…

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

堆的实现 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。 首次用户 使用 …

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

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

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

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

在多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…

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…

在Mac上恢复SD卡数据的 6 个有效应用程序

慌&#xff01;SD卡里的照片和视频不小心删了&#xff0c;Mac设备上还恢复不了数据&#xff01; 遇到这种情况&#xff0c;你需要的是一款可靠的Mac适用的SD卡恢复软件。我们为你准备了一份最佳的SD卡恢复软件列表&#xff0c;并且还有详细的评论。另外&#xff0c;我们还会给…

FTP简介及搭建计算机端口的介绍

目录 一. FTP的简介 二. FTP的主要作用 三. 搭建FTP服务器 3.1 开启防火墙 3.2 创建组 3.3 创建用户 3.4 用户绑定组 3.5 安装FTP服务器 3.6 配置FTP服务器 3.7 配置FTP文件夹的权限 3.8 连接测试 3.8.1 服务器本机测试 3.8.2 外部服务器测试 3.8.3 借助工具MobalXterm 四…

让电脑变得更聪明——用python实现五子棋游戏

作为经典的棋类游戏&#xff0c;五子棋深受大众喜爱&#xff0c;但如果仅实现人与人的博弈&#xff0c;那程序很简单&#xff0c;如果要实现人机对战&#xff0c;教会计算机如何战胜人类&#xff0c;那就不是十分容易的事了。本文我们先从简单入手&#xff0c;完成五子棋游戏的…

DNS域名查询过程

目录 DNS&#xff08;Domain Names System&#xff09; 域名转IP IP转域名 域名 域名查询流程 浏览器DNS缓存 操作系统缓存 本地host文件 完整流程 递归查询 迭代查询 DNS&#xff08;Domain Names System&#xff09; 域名系统&#xff0c;将域名和 IP 地址进行转…

【Spring】AOP的AspectJ开发

AOP基础不了解可以阅读&#xff1a;【Spring】AOP原来如此-CSDN博客 AspectJ是一个居于JAVA开发的AOP框架 基于XML的声明式AspectJ 基于XML的声明式AspectJ是通过XML文件来定义切面&#xff0c;切入点及通知&#xff0c;所有的切面、切入点和通知必须定义在内&#xff0c; 元…

【SpringBoot】常用注解

RequestBody&#xff1a;自动将请求体中的 json 数据转换为实体类对象。 这个例子凑巧传入的json属性键名和User键名一致&#xff0c;可以直接使用User实体类对象&#xff0c;如果键名不一致则需要用一个Map 类接收参数&#xff1a; PutMapping("/update")public R…