Docker-多容器应用

一、概述

到目前为止,你一直在使用单个容器应用。但是,现在您将 MySQL 添加到 应用程序堆栈。经常会出现以下问题 - “MySQL将在哪里运行?将其安装在同一个 容器还是单独运行?一般来说,每个容器都应该做一件事,并且把它做好。以下是单独运行容器的几个原因:

  • 很有可能你必须以与数据库不同的方式扩展 API 和前端。
  • 通过单独的容器,可以单独对版本进行版本控制和更新。
  • 虽然您可以在本地使用数据库的容器,但您可能希望使用托管服务 用于生产中的数据库。然后,你不希望将数据库引擎与应用一起提供。
  • 运行多个进程将需要一个进程管理器(容器只启动一个进程),这增加了容器启动/关闭的复杂性。

还有更多原因。因此,如下图所示,最好在多个容器中运行应用。

Todo App 连接到 MySQL 容器

二、容器网络

请记住,默认情况下,容器是孤立运行的,对其他进程一无所知 或同一台机器上的容器。那么,如何允许一个容器与另一个容器通信呢?答案是 联网。如果将两个容器放在同一个网络上,它们可以相互通信。

三、启动 MySQL

有两种方法可以将容器放在网络上:

  • 启动容器时分配网络。
  • 将已运行的容器连接到网络。

在以下步骤中,你将首先创建网络,然后在启动时附加 MySQL 容器。

  1. 创建网络。

    <span style="background-color:#ffffff"><code class="language-console"><span style="color:#8f5902">$</span> docker network create todo-app
    </code></span>
  2. 启动 MySQL 容器并将其附加到网络。您还将定义一些环境变量,这些变量 database 将用于初始化数据库

     docker run -d \--network todo-app --network-alias mysql \-v todo-mysql-data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \-e MYSQL_DATABASE=todos \mysql:8.0

    在上一个命令中,您可以看到--network alias标志。在后面的部分中,您将了解有关此标志的更多信息。

    提示
    在上面的命令中,您会注意到一个名为todo-mysql-data的卷,它安装在/var/lib/mysql中,mysql就是在这里存储数据的。但是,您从未运行过docker volume create命令。Docker识别出您想要使用一个命名卷,并自动为您创建一个。

  3.   若要确认数据库已启动并运行,请连接到数据库并验证其是否已连接。
     docker exec -it <mysql-container-id> mysql -u root -p
    

    当出现密码提示时,键入secret。在MySQL外壳中,列出数据库并验证是否看到todos数据库。

    mysql> SHOW DATABASES;
    

    您应该看到如下输出:

    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | todos              |
    +--------------------+
    5 rows in set (0.00 sec)

    4. 退出MySQL shell以返回到您机器上的shell。

    mysql> exit

    现在您有了一个todos数据库,可以使用了。

四、连接到MySQL

既然你知道MySQL已经启动并运行了,你就可以使用它了。但是,你该如何使用它呢?如果在同一网络上运行另一个容器,如何找到该容器?请记住,每个容器都有自己的IP地址。 

为了回答上述问题并更好地理解容器网络,您将使用nicolaka/netshoot容器,该容器附带了许多工具,这些工具对解决或调试网络问题非常有用。

  1. 使用nicolaka/netshoot映像启动一个新容器。请确保将其连接到同一网络。
     docker run -it --network todo-app nicolaka/netshoot
    
    2.  在容器中,您将使用dig命令,这是一个有用的DNS工具。您将查找主机名mysql的IP地址。
     dig mysql

    您应该得到如下输出。

    ; <<>> DiG 9.18.8 <<>> mysql
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32162
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:
    ;mysql.				IN	A;; ANSWER SECTION:
    mysql.			600	IN	A	172.23.0.2;; Query time: 0 msec
    ;; SERVER: 127.0.0.11#53(127.0.0.11)
    ;; WHEN: Tue Oct 01 23:47:24 UTC 2019
    ;; MSG SIZE  rcvd: 44

    在“应答部分”中,您将看到mysql的一条A记录,解析为172.23.0.2(您的IP地址很可能有不同的值)。虽然mysql通常不是一个有效的主机名,但Docker能够将其解析为具有该网络别名的容器的IP地址。请记住,您之前使用了--network别名。
    这意味着你的应用程序只需要连接到一个名为mysql的主机,它就会与数据库对话。

五、使用 MySQL 运行应用使用 MySQL 运行应用

