• 使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    更新下我们系统的yum工具

    yum update
    
    • 1

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

    yum install -y yum-utils
    
    • 1

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

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

    安装docker机器

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

    启动docker服务

    systemctl start docker
    
    • 1

    一些常用的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] .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    安装前准备

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

    cd /home
    mkdir nginx
    mkdir tomcat
    mkdir redis
    mkdir mysql
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    运行以上命令后,使用docker ps命令发现 nginx 容器并没有启动起来
    可以使用 docker logs 查看容器日志

    docker logs [容器id]
    
    • 1

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

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

    (特别注意:server_name要设置为localhost,不能设置主机的ip,不然下面的location映射都会失效,这个也是和主机部署nginx的配置区别,主机里是localhost和ip都可以的)

    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;
    		# 注意这里得设置localhost,不能设置主机的ip,不然下面的location映射都会失效
    		server_name localhost;
    		charset utf-8;
    
    		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;
    			# 这里调用api要使用主机id,转发到我们主机的8081端口去
    			proxy_pass http://121.37.254.131:8081/;
    		}
    
    		# 开放一个文件存储目录
    		location /files/ {
    			root /www/server/;
    		}
    		
    		location /dev/admin {
    			# 使用alias 把所有www.xxx.com/dev/admin 都替换为 /www/server/dev/admin/dist 这个路径,注意需要修改前端vue项目的根路径为 /dev/admin 
    			alias /www/server/dev/admin/dist;
    			index  index.html index.htm;
    		}
    		
    		location /dev/h5 {
    			alias /www/server/dev/h5;
    			index  index.html index.htm;
    		}
    		
    		location / {
    			# 表示域名会访问root路径,域名后加路径,就是在这个root路径下去加
    			# 如 www.xxx.com/dev/api/a.png 会访问文件路径:/www/server/dev/api/a.png
    			root /www/server/;
    			# 匹配规则,下面配置了2个规则,如 www.xxx.com/dev/h5/image.jpg 
    			# 在已经匹配不到的情况下,会尝试以下3个规则(都是基于root的相对路径)
    			# 尝试1:/www/server/dev/h5/image.jpg, 尝试2:/www/server/dev/h5/image.jpg/,尝试3:/www/server/dev/h5/index.html
    			try_files $uri $uri/ $uri/index.html;
    			# 访问域名时,默认访问/index.html(基于root的相对路径)
    			index  index.html index.htm;
    		}
    	}
    
    	# 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-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;
    	#		# 这里调用api要使用主机id,转发到我们主机的8081端口去
    	#		proxy_pass http://121.37.254.131:8081/;
    	#	}
    	#
    	#	# 开放一个文件存储目录
    	#	location /files/ {
    	#		root /www/server/;
    	#	}
    	#	
    	#	location /dev/admin {
    	#		# 使用alias 把所有www.xxx.com/dev/admin 都替换为 /www/server/dev/admin/dist 这个路径,注意需要修改前端vue项目的根路径为 /dev/admin 
    	#		alias /www/server/dev/admin/dist;
    	#		index  index.html index.htm;
    	#	}
    	#	
    	#	location /dev/h5 {
    	#		alias /www/server/dev/h5;
    	#		index  index.html index.htm;
    	#	}
    	#	
    	#	location / {
    	#		# 表示域名会访问root路径,域名后加路径,就是在这个root路径下去加
    	#		# 如 www.xxx.com/dev/api/a.png 会访问文件路径:/www/server/dev/api/a.png
    	#		root /www/server/;
    	#		# 匹配规则,下面配置了2个规则,如 www.xxx.com/dev/h5/image.jpg 
    	#		# 在已经匹配不到的情况下,会尝试以下3个规则(都是基于root的相对路径)
    	#		# 尝试1:/www/server/dev/h5/image.jpg, 尝试2:/www/server/dev/h5/image.jpg/,尝试3:/www/server/dev/h5/index.html
    	#		try_files $uri $uri/ $uri/index.html;
    	#		# 访问域名时,默认访问/index.html(基于root的相对路径)
    	#		index  index.html index.htm;
    	#	}
    	#}  	
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124

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

    # 运行镜像
    # -d 后台运行 (-i 以交互式方式运行,-t exit后自动结束容器)
    # --name 指定容器名字
    # -p 映射 容器外端口:容器内端口 (这里将宿主机的8080端口映射容器内的80端口)
    # -v 映射 容器外路径:容器内路径 (这里挂载nginx的配置文件、日志文件到宿主机的/home/nginx下、同时保留一个/www/server/ 目录映射,配合上面的配置文件,可以在这个目录放我们前端的项目)
    docker run -d -p 80:80 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs/:/var/log/nginx/ -v /www/server/:/www/server/ nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    docker ps 发现后台运行成功
    (要注意,如果把配置文件选择放在容器的/etc/nginx/conf.d目录下,那nginx就会以默认的/etc/nginx/nginx.conf配置文件来启动,然后这个默认配置会去include /etc/nginx/conf.d下的所有*.conf,这时我们准备的配置文件就只能有http模块,不能有server、user这些,为方便,我们还是覆盖它默认的配置文件)

    部署项目

    方式一,以tomcat和war包运行,从外部找一个server.xml修改自定义的配置,然后拷贝到/home/tomcat/conf/server.xml下,把war包拷贝到/home/tomcat/webapps/下

    docker pull tomcat
    # 端口映射:容器外8080 --> 容器内8080
    # 配置文件映射:容器外/home/tomcat/conf/server.xml --> 容器内/usr/local/tomcat/conf/server.xml
    # 日志文件映射:容器外/home/tomcat/logs --> 容器内/usr/local/tomcat/logs
    # 部署应用目录映射:容器外/home/tomcat/webapps/ --> 容器内/usr/local/tomcat/webapps/
    docker run -d -p 8080:8080 -v /home/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ tomcat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    方式二,不使用tomcat,直接打包jar包,然后在宿主机上监听对应的端口

    # 宿主机yum安装jdk
    yum install java-1.8.0-openjdk*
    # 使用后台方式,并输出日志到nohup.out文件
    nohup java -jar business.jar &
    # 查看java进程是否启动,并占用的端口
    netstat -ntlp | grep java
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    进入容器修改密码

    docker ps -a
    docker exec -it 容器ID /bin/bash
    cd /usr/local/bin
    redis-cli
    # 验证密码
    auth 123456
    # 修改密码
    config set requirepass **** 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意这种方式启动的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
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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.d --> 容器内 /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.d:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    同样道理,配置文件需要我们自己下载放到宿主机挂载目录下
    进入mysql容器修改密码,并设置允许远程登录

    # 进入mysql容器
    docker exec -it [容器id] bash
    # 登录mysql
    mysql -u root -p
    # 查看有哪些数据库
    show databases;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    # 进入上面的mysql db
    use mysql;
    
    • 1
    • 2

    在这里插入图片描述

    # 查看user表有哪些用户,允许哪些host访问,localhost表示只能本地访问
    select user,host from user;
    
    • 1
    • 2

    在这里插入图片描述
    这里我已经改过了,只要把root账号的host改成%即可在外网访问

    # 设置可远程访问
    update user set host = '%' where user = 'root';
    # 修改密码
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "123456";
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY "123456";
    # 添加新的用户
    create user 'name'@'%' identified by '123456';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总结

    如果发现主机修改文件,但是容器的文件不会同步,可以尝试修改下文件的权限:

    chmod 666 ./xxx.conf
    
    • 1

    上面用到的部署命令如下,我们也可以用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/ -v /www/server/:/www/server/ nginx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Html和Markdown中的空格,       以及   ‌ ‍
    代码随想录算法训练营第十四天|
    SQL注入
    Kettle 裁剪表详解
    OpenText Extended ECM 平台 ——将内容服务与领先应用程序集成,弥合内容孤岛、加快信息流并扩大治理
    极空间z2pro bitwarden+frp+nginx教程
    一个基于Notes的CMR应用程序
    Vite3.0都发布了,你还能卷得动吗(新特性一览)
    【正点原子STM32连载】 第三十四章 DAC实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
    uni-app - 城市选择索引列表 / 通过 A-Z 排序的城市列表(uview 组件库 IndexList 索引列表)
  • 原文地址:https://blog.csdn.net/laigengsong/article/details/134015575