Docker-多容器应用

news2025/1/23 13:02:02

一、概述

到目前为止,你一直在使用单个容器应用。但是,现在您将 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.coloradmin.cn/o/1289841.html

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

相关文章

浅析基于云的DNS管理与负载均衡技术

伴随企业越来越多地实现应用部署的自动化&#xff0c;他们需要快速、智能的负载均衡&#xff0c;从而支持整个数据中心和云环境的应用要求&#xff0c;保证应用可用性。当聊到到具体实现方式时&#xff0c;DNS负载均衡无疑是其中的重要方法。DNS负载均衡为何在当下如此重要&…

2024年十大最好猫罐头有哪些?2024年10款最好的猫罐头盘点

我发现不少人有这样的困扰&#xff01;买到各种数值都很好的猫罐头后&#xff0c;猫咪一点都不吃。或者是猫咪吃了猫罐头之后&#xff0c;吃了一段时间后就软便身体不舒服。 通过本文&#xff0c;我将与大家盘点2024年10款最好的猫罐头&#xff0c;并提供一些选购猫罐头的小妙招…

基于ssm的网上花店设计论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此鲜花销售信息的…

HarmonyOS学习--创建和运行Hello World

创建和运行Hello World 打开DevEco Studio&#xff0c;在欢迎页单击Create Project&#xff0c;创建一个新工程。根据工程创建向导&#xff0c;选择创建Application应用或Atomic Service元服务。选择“Empty Ability”模板&#xff0c;然后单击Next。关于工程模板的介绍和支持…

[Linux] nginx编译安装及系统服务添加

一、nginx 介绍 nginx和apache一样都是提供web网页服务的。 Nginx&#xff1a; Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器&#xff0c;而且支持热部署&#xff0c;几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还…

第三方组件自定义扫描规则

第三方例如dubbo自定义扫描组件规则方式注入进容器。例如DubboService注解的类注入进容器中&#xff0c;实现ImportBeanDefinitionRegistrar接口&#xff0c;并通过Import注解注入。 Import除了注入ImportBeanDefinitionRegistrar类&#xff0c;还可以注入配置类Configuration和…

网络安全威胁——跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;通常称为XSS&#xff09;&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;在线论坛、博客、留言板等共享…

Leetcode刷题笔记题解(C++):92. 反转链表 II

思路&#xff1a;获取要反转的区间&#xff0c;拆开之后进行反转再拼接 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

《当代家庭教育》期刊论文投稿发表简介

《当代家庭教育》杂志是家庭的参谋和助手&#xff0c;社会的桥梁和纽带&#xff0c;人生的伴侣和知音&#xff0c;事业的良师益友。 国家新闻出版总署批准的正规省级教育类G4期刊&#xff0c;知网、维普期刊网收录。安排基础教育相关稿件&#xff0c;适用于评职称时的论文发表…

Java利用TCP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为聊天。然后创建包&#xff0c;创建两个类&#xff0c;客户端&#xff08;SocketClient&#xff09;和服务器端&#xff08;SocketServer&#xff09; 二、实现代码 客户端代码&#xff1a; package 聊天; import ja…

算法训练 第十周

一、图书整理 II 1.两个栈 将一个栈当作输入栈&#xff0c;用于压入 appendTail 传入的数据&#xff1b;另一个栈当作输出栈&#xff0c;用于 deleteHead操作。每次 deleteHead 时&#xff0c;若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈&#xff0c;这样输出栈从栈…

五大编程实用工具推荐,全都是干货!持续更新...

编程实用工具推荐 1. Sublime Text 官网&#xff1a;https://www.sublimetext.com/ Sublime Text 是一款流行的跨平台文本编辑器。 它受到广大开发者和程序员的欢迎&#xff0c;具有轻量级、高度可定制和强大的功能。 以下是 Sublime Text 的一些主要特点&#xff1a; 1. 多平台…

Linux:dockerfile编写搭建nginx练习(8)

dockerfile是创建镜像的一种&#xff0c;通过已有镜像的基础上再在上面部署一些别的。 在这个基础镜像上搭建&#xff0c;我这个是一个空的centos镜像 我这里用http的yum仓库存放了nginx和rpm包 创建dockerfile vim Dockerfile写入#设置基础镜像 FROM centos#维护该镜像的用户…

虚拟机配置网络(这里以centos为例)

①、点击“编辑”里面的“虚拟网络编辑器”,取消勾选DHCP服务将IP地址分配给虚拟机。 2.点击nat设置&#xff0c;看看对应的子网ip和网关地址还有子网掩码&#xff0c;然后在安装虚拟机生成的vmware8适配器配置中配置和刚刚nat配置中一样的配置 3&#xff0c;然后和第二部一样…

Linux下Python调用C语言

一&#xff1a;Python调用C语言场景 1&#xff0c;已经写好的C语言代码&#xff0c;不容易用Python实现&#xff0c;想直接通过Python调用写好的C语言代码 2&#xff0c;C比Python快&#xff08;只是从语言层面&#xff0c;不能绝对说C程序就是比Python快&#xff09; 3&…

win10下装ubuntu双系统(免U盘)

系统环境&#xff1a; win10系统&#xff0c;工具&#xff0c; 1.EasyBCD&#xff0c;建议2.2以上版本 2.Ubuntu 18.04 系统。当然你也可以下载别的版本&#xff0c;这个不重要。Ubuntu官网下载地址 步骤&#xff1a; 1.桌面右键我的电脑&#xff0c;点击管理->磁盘管理 …

HashMap系列-放入元素的流程

1.put public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {//通过key生成hash后&#xff0c;调用putVal方法public V put(K key, V value) {return putVal(hash(key), key, value, false, true);} } 2.put…

第二十一章 网络通信

网络通信这一章 基本分为三个部分 网络基础概念和TCP,UDP这三个部分主要如下&#xff1a; 计算机网络实现了堕胎计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#x…

代码随想Day24 | 回溯法模板、77. 组合

理论基础 回溯法和递归不可分割&#xff0c;回溯法是一种穷举的方法&#xff0c;通常需要剪枝来降低复杂度。回溯法有一个选择并退回的过程&#xff0c;可以抽象为树结构&#xff0c;回溯法的模板如下&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}…

【从0配置JAVA项目相关环境1】jdk + VSCode运行java + mysql + Navicat + 数据库本地化 + 启动java项目

从0配置JAVA项目相关环境 写在最前面一、安装Java的jdk环境1. 下载jdk2. 配置jdk3. 配置环境变量 二、在vscode中配置java运行环境1. 下载VSCode2. 下载并运行「Java Extension Pack」 三、安装mysql1.官网下载MySQL2.开始安装如果没有跳过安装成功 3.配置MySQL Server4.环境变…