服务器从零开始(2D)-Docker+Tomcat+Nginx+MySQL
本篇文章向大家介绍《服务器从零开始(2D)-Docker+Tomcat+Nginx+MySQL》,主要包括MySQL、docker、Linux、nginx、tomcat,具有一定的参考价值,需要的朋友可以参考一下。
简介
对于企业应用架构来说,肯定不局限于一台服务器,按照我的设想:至少一台部署后台接口的服务器;一台部署前端页面的服务器;一台做代理的服务器;一台装载数据库的服务器等等,这还不包括对某些应用做负载均衡。
可是慷慨的许姓朋友只能赞助我一台服务器,这时候我就想到了Docker。只要我多开几个容器,就能模拟分出多个服务器,对应多个IP。
所以本章首先是讲解安装Docker,其次是一一示例如何在Docker容器中安装配置Nginx、Tomcat和MySQL。原计划数据库使用Oracle,但是由于服务器配置太低,每次Oracle容器运行起来后都会导致服务器宕机,所以不得不改为MySQL。
由于考虑到Docker容器每次重启都会从镜像中初始化,文章中会大量使用到挂载,具体原理最后章节会讲。
Docker安装
1、使用uname -r 查看系统内核,Docker 要求CentOS系统的内核版本高于 3.10
[root@VM_60_202_centos ~]# uname -r 3.10.0-862.9.1.el7.x86_64
2、做好准备,确认yum更新到最新,没有安装过旧版本Docker
[root@VM_60_202_centos ~]# yum update --最新版yum包
[root@VM_60_202_centos ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine docker.io
--删除旧版本Docker
3、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
[root@VM_60_202_centos ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
4、最新版本的 Docker 分两个版本,docker-ce(Community Edition)和docker-ee(Enterprise Edition)。CE版本是免费的,如果我们学习或者一般应用,CE足够。我们安装社区版。下面可以设置数据源仓库,可以选用Docker官方数据源或者阿里云数据源:
[root@VM_60_202_centos ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo --添加官方数据源 [root@VM_60_202_centos ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo --添加阿里云数据源
5、安装Docker
[root@VM_60_202_centos ~]# yum list docker-ce --showduplicates | sort -r --列出可以安装的docker版本 [root@VM_60_202_centos ~]# yum install docker-ce --下载最新版本 [root@VM_60_202_centos ~]# yum install -y docker-ce-18.03.1.ce-1.el7.centos --安装指定版本
6、启动Docker
[root@VM_60_202_centos ~]# systemctl start docker --启动 [root@VM_60_202_centos ~]# systemctl stop docker --关闭 [root@VM_60_202_centos ~]# systemctl restart docker --重启
7、验证安装情况
[root@VM_60_202_centos ~]# docker --version --查看安装的docker版本 [root@VM_60_202_centos ~]# docker run hello-world
Tomcat容器
1、从数据源中查找Tomcat镜像。一般下载官方的镜像Starts最高的那个。
[root@VM_60_202_centos ~]# docker search tomcat --查询tomcat官方镜像 [root@VM_60_202_centos ~]# docker pull tomcat --下载下来其中的名为“tomcat”的镜像 [root@VM_60_202_centos ~]# docker images --查看本地所有的镜像

2、宿主机创建挂载目录,启动Tomcat容器
[root@VM_60_202_centos ~]# mkdir -p /u01/tomcat/webapps/tomcat1 --创建目录/u01/tomcat/webapps/tomcat1,用于挂载Tomcat的 [root@VM_60_202_centos ~]# mkdir -p /u01/tomcat/webapps/tomcat2 --创建目录/u01/tomcat/webapps/tomcat2,用于挂载Tomcat的 --并分别在/u01/tomcat/webapps/tomcat1和/u01/tomcat/webapps/tomcat2中放置已经准备好的不同的war包(虽然都是kerryNginxServlet.war,但内容不同) [root@VM_60_202_centos ~]# docker run --name=my_tomcat1 -v /u01/tomcat/webapps/tomcat1:/usr/local/tomcat/webapps -p 8001:8080 -d tomcat --启动一个Tomcat容器,命名为my_tomcat1;将容器的8080端口映射到宿主机的8001 --将宿主机的/u01/tomcat/webapps/tomcat1 目录挂载到容器上的/usr/local/tomcat/webapps 目录 [root@VM_60_202_centos ~]# docker run --name=my_tomcat2 -v /u01/tomcat/webapps/tomcat2:/usr/local/tomcat/webapps -p 8002:8080 -d tomcat --再运行一个Tomcat容器,命名my_tomcat2,用于做负载均衡
3、验证Tomcat容器
[root@VM_60_202_centos ~]# curl http://localhost:8001/kerryNginxServlet/servletA <h2> hello I am Kerry!</h2><h1>This is the servlet test A!</h1> [root@VM_60_202_centos ~]# curl http://localhost:8002/kerryNginxServlet/servletA <h2> hello I am Kerry!</h2><h1>This is the servlet test B!</h1>
Nginx容器
1、同样,从数据源中查找Nginx镜像。一般下载官方的镜像Starts最高的那个。
[root@VM_60_202_centos ~]# docker search nginx --查询nginx官方镜像 [root@VM_60_202_centos ~]# docker pull nginx --下载下来其中的名为“nginx”的镜像 [root@VM_60_202_centos ~]# docker images --查看本地所有的镜像

2、宿主机创建挂载目录,编辑配置文件
[root@VM_60_202_centos ~]# mkdir -p /u01/nginx [root@VM_60_202_centos ~]# mkdir -p /u01/nginx/conf.d [root@VM_60_202_centos ~]# touch /u01/nginx/nginx.conf [root@VM_60_202_centos ~]# touch /u01/nginx/conf.d/default.conf
然后vi 编辑 /u01/nginx/nginx.conf 文件
user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
upstream tomcatServer {
server t1:8080;
server t2:8080;
}
}
编辑 /u01/nginx/conf.d/default.conf 文件
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcatServer;
}
}
3、启动Nginx容器
[root@VM_60_202_centos ~]# docker run --name=my_nginx1 --link=my_tomcat1:t1 --link=my_tomcat2:t2 -v /u01/nginx/nginx.conf:/etc/nginx/nginx.conf -v /u01/nginx/conf.d:/etc/nginx/conf.d -p 8000:80 -d nginx --运行Nginx的容器,命名为my_nginx1 --给my_tomcat1、my_tomcat2容器分别起别名,t1、t2(会在my_nginx1的/etc/hosts文件中自动配置) --挂载/u01/nginx/nginx.conf文件和/u01/nginx/conf.d目录 --将容器的端口号80映射到宿主机的8000端口 [root@VM_60_202_centos ~]# curl http://localhost:8000/kerryNginxServlet/servletA <h2> hello I am Kerry!</h2><h1>This is the servlet test A!</h1> [root@VM_60_202_centos ~]# curl http://localhost:8000/kerryNginxServlet/servletA <h2> hello I am Kerry!</h2><h1>This is the servlet test B!</h1>
因为配置了负载均衡,所以在访问http://localhost:8000/kerryNginxServlet/servletA时,会有平均概率地访问http://localhost:8001/kerryNginxServlet/servletA 和 http://localhost:8002/kerryNginxServlet/servletA
MySQL容器
1、从数据源中查找MySQL镜像。一般下载官方的镜像Starts最高的那个。
[root@VM_60_202_centos ~]# docker search mysql --查询mysql官方镜像 [root@VM_60_202_centos ~]# docker pull mysql --下载下来其中的名为“mysql”的镜像 [root@VM_60_202_centos ~]# docker images --查看本地所有的镜像
2、创建挂载目录
[root@VM_60_202_centos ~]# mkdir -p /u01/mysql/data /u01/mysql/logs /u01/mysql/conf --data目录将映射为mysql容器配置的数据文件存放路径 --logs目录将映射为mysql容器的日志目录 --conf目录里的配置文件将映射为mysql容器的配置文件
3、启动MySQL容器
docker run -p 3306:3306 --name my_mysql1 -v /u01/mysql/conf:/etc/mysql/conf.d -v /u01/mysql/logs:/logs -v /u01/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=kerry -d mysql -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。 -v 挂载。 -e MYSQL_ROOT_PASSWORD=kerry:初始化 root 用户的密码。
4、远程连接数据库
这时远程来连接该数据库,可能会报错:
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
在安装mysql8的时候如果选择了密码加密,之后用客户端连接比如navicate,会提示客户端连接caching-sha2-password,是由于客户端不支持这种插件,可以通过如下方式进行修改:
1)进入容器
docker exec -it my_mysql1 bash
2)进入mysql
mysql -uroot -pkerry
3)修改用户登录权限信息
先查询用户信息
mysql> select host,user,plugin,authentication_string from mysql.user; +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | host | user | plugin | authentication_string | +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | % | root | caching_sha2_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | mysql_native_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | +-----------+------------------+-----------------------+------------------------------------------------------------------------+ 5 rows in set (0.00 sec)
host为 % 表示不限制ip localhost表示本机使用 plugin非mysql_native_password 则需要修改密码。
上文中可以见,root用户不限制ip,但需要修改 plugin。当然,如果为了应对各种应用场景,可以统一执行下列SQL:
ALTER USER 'root'@'%' IDENTIFIED BY 'kerry' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'kerry'; FLUSH PRIVILEGES; #刷新权限
改完之后,就可以用其他客户端连接该数据库了。此时查询数据库的用户信息为:
mysql> select host,user,plugin,authentication_string from mysql.user; +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | host | user | plugin | authentication_string | +-----------+------------------+-----------------------+------------------------------------------------------------------------+ | % | root | mysql_native_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | | localhost | mysql.infoschema | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.session | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | mysql.sys | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | | localhost | root | mysql_native_password | *B9C0EAD50A12474280CBCFD8CFB40DF416A93E02 | +-----------+------------------+-----------------------+------------------------------------------------------------------------+
其他
1、挂载的原理
Docker内的文件系统工作情况。Docker镜像被存储在一系列的只读层。当我们开启一个容器,Docker读取只读镜像并添加一个读写层在顶部。如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层。在读写层中的旧版本文件隐藏于该文件之下,但并没有被不破坏 - 它仍然存在于镜像以下。当Docker的容器被删除,然后重新启动镜像时,将开启一个没有任何更改的新的容器 - 这些更改会丢失。此只读层及在顶部的读写层的组合被Docker称为Union File System(联合文件系统)。
为了能够保存(持久)数据以及共享容器间的数据,Docker提出了Volumes的概念。很简单,volumes是目录(或者文件),它们是外部默认的联合文件系统或者是存在于宿主文件系统正常的目录和文件。
2、MySQL的表数据等,在本地宿主机上存储的策略尚不完整,后续会另起篇幅,拿实际项目举例说明。
终于介绍完啦!小伙伴们,这篇关于《服务器从零开始(2D)-Docker+Tomcat+Nginx+MySQL》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布数据库相关知识,快来关注吧!
软删除和我们常说的删除
- 上一篇
- 软删除和我们常说的删除
- 下一篇
- Django前后端分离实践
-
- 数据库 · MySQL | 1天前 |
- MySQL数值函数大全及使用技巧
- 117浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 三种登录MySQL方法详解
- 411浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 420浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 264浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL索引的作用是什么?
- 266浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL排序原理与实战应用
- 392浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQLwhere条件查询技巧
- 333浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用数据类型有哪些?怎么选更合适?
- 234浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用命令大全管理员必学30条
- 448浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL高效批量插入数据方法大全
- 416浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL性能优化技巧大全
- 225浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL数据备份4种方法保障安全
- 145浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3164次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3376次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3405次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4509次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3785次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang进程内存控制避免docker内oom
- 2022-12-22 160浏览
-
- golang进程在docker中OOM后hang住问题解析
- 2022-12-22 105浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览