todo 应用程序支持设置一些环境变量来指定 MySQL 连接设置。他们是:

  • MYSQL_HOST- 正在运行的MySQL服务器的主机名
  • MYSQL_USER- 用于连接的用户名
  • MYSQL_PASSWORD- 用于连接的密码
  • MYSQL_DB- 连接后要使用的数据库

现在,您可以启动您的开发就绪容器:

  •  指定以前的每个环境变量,并将容器连接到应用程序网络。运行此命令时,请确保您位于“入门”应用程序目录中。 
docker run -dp 127.0.0.1:3000:3000 \-w /app -v "$(pwd):/app" \--network todo-app \-e MYSQL_HOST=mysql \-e MYSQL_USER=root \-e MYSQL_PASSWORD=secret \-e MYSQL_DB=todos \node:18-alpine \sh -c "yarn install && yarn run dev"
  • 如果您查看容器的日志(docker-logs-f<containerid>),您应该会看到类似于下面的消息,这表明它正在使用mysql数据库。

 

 nodemon src/index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] starting `node src/index.js`
Connected to mysql db at host mysql
Listening on port 3000
  • 在浏览器中打开应用程序,并将一些项目添加到待办事项列表中。
  • 连接到mysql数据库,并证明项目正在写入数据库。记住,密码是秘密的。
     docker exec -it <mysql-container-id> mysql -p todos
    

    mysql shell中,运行以下命令:

    mysql> select * from todo_items;
    +--------------------------------------+--------------------+-----------+
    | id                                   | name               | completed |
    +--------------------------------------+--------------------+-----------+
    | c906ff08-60e6-44e6-8f49-ed56a0853e85 | Do amazing things! |         0 |
    | 2912a79e-8486-4bc3-a4c5-460793a575ab | Be awesome!        |         0 |
    +--------------------------------------+--------------------+-----------+

    您的表看起来会有所不同,因为它有您的项目。但是,你应该看到它们被存放在那里。

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

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

相关文章

强化学习——简单解释

一、说明 最近 OpenAI 上关于 Q-star 的热议激起了我温习强化学习知识的兴趣。这是为强化学习 (RL) 新手提供的复习内容。 二、强化学习的定义 强化学习是人类和其他动物用来学习的学习类型。即&#xff0c;通过阅读房间来学习。&#xff08;从反馈中学习&#xff09;。让我解…

在C#中,PropertyInfo.SetValue方法用于设置属性值

在C#中&#xff0c;PropertyInfo.SetValue方法用于设置属性值。该方法接受两个参数&#xff1a;对象实例和属性值。下面是一个示例代码&#xff0c;演示如何使用PropertyInfo.SetValue方法设置属性值&#xff1a; using System; using System.Reflection; public class Per…

基于深度学习CRNN的水表读数识别系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着科技的不断发展&#xff0c;深度学习技术在各个领域都取得了显著的成果。其中&#xff0c;基于深度学习的图像识别技术在计算机视觉领域具有重要的应用价值。…

Linux环境搭建(Ubuntu22.04)+ 配置共享文件夹(Samba)

Linux开发环境准备 搭建Linux开发环境所需要的软件如下&#xff1a; VMware虚拟机&#xff1a;用于运行Linux操作系统的虚拟机软件之一&#xff0c;VMware下载安装在文章中不做说明&#xff0c;可自行百度谢谢Ubuntu光盘镜像&#xff1a;用于源代码编译&#xff0c;有闲置计算…

maven生命周期回顾

目录 文章目录 **目录**两种最常用打包方法&#xff1a;生命周期&#xff1a; 两种最常用打包方法&#xff1a; 1.先 clean&#xff0c;然后 package2.先 clean&#xff0c;然后install 生命周期&#xff1a; 根据maven生命周期&#xff0c;当你执行mvn install时&#xff0c…

大数据Hadoop-HDFS_架构、读写流程

大数据Hadoop-HDFS 基本系统架构 HDFS架构包含三个部分&#xff1a;NameNode&#xff0c;DataNode&#xff0c;Client。 NameNode&#xff1a;NameNode用于存储、生成文件系统的元数据。运行一个实例。 DataNode&#xff1a;DataNode用于存储实际的数据&#xff0c;将自己管理…

Python (二) 读写excel文件

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

妈妈和老婆掉进水里,孟子认为先救老婆是禽兽

