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

news2024/11/14 5:40:59

简介

这篇文章也是方便自己记录搭建流程,服务器的购买啥的就不说了,最终目标就是在一个空白的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.html
			try_files $uri $uri/ /index.html;
			# 访问域名时,默认访问index.html,如 www.xxx.com/dev 会去找 /www/server/dev/h5/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/;
		}
	}

	# 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.coloradmin.cn/o/1134220.html

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

相关文章

宏电5G RedCap工业智能网关获首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日,2023世界物联网博览会——中国移动物联网开发者大会暨物联网产业论坛在无锡圆满举行。宏电股份参与中国移动5G物联网开放实验室5G及轻量化产品能力认证成果授牌仪式,并获得认证证书。 此次认证主要对产品功能、产品性能、RedCap网络兼容性进行测…

为什么POST请求经常发送两次?

大多数初级前端程序员,在通过浏览器F12的调试工具调试网络请求时,可能都会有一个发现,在进行POST请求时,明明代码里只请求了一次,为什么network里发送了两次呢,难道我代码出bug了?带着疑问点开第…

根据递归原理设计一个简单的代码生成器

数据结构设计 可以设计一个组件节点ComponentNode的数据结构,包含name、props、children字段,其中children再嵌套子组件节点。 class ComponentNode {constructor(name, props) {this.name namethis.props propsthis.children [] } }递归算法设计 function generateCode(…

【Java笔试强训】Day5(45842-统计回文、58539-连续最大和)

45842-统计回文 链接:45842-统计回文 题目: “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在…

多测师肖sir_高级金牌讲师__接口测试之tonken (5.6)

接口测试之tonken 网站:http://shop.duoceshi.com/login?redirect2Fdashboard 第一个接口:uiid接口 uiid接口url:http://manage.duoceshi.com/auth/code test中语句: var jsonData JSON.parse(responseBody); postman.setEnvi…

javaEE -9(7000字详解TCP/IP协议)

一: IP 地址 IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物…

论文-分布式-分布式计算|容错-分布式控制下的自稳定系统

参考文献Self-stabilizing systems in spite of distributed control可以把松散耦合的 循环序列过程 间的同步任务,看成是要保持一个这样的不变性:“系统要处于一种合法状态”因此每个进程在运行每一个可能会改变不变性的步骤之前都要先检查一下是可以执…

信息系统架构的设计理论与实践

信息系统架构的设计理论与实践 信息系统架构概述 信息系统架构的定义和发展 信息系统架构的定义 骚戴理解:这里只要背定义即可 信息系统架构的发展 信息系统架构的分类(集中式和分布式) 集中式结构 分布式结构 信息系统常用的四种架构模型…

操作系统-浅谈CPU与内存

目录 计算机的基本组成CPU内存虚拟内存内存分段内存分页 CPU与内存的交互过程高速缓存cache 所有图片均来自:小林coding 计算机的基本组成 计算机由软件和硬件组成 硬件由CPU(中央处理器)存储器(内存外存)外部设备组成。 软件由应用软件和系…

Flink 自定义拓展 SQL 语法

1、Flink 扩展 calcite 中的语法解析 1)定义需要的 SqlNode 节点类-以 SqlShowCatalogs 为例 a)类位置 flink/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java 核心方法: Override pu…

JVM 调优JVM 性能优化

所谓“调优”就是一个诊断和处理手段,最终的目标是让系统的处理能力,也就是“性能”达到最优化。 计算机系统中,性能相关的资源主要分为这几类: CPU:CPU 是系统最关键的计算资源,在单位时间内有限&#xf…

Windows10系统安装telnet命令

简介 telnet命令可以测试目标服务器端口是否开通,使用命令 telnet ip地址 端口,输入命令后回车,如果进入输入状态,则表示目标服务器端口已开通,可以通过外网访问 Windows10系统安装步骤 1.打开控制面板 2.选择程序…

MS1112可替代ADS1112,16-bit 多输入内置基准模数转换器

MS1112 是一款高精度 16bit 模数转换器,具有 2 组差分输入 或 3 组单端输入通道,高达 16bits 的分辨率。内部集成 2.048V 基 准源,差分输入范围达到 2.048V 。 MS1112 使用了 I 2 C 兼容接口, 并有 2 个地址管…

Linux网络流量监控iftop

在 Linux 系统下即时监控服务器的网络带宽使用情况,有很多工具,比如 iptraf、nethogs 等等,但是推荐使用小巧但功能很强大的 iftop 工具【官网:http://www.ex-parrot.com/~pdw/iftop/】。iftop 是 Linux 系统一个免费的网卡实时流…

elasticsearch-5.6.15集群部署,如何部署x-pack并添加安全认证

目录 一、环境 1、JDK、映射、域名、三墙 2、三台服务器创建用户、并为用户授权 二、配置elasticsearch-5.6.15实例 1、官网获取elasticsearch-5.6.15.tar.gz,拉取到三台服务器 2、elas环境准备 3、修改elasticsearch.yml配置 4、修改软、硬件线程数 5、修改…

PHP 危险函数1-OS 命令执行函数

OS 命令执行函数 system 函数 特点&#xff1a; 自带输出功能自动区分系统平台&#xff0c;只需得知目标系统在 system() 中输入对应系统的命令即可 使用 <?phpsystem("<系统命令>"); ?>如 <pre> <?phpsystem("ipconfig"); …

如何在VScode中让printf输出中文

如何在VScode中让printf输出中文&#xff1f; 1、在“Visual Studio Code”图标上右击&#xff0c;弹出对话框。见下图&#xff1a; 2、点击“以管理员身份运行”&#xff0c;得到下图&#xff1a; 3、点击“UTF-8”按钮&#xff0c;得到下图&#xff1a; 4、点击“通过编码重…

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

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

MFC 注册表

文章目录 打开注册表对注册表的键的操作创建子键删除子键遍历子键 对注册表值的操作读取值设置值 打开注册表 void CREGDemoDlg::OnBnClickedBtnOpen() {//打开注册表HKEY hKey;if (ERROR_SUCCESS ! RegOpenKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\Baidu.com", 0, KEY…

*Django中的Ajax 纯js的书写样式1

搭建项目 建立一个Djano项目&#xff0c;建立一个app&#xff0c;建立路径&#xff0c;视图函数大多为render, Ajax的创建 urls.py path(index/,views.index), path(index2/,views.index2), views.py def index(request):return render(request,01.html) def index2(requ…