使用Docker快速搭建服务器环境

简介

这篇文章也是方便自己记录搭建流程,服务器的购买啥的就不说了,最终目标就是在一个空白的Linux系统上,使用docker运行MySQL、Tomcat+Java、Nginx、Redis 的单机环境,以后方便自己快速的部署服务器。

安装Docker

首先需要安装Docker,建议按照官方的文档(https://docs.docker.com/engine/install/centos/)
将yum镜像源改为阿里云镜像源,不然会从国外下载

# 安装wget
yum install -y wget
# 备份原来的源配置文件
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.back
# 拉取阿里云的配置文件(6可以替换成自己的CentOS版本)
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 重新加载yum
yum clean all
yum makecache

更新下我们系统的yum工具

yum update

更新完以后,按照docker官网,先安装yum-utils工具

yum install -y yum-utils

添加阿里云的docker镜像源(上面改的是基础镜像源,非这里的docker)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker机器

sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动docker服务

systemctl start docker

一些常用的docker命令

###############################  镜像命令  #####################################
# 查看docker的所有镜像
docker images
# 删除镜像
docker rmi 镜像id
docker rmi 镜像名称:版本号
# 搜索镜像
docker search 镜像名称(例如:mysql,centos,nginx)
# 从docker hub上拉取镜像
docker pull mysql:版本号
docker pull mysql(默认是最新版本号)###############################  容器命令  #####################################
# 查看当前正在运行的容器
docker ps
# 查看所有的容器
docker ps -a
# docker镜像运行为容器
# -it是创建的交互式:创建完成之后直接进度终端
# -id是创建守护式:创建完成之后不进入容器
# -it创建的容器exit,后台不会继续运行
# -id创建的容器exit,后台继续运行
# -p把容器内的3306端口映射到容器外的3355端口
docker run -it -p 3355:3306 --name mytomcat tomcat:9.0 /bin/bash
# 以/bin/bash命令进入容器
docker exec -it mytomcat /bin/bash
# 启动容器()
docker start -i [容器id]
# 停止容器
docker stop [容器id] 
# 删除容器
docker rm mytomcat 
# 删除所有容器(-a 列出所有容器 -q 只取id,然后使用$符号将这些id传入)
docker rm $(docker ps -aq)
# 拷贝本地文件到docker容器中
docker cp test.txt 容器id:/app/test.txt###############################  数据卷命令  #####################################
# -v 挂载容器内目录/root/data_container到容器外目录/root/data
docker run -it --name=mycentos -v /root/data:/root/data_container centos:latest /bin/bash
# 继承上面的mycentos容器的数据卷
docker run -it --name=centos2 --volumes-from mycentos centos:latest###############################  打包镜像命令  #####################################
# 容器打包成为镜像
docker commit [容器id] [自定义镜像名称]:[自定义版本号]
# dockerFile转成镜像
docker build -f [DockerFile路径] -t [容器名]:[TAG] .

安装前准备

在宿主机的/home 目录准备我们nginx、redis、mysql、tomcat的映射目录,方便我们直接在宿主机修改配置和查看日志。

cd /home
mkdir nginx
mkdir tomcat
mkdir redis
mkdir mysql

Docker部署Nginx

# 拉取nginx最新镜像
docker pull nginx:latest
# 运行镜像
# -d 后台运行 (-i 以交互式方式运行,-t exit后自动结束容器)
# --name 指定容器名字
# -p 映射 容器外端口:容器内端口 (这里将宿主机的8080端口映射容器内的80端口)
# -v 映射 容器外路径:容器内路径 (这里挂载nginx的配置文件、日志文件到宿主机的/home/nginx下)
docker run -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ -d nginx

运行以上命令后,使用docker ps命令发现 nginx 容器并没有启动起来,原因是因为我们挂载了ngxin.conf,挂载会首先使用容器外的目录,覆盖容器内的目录,这就导致我们的nginx配置文件被清空了,于是ngxin并没有正常启动。官方给的做法如下:
在这里插入图片描述
大概意思是说,先以不挂载的形式运行docker容器,然后再把容器内的ngxin.conf拷贝出来,接着以挂载这个拷贝的conf文件的形式启动新的docker容器。于是容器外目录覆盖容器内目录时,就会有nginx.conf配置文件了。

一般我们都会修改我们的nginx配置文件,因为每个服务器配置的端口啥的都不一样,安装的应用也不一样,所以,我们直接把自己的nginx.conf文件放到宿主机要挂载的目录下就行了,也就是 /home/nginx/nginx.conf
一个简单的nginx.conf样式(包含了h5应用、管理端应用、api调用、swagger、文件存储):

user root; 
worker_processes 1;events
{	# 连接数worker_connections 1024;
}http
{include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server_tokens off;access_log on;# http的匹配规则server{listen 80;# 域名server_name www.xxx.com;error_log logs/error.log;access_log logs/access.log;charset utf-8;location /dev {# www.xxx.com/dev,会去服务器的这个路径/www/server/dev/h5/下找资源root /www/server/dev/h5/;# 匹配规则,如 www.xxx.com/h5/image.jpg 会优先找/www/server/dev/h5/image.jpg,找不到再找/www/server/dev/h5/index.htmltry_files $uri $uri/ /index.html;# 访问域名时,默认访问index.html,如 www.xxx.com/dev 会去找 /www/server/dev/h5/index.htmlindex  index.html index.htm;}location /dev/admin {root /www/server/dev/admin/;try_files $uri $uri/ /index.html;index  index.html index.htm;}location /dev/swagger/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://localhost:8081/swagger-ui.html;}location /dev/api/ {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://localhost:8081/;}# 开放一个文件存储目录location /files/ {root /www/server/;}}# https的匹配规则#server#{#	listen 443 ssl;#	# 域名#	server_name www.xxx.com;##	error_log logs/error.log;#	access_log logs/access.log;##	charset utf-8;##	ssl_certificate ../cert/xxx.pem;#	ssl_certificate_key ../cert/xxx.key;##	ssl_session_cache    shared:SSL:1m;#	ssl_session_timeout  5m;#	ssl_protocols TLSv1.2;#	ssl_prefer_server_ciphers on;#	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;##	location /dev {#		root /www/server/dev/h5/;#		try_files $uri $uri/ /index.html;#		index  index.html index.htm;#	}##	location /dev/admin {#		root /www/server/dev/admin/;#		try_files $uri $uri/ /index.html;#		index  index.html index.htm;#	}##	location /dev/swagger/ {#		proxy_set_header Host $http_host;#		proxy_set_header X-Real-IP $remote_addr;#		proxy_set_header REMOTE-HOST $remote_addr;#		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#		proxy_pass http://localhost:8081/swagger-ui.html;#	}##	location /dev/api/ {#		proxy_set_header Host $http_host;#		proxy_set_header X-Real-IP $remote_addr;#		proxy_set_header REMOTE-HOST $remote_addr;#		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#		proxy_pass http://localhost:8081/;#	}##	location /files/ {#		root /www/server/;#	}#}  	
}

添加完nginx.conf后,我们还是以挂载卷命令运行nginx容器:

# 运行镜像
# -d 后台运行 (-i 以交互式方式运行,-t exit后自动结束容器)
# --name 指定容器名字
# -p 映射 容器外端口:容器内端口 (这里将宿主机的8080端口映射容器内的80端口)
# -v 映射 容器外路径:容器内路径 (这里挂载nginx的配置文件、日志文件到宿主机的/home/nginx下)
docker run -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ -d nginx

docker ps 发现后台运行成功

Docker部署Tomcat

docker pull tomcat
# 端口映射:容器外8080 --> 容器内8080
# 配置文件映射:容器外/home/tomcat/conf --> 容器内/usr/local/tomcat/conf
# 日志文件映射:容器外/home/tomcat/logs --> 容器内/usr/local/tomcat/logs
# 部署应用目录映射:容器外/home/tomcat/webapps/ --> 容器内/usr/local/tomcat/webapps/
docker run -p 8080:8080 -d -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat

Docker部署redis

docker pull redis:latest
# -p 端口映射 容器外6379 --> 容器内6379
# -v redis配置文件映射 容器外 /home/redis/redis.conf --> 容器内 /usr/local/redis.conf
# -v redis数据映射 容器外 /home/redis/data --> 容器内 /data
# -d 后台运行
# --requirepass (密码123456)
docker run -p 6379:6379 -v /home/redis/data:/data -d --requirepass 123456 redis

进入容器修改密码

docker ps -a
docker exec -it 容器ID /bin/bash
cd /usr/local/bin
redis-cli
# 验证密码
auth 123456
# 修改密码
config set requirepass **** 

注意这种方式启动的redis是没有配置文件的,如果需要使用自定义的配置文件启动,可以把配置文件放到 /home/redis/redis.conf 下,使用 -v 挂载到容器内的 /usr/local/redis.conf 下,然后使用配置文件启动redis容器

docker run -p 6379:6379 -v /home/redis/redis.conf:/usr/local/redis.conf -v /home/redis/data:/data -d redis /usr/local/redis.conf

redis配置文件下载地址:
https://github.com/redis/redis/blob/7.2/redis.conf

bind 127.0.0.1 		#注释掉这部分,使redis可以外部访问
daemonize no		#用守护线程的方式启动
requirepass 你的密码	#给redis设置密码
appendonly yes		#redis持久化  默认是no
tcp-keepalive 300 	#防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300

Docker部署mysql

mysql版本选择可以到 https://hub.docker.com/_/mysql?tab=tags 这里看有那些标签
我们安装5.7版本

# 一句话就搞定了mysql的配置,没有用docker得要配置仓库源,编译等等的,还有各种网络问题,docker真强大
docker pull mysql:5.7
# -p 端口映射 容器外3306 --> 容器内3306
# -v mysql配置文件映射 容器外 /home/mysql/conf --> 容器内 /etc/mysql/conf.d
# -v mysql数据映射 容器外 /home/mysql/data --> 容器内 /var/lib/mysql (没有映射到外面会导致数据丢失,容器删了就没了)
# -d 后台运行
# -e MYSQL_ROOT_PASSWORD=123456 配置mysql密码
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

同样道理,配置文件需要我们自己下载放到宿主机挂载目录下

总结

上面用到的部署命令如下,我们也可以用docker compose去编排这几个命令,这样就不用每次都一遍一遍运行了

# 部署mysql
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 部署redis
docker run -d -p 6379:6379 -v /home/redis/redis.conf:/usr/local/redis.conf -v /home/redis/data:/data redis /usr/local/redis.conf
# 部署tomcat
docker run -d -p 8080:8080 -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat
# 部署nginx
docker run -d -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ nginx

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

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

相关文章

python网络爬虫(二)基本库的使用urllib/requests

使用urllib 了解一下 urllib 库,它是 Python 内置的 HTTP 请求库,也就是说不需要额外安装即可使用。它包含如下 4 个模块。 request:它是最基本的 HTTP 请求模块,可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样&…

06 MIT线性代数-列空间和零空间 Column space Nullspace

1. Vector space Vector space requirements vw and c v are in the space, all combs c v d w are in the space 但是“子空间”和“子集”的概念有区别,所有元素都在原空间之内就可称之为子集,但是要满足对线性运算封闭的子集才能成为子空间 中 2 …

【OpenCV实现图像阈值处理】

文章目录 概要简单阈值调整自适应阈值调整大津(Otsus)阈值法Otsus 二值化是如何工作的 概要 OpenCV库中的图像处理技术,主要分为几何变换、图像阈值调整和平滑处理三个部分。 在几何变换方面,OpenCV提供了cv.warpAffine和cv.warpPerspective函数&#…

(链表) 25. K 个一组翻转链表 ——【Leetcode每日一题】

❓ 25. K 个一组翻转链表 难度:困难 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保…

Kotlin基础——函数、变量、字符串模板、类

函数、变量、字符串模板、类 函数变量字符串模板类 函数 函数组成为 fun 函数名(参数名: 参数类型, …): 返回值{} fun max(a: Int, b: Int): Int {return if (a > b) a else b }上面称为代码块函数体,当函数体由单个表达式构成时,可简化为表达式函…

FreeRTOS 计数型信号量 详解

目录 什么是计数型信号量? 计数型信号量相关 API 函数 1. 创建计数型信号量 2. 释放二值信号量 3. 获取二值信号量 计数型信号量实操 什么是计数型信号量? 计数型信号量相当于队列长度大于1 的队列,因此计数型信号量能够容纳多个资源&a…

Azure - 机器学习:创建机器学习所需资源,配置工作区

目录 一、Azure机器学习工作区与计算实例简要介绍工作区计算实例 二、创建工作区1. 登录到 Azure 机器学习工作室2. 选择“创建工作区”3. 提供以下信息来配置新工作区:4. 选择“创建”以创建工作区 三、创建计算实例四、工作室实战4.1 工作室快速导览4.2 从示例笔记…

css 雷达扫描图

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 雷达扫描</title><style>* {margin: 0;padding: 0;}body {background: #000000;height: 100vh;display: flex;align-items…

021-Qt 配置GitHub Copilot

Qt 配置GitHub Copilot 文章目录 Qt 配置GitHub Copilot项目介绍 GitHub Copilot配置 GitHub CopilotQt 前置条件升级QtGitHub Copilot 前置条件激活的了GitHub Copilot账号安装 Neovim 启用插件&#xff0c;重启Qt配置 GitHub Copilo安装Nodejs下载[copilot.vim](https://gith…

互联网Java工程师面试题·Spring篇·第五弹

目录 1、什么是 spring? 2、使用 Spring 框架的好处是什么&#xff1f; 3、Spring 由哪些模块组成? 4、核心容器&#xff08;应用上下文) 模块。 5、BeanFactory – BeanFactory 实现举例。 6、XMLBeanFactory 7、解释 AOP 模块 8、解释 JDBC 抽象和 DAO 模块。 9、…

SD-WAN让跨境网络访问更快、更安全!

目前许多外贸企业都面临着跨境网络不稳定、不安全的问题&#xff0c;给业务合作带来了很多困扰。但是&#xff0c;现在有一个解决方案能够帮助您解决这些问题&#xff0c;让您的跨境网络访问更快、更安全&#xff0c;那就是SD-WAN&#xff01; 首先&#xff0c;让我们来看看SD-…

用VSCODE启动Java项目

下载插件 推荐下载插件 启动 在vscode中打开项目或将项目拖进vscode,等进度条加载完成即成启动项目

使用 excel 快速拼接省市区镇街村居五级区划完整名称

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言数据准备excel 函数附件 前言 之前做了国家区划的映射关系&#xff0c;在其过程中&#xff0c;使用代码…

机器学习实验三:决策树-隐形眼镜分类(判断视力程度)

决策树-隐形眼镜分类&#xff08;判断视力程度&#xff09; Title : 使用决策树预测隐形眼镜类型 # Description :隐形眼镜数据是非常著名的数据集 &#xff0c;它包含很多患者眼部状况的观察条件以及医生推荐的隐形眼镜类型 。 # 隐形眼镜类型包括硬材质 、软材质以及不适合佩…

Kafka入门04——原理分析

目录 01理解Topic和Partition Topic(主题) Partition(分区) 02理解消息分发 消息发送到分区 消费者订阅和消费指定分区 总结 03再均衡(rebalance) 再均衡的触发 分区分配策略 RangeAssignor(范围分区) RoundRobinAssignor(轮询分区) StickyAssignor(粘性分区) Re…

MR混合现实情景实训教学系统在旅游管理专业中的应用

在旅游管理专业中&#xff0c;MR混合现实情景实训教学系统的主要应用包括但不限于以下几个方面&#xff1a; 1. 实地考察的替代&#xff1a;对于一些无法实地考察的景点或设施&#xff0c;学生可以通过MR系统进行虚拟参观&#xff0c;从而了解其实际情况。这不仅可以减少时间和…

人工智能基础_机器学习003_有监督机器学习_sklearn中线性方程和正规方程的计算_使用sklearn解算八元一次方程---人工智能工作笔记0042

然后我们再来看看,如何使用sklearn,来进行正规方程的运算,当然这里 首先要安装sklearn,这里如何安装sklearn就不说了,自己查一下 首先我们还是来计算前面的八元一次方程的解,但是这次我们不用np.linalg.solve这个 解线性方程的方式,也不用 直接 解正规方程的方式: 也就是上面…

【STM32】GPIO控制LED(HAL库版)

STM32最新固件库v3.5/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c 林何/STM32F103C8 - 码云 - 开源中国 (gitee.com) STM32最新固件库v3.5/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c 林何/STM32F103C8 - 码云 - 开源中国 (gitee.…

代码随想录二刷 Day50

198.打家劫舍 这个题一开始由于给出来的例子陷入了思维误区&#xff0c;以为结果就是每隔一个取一个&#xff0c;其实有可能中间隔很多个。比如一下这个例子 下面这种写法不对。 class Solution { public:int rob(vector<int>& nums) {int odd_sum 0;int even_su…

Loop Copilot:AI驱动,小白也能自己生成音乐?

01 项目介绍 Loop Copilot是一个使用自然语言生成音乐的系统。它不仅允许你使用自然语言来生成你想要的音乐风格、节奏或旋律&#xff0c;还支持通过多轮对话对已生成的音乐进行进一步的编辑和修改。包括对生成的音乐进行编辑修改、添加或删除乐器、加入音效等。 02 工作流程…