妈妈和老婆同时掉进水里先救谁&#xff1f; 多数男人不敢回答&#xff0c;怕得罪老婆。孟子认为&#xff0c;必须先救妈妈。因为父母都照顾不好&#xff0c;是不孝。先救妈妈&#xff0c;再救老婆。 中国人的信仰是天&#xff0c;以及孔孟之道。中国人不信宗教。 孟子&#x…

【普中开发板】基于51单片机温度报警器设计( proteus仿真+程序+实物演示+讲解视频)

这里写目录标题 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 实物烧录和现象5. 程序代码6. 设计资料内容清单&&下载链接资料下载链接&#xff1a; 【普中开发板】基于51单片机温度报警器设计( proteus仿真程序实物演示讲解视频&#xff09; Proteus 仿真…

java-使用poi时报错Method org/apache/poi/xssf/usermodel/XSSFWorkbook.close()V is abst

报错信息1 AbstractMethodError: Method org/apache/poi/xssf/usermodel/XSSFWorkbook.close()V is abstract 解决&#xff1a;是因为poi 3.11才有close&#xff0c;升级pom文件的版本就可以了 报错信息2 Package should contain a content type part [M1.13] 报错信息3 tried…

求职招聘小程序源码系统 全开源源代码:找工作+招人才 平台级别运营版 附带完整的搭建教程

在当前的求职招聘市场中&#xff0c;尽管存在大量的求职者和招聘者&#xff0c;但依然存在着信息不对称、沟通不畅等问题。小编来给大家分享一款求职招聘小程序源码系统&#xff0c;旨在提供一个高效、便捷、安全的求职招聘平台。 以下是部分代码示例&#xff1a; 系统特色功能…

Java——正则表达式

1、什么是正则表达式 一个正则表达式&#xff0c;就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用&#xff0c;不过&#xff0c;经过练习后&#xff0c;就觉得这些复杂的表达式写起来还是相当简单的&#xff0c;而且&#xff0c;一…

vue3实现2d楼宇模型

需求背景解决效果视频效果2dFloor.vue 需求背景 需要实线一个2d楼宇模型&#xff0c;并按照租户温度渲染颜色 解决效果 视频效果 2dFloor.vue <!--/*** author: liuk* date: 2023/12/06* describe: 2d楼宇模型* CSDN:https://blog.csdn.net/hr_beginner?typeblog*/--&g…

7+衰老+分型+预后模型生信思路,没思路的同学们可参考

今天给同学们分享一篇生信文章“Identification and validation of a novel senescence-related biomarker for thyroid cancer to predict the prognosis and immunotherapy”&#xff0c;这篇文章发表在Front Immunol期刊上&#xff0c;影响因子为7.3。 结果解读&#xff1a;…

vue3 print ts打印组件

依赖安装 npm install vue3-print-ts 全局注入 import { createApp } from vue import App from ./App.vue import Print from vue3-print-tsconst app createApp(App) app.directive("print", Print) 页面使用&#xff08;element plus ui 例子&#xff09; &…

STM32CubeIDE的stm32f4xx_hal_conf.h配置文件的一点功能解释

STM32CubeIDE的程序功能写多了&#xff0c;一般不愿意再次使用.ioc这个配置工程的底层了&#xff0c;因为有部分程序是直接改配置的&#xff0c;一旦再次生成就会冲掉自己改的部分&#xff0c;因为不能自己定义 /* USER CODE BEGIN 1 *//* USER CODE END 1 */这样的不被重新生成…

Django大回顾 - 8 中间件、csrf认证相关

【1】中间件 中间件是什么&#xff1f; 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&#xff0c;所以需要谨慎实用&#xff0c;用不好会影响到性能…

docker镜像管理,仓库管理基本命令

镜像管理 搜索镜像 语法&#xff1a; docker search 镜像名 [-f stars100] [rootlocalhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx …

React Node.js 和 Prisma 构建全栈框架

特点 快速入门&#xff1a;由于其表现力强&#xff0c;您可以使用很少的简洁、一致的声明性代码从头开始创建和部署生产就绪的 Web 应用程序。无样板代码&#xff1a;通过抽象出复杂的全栈功能&#xff0c;可以减少样板代码。这意味着需要维护和理解的代码更少&#xff01;这也…

用100ask 6ull配合 飞凌 elf1的教程进行学习的记录 - ap3216

100ask板子 不用改 ap3216.c "ap3216creg.h" 添加到drivers/misc 从这抄的: https://gitee.com/flameboyence/linux_driver_example/tree/master/22_i2c #include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #includ…