使用docker(使用docker-compose.yml)配合nginx在linux上运行springboot项目上线,docker上运行了java,mysql,redis,nginx,所以本地可以不需要安装这些
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
sudo systemctl start docker
systemctl enable docker.service
sudo docker run hello-world
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
sudo systemctl start docker
Digest: sha256:9ade9cc2e26189a19c2e8854b9c8f1e14829b51c55a630ee675a5a9540ef6ccf
Status: Downloaded newer image for hello-world:latest
version: "1"
services:
nginx: # 服务名称,用户自定义
image: nginx:latest # 镜像版本
container_name: nginx #启动的别名
restart: always #docker启动的时候会自动启动这个服务
network_mode: host #不在对应某个端口,我认为的解释是对应所有端口了
volumes: # 挂载到本地服务器的具体文件内(前面是本地的具体目录以及文件,可以根据自己的需求改动,后面的是docker上的)
- /home/docker/nginx/www:/usr/share/nginx/html
- /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /home/docker/nginx/cer:/usr/share/nginx/cer
privileged: true # 这个必须要,解决nginx的文件调用的权限问题
mysql:
image: mysql:5.7
container_name: mysql
restart: always
ports:
- 3306:3306
volumes:
- /home/mysql/conf.d:/etc/mysql/conf.d
- /home/mysql/mysql:/var/lib/mysql
environment: # 指定用户root的密码
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456 #设置mysql的密码
redis:
image: redis:latest
container_name: redis
restart: always
ports:
- 6379:6379
volumes:
- /home/redis/redis.conf:/etc/redis/redis.conf
- /home/redis/data:/data
environment:
- TZ=Asia/Shanghai
command: redis-server --requirepass 123456 --appendonly yes
vuestudy:
build: . # 表示以当前目录下的Dockerfile开始构建镜像
image: vuestudy:latest
restart: always
container_name: vuestudy
ports:
- 8080:8080
volumes:
- /home/docker/vuestudy.jar:/home/first/vuestudy.jar
vuestudy2:
image: vuestudy:latest
restart: always
container_name: vuestudy2
ports:
- 8081:8080
volumes:
- /home/docker/vuestudy.jar:/home/first/vuestudy.jar
FROM openjdk:8
EXPOSE 8080
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["java","-jar", "/home/first/vuestudy.jar", "--server.port=8080", "--spring.profiles.active=prod"]
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
mysql运行成功之后
docker cp mysql:/etc/mysql/conf.d /home/mysql/
docker cp mysql:/var/lib/mysql /home/mysql/
docker stop $(docker ps -aq) //停止所有容器
sudo docker rm $(sudo docker ps -a -q) //删除所有未运行的容器
docker rmi $(docker images -q) //删除所有的镜像
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
default-time-zone = '+08:00'
lower_case_table_names = 1
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
redis与mysql同理,但不需要运行,创建文件夹在本地的home/redis下再创建data目录,下载该文件 redis.conf,然后修改以下内容放入redis文件夹中:
关于nginx的挂载
#nx worker进程运行用户以及用户组,默认nobody账号运行
user nginx;
#worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程
#消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
worker_processes 2;
#定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /var/log/nginx/error.log warn;
#用来指定进程id的存储文件的位置
pid /var/run/nginx.pid;
#用于指定一个进程可以打开最多文件数量的描述
worker_rlimit_nofile 65535;
worker_cpu_affinity 01 10;
#针对nginx服务器的工作模式的一些操作配置
events {
#指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
worker_connections 51200;
#配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
#multi_accept on;
#配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
use epoll;
}
#作为web服务器,http模块是nginx最核心的一个模块
http {
##
# 基础配置
##
#配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
sendfile on;
#让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
#tcp_nopush on;
#让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用
tcp_nodelay on;
#给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
keepalive_requests 50000;
keepalive_timeout 1000;
#混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
types_hash_max_size 2048;
#虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
#指定在当前文件中包含另一个文件的指令
include /etc/nginx/mime.types;
#指定默认处理的文件类型可以是二进制
default_type application/octet-stream;
proxy_intercept_errors on;
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;
#设置存储记录错误发生的日志
error_log /var/log/nginx/error.log;
##
# SSL证书配置
##
#指令用于启动特定的加密协议,nginx在1.1.13和1.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,
#TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
#设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件
#ssl_prefer_server_ciphers on;
##
# Gzip 压缩配置
##
#是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip on;
#为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_disable "msie6";
#upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
upstream tomcatserver1 {
#指定请求调度算法,默认是weight权重轮询调度,可以指定
#ip_hash; 每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,
#这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
#server host:port:分发服务器的列表配置,172.16.147.149是我服务器的地址,你们需要改成你们自己的
server 172.16.147.149:8080 weight=1 max_fails=2 fail_timeout=10s;
server 172.16.147.149:8081 weight=1 max_fails=2 fail_timeout=10s;
#down:表示该主机暂停服务
#max_fails:表示失败最大次数,超过失败最大次数暂停服务
#fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
}
#一个虚拟主机的配置,一个http中可以配置多个server
#主机配置
server {
#监听的端口号,使用80的话域名就可以不加端口号了
listen 80;
#用来指定ip地址或者域名,多个配置之间用空格分隔,假如在本地运行,配置www.xx.com就需要去更改电脑的host文件
#如何更改host:在C:\Windows\System32\drivers\etc目录下的host文件中添加一条DNS记录:127.0.0.1 www.helloworld.com
server_name 127.0.0.1;
#用于设置www/路径中配置的网页的默认编码格式
charset utf-8;
#这是容器静态文件地址,因为上方使用了挂载,所以会访问至我们本地的www文件夹
location /love {
alias /usr/share/nginx/html;
index index.html;
}
#反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
location / {
#tomcatserver1需要与上方一致,取什么名字都行只要一样
proxy_pass http://tomcatserver1;
proxy_redirect off;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1024m;
client_body_buffer_size 1024k;
proxy_connect_timeout 15;
proxy_send_timeout 15;
proxy_read_timeout 15;
proxy_buffer_size 8k;#
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
}
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root html;
#}
}
#这是我的https,如果不需要可删除
server {
listen 443 ssl;
server_name localhost;
root html;
index index.html index.htm;
ssl_certificate /usr/share/nginx/cer/cert-file-name.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key /usr/share/nginx/cer/cert-file-name.key; #需要将cert-file-name.key替换已上传的证书密钥文件的名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://tomcatserver1;
proxy_redirect off;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1024m;
client_body_buffer_size 1024k;
proxy_connect_timeout 15;
proxy_send_timeout 15;
proxy_read_timeout 15;
proxy_buffer_size 8k;#
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
}
}
}
一切准备就绪了,接下来在home目录下创建docker文件夹,然后将docker-compose.yml、Dockerfile、vuestudy.jar(springboot项目)放入docker文件夹中,再在此创建nginx文件夹,目录结构以下图片:
最后运行
cd /home/docker //进入yml文件目录
docker-compose up -d //执行compose
systemctl restart docker //重启docker
docker exec <容器 ID> //进入容器
docker attach 容器名或者容器ID bash //进入容器
docker exec -it 容器名或者容器ID bash //进入容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 //启动容器
docker ps (-a)所有 (-l)最后一个 //查看容器运行
docker logs #id //查看容器内的日志输出
docker stop #id //停止容器
docker #指令 --help //查看指令具体信息
docker pull #容器名称(ubuntu) //获取镜像容器
docker start #id //启动一个已停止的容器
docker restart <容器 ID> //重启容器
docker export <容器 ID> ubuntu.tar //导出容器
docker rm -f <容器 ID> //删除容器
docker images //列出镜像列表
docker search <镜像名称>(httpd) //查询镜像
docker rmi <镜像名称>(hello-word) //删除镜像
docker exec -it mysql /bin/bash //进入容器
mysql -h localhost -u root -p //进入mysql容器之后进入mysql