服务器Docker部署springboot项目

前言:之前项目重来没有用到过Docker部署,最近的一个项目需要,从头开始整一遍Docker,记录一下所踩的坑。

1.开防火墙

腾讯云服务器,买来没开防火墙,不知道要不要紧索性就开起来吧

# 查看防火墙状态
systemctl status firewalld.service

# 开启防火墙
systemctl start firewalld.service

# 查看开启端口号
firewall-cmd --list-ports

# 永久开启一个8082的端口号
firewall-cmd --zone=public --add-port=8082/tcp --permanent

# 重启防火墙
firewall-cmd --reload

2.更换22登录端口

云服务器刚买来就有好多其他IP的登录失败记录,虽然更换22端口治标不治本。其他方式大伙可自行百度

# 修改文件
vi /etc/ssh/sshd_config 
    改为
    #Port 22	
    Port 23456

# 向防火墙中添加修改的端口
firewall-cmd --zone=public --add-port=23456/tcp --permanent

# 防火墙重启
systemctl restart firewalld.service

# 查看端口是否添加成功
firewall-cmd --zone=public --list-ports

# 重启ssh服务
systemctl restart sshd.service

# 防火墙中移除22端口
firewall-cmd --zone=public --remove-port=22/tcp --permanent 

# 防火墙重启
systemctl restart firewalld.service




## 特别注意
## 云服务器有控制台,记得在控制台中开启23456端口,再尝试过23456端口可以登录后再移除22端口。
## 不然可能会向我一样,重置服务器又重新搞一遍

3.Docker安装

# 设置镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 下载docker
yum -y install docker-ce

# 开启docker
systemctl start docker
	
# 重启docker
systemctl restart docker

4.配置Docker的远程访问

这个是方便后面idea远程调用

vim /lib/systemd/system/docker.service
# 修改为
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

# 重启
systemctl daemon-reload
systemctl stop docker
systemctl start docker

# 查看代理端口:显示2375就标识设置成功了
netstat -nlpt	

# 开启2375端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent

# 重启防火墙
firewall-cmd --reload

# 查看端口情况
firewall-cmd --zone=public --list-ports

# 测试端口是否已开启:有返回值就表示开启成功了
curl http://公网IP:2375/version

5.Docker安装mysql、redis

## redis

    # 拉取镜像
	docker pull redis
	
	# 运行redis
	docker run --name myredis -p 6379:6379 -d redis --appendonly yes
	
	# --name 起名
	# -p 6379:6379 表示把服务器6379端口映射到docker的6379端口。这样可以通过服务器的端口访问deocker的端口
	
	# -d 以后台服务形式运行redis
	# redis-service --appendonly yes	标识开启持久化缓存模式,可以存到硬盘




## mysql

    # 拉取镜像
	docker pull mysql:5.7.27
	
    # 运行mysql	默认utf8
	docker run --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.27
	
    # 如果我们要保存utf8mb4的格式
	docker run --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.27 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

6.Docker安装Nginx

因为我的项目用到了Nginx的静态服务器特性,这一块踩了好多坑

docker pull nginx

# 启动nginx
docker run --name mynginx -p 8083:80 -d nginx	在没改配置文件的时候,nginx默认端口是80,所以先对80接口

# 启动完后可以访问公网IP:8083,弹出nginx页面就证明启动成功了


# 创建挂载目录
mkdir -p /home/nginx/static/modules

# 将正在运行的nginx中的文件映射到我们指定的位置
docker container cp mynginx:/etc/nginx/nginx.conf /home/nginx/
docker container cp mynginx:/etc/nginx/conf.d /home/nginx/
docker container cp mynginx:/var/log/nginx/ /home/nginx/log

# 删除nginx
docker stop mynginx
docker rm mynginx


## 删除了过后,我们就可以配置我们的nginx.conf配置啦

因为我要用静态服务器,文件要在/home/nginx/static/modules下,所以要在/home/nginx下的nginx.conf配置路径

## 在nginx.conf中的 keepalive_timeout  65;下添加

        注意我在这里改了监听端口为8083!

server {

      listen       8083;#写内网端口,访问时用外网端口进行映射访问
      server_name  localhost;
  
      #charset koi8-r;
  
      #access_log  logs/host.access.log  main;
  
		location /modules {
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

           # 这里为什么要指到/home/static,是因为我们是挂载到docker中nginx的容器内部地址
           root   /home/static;
           index  index.html index.htm;
        }

        #location / {
		#	proxy_set_header   Host             $host;
        #    proxy_set_header   X-Real-IP        $remote_addr;
        #    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        #    root   /home/static/modules;
        #    index  index.html index.htm;
        #}
  
   
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
          root   html;
      }
}

以上两种location作用都是一样的。如果你有图片或者是其他类型文件才能查看的限制可以添加

location ~ .*\.(gif|jpg|jpeg|png|html)$ {  #这里可以自定义访问配置,比如:/static表示static目录下的所有文件
  expires 24h;  
  root /home/static/;#指定图片存放路径  
  #access_log /home/static/logs/images.log;#图片 日志路径  
  proxy_store on;  
  proxy_store_access user:rw group:rw all:rw;  
  proxy_temp_path         /home/static/;#代理临时路径
  proxy_redirect          off;  

  proxy_set_header        Host 127.0.0.1;  
  proxy_set_header        X-Real-IP $remote_addr;  
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;  
  client_max_body_size    10m;  
  client_body_buffer_size 1280k;  
  proxy_connect_timeout   900;  
  proxy_send_timeout      900;  
  proxy_read_timeout      900;  
  proxy_buffer_size       40k;  
  proxy_buffers           40 320k;  
  proxy_busy_buffers_size 640k;  
  proxy_temp_file_write_size 640k;  
  if ( !-e $request_filename)  
  {  
	   proxy_pass  http://127.0.0.1:80;#代理访问地址,和上面的端口一致  
  }  
}

设置好nginx.conf文件后,我们重启nginx挂在对应文件就行了

## 在上面我改了nginx.conf的listen端口为8083

docker run -p 8083:8083 --name mynginx -v /home/nginx/static:/home/static -v /home/nginx/logs:/var/log/nginx -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf.d:/etc/nginx/conf.d -d nginx

现在就可通过公网IP:8083/文件名访问到文件了。

7.Docker部署项目

        1.首先将项目打包好

        2.服务器上建立一个文件夹,将jar包和Dockerfile文件放在一起

 Docker文件

# java:8被openjdk:8取代了
FROM openjdk:8

VOLUME /tmp

# 这里对应上自己的jar包名,scenedeploy.jar这个名字为简称
ADD SceneDeploySystem-1.0.0.jar scenedeploy.jar

# 改成scenedeploy.jar这个简称
RUN bash -c 'touch /scenedeploy.jar'

# 开发端口
EXPOSE 8082

# 改成scenedeploy.jar这个简称
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/scenedeploy.jar"]

然后服务器操作

## 进入当前文件夹
cd /home/sceneDemo

## 创建Docker镜像
docker build -t scenedeploy .

## 启动docker镜像
docker run -d scenedeploy --name myscene -p 8082:8082

8.解决8082服务访问不了的问题

     在启动容器后你可能会访问不到服务,在docker ps的时候发现你明明设置了--name,但是就是对应不上;ports的那一栏只有8082/tcp,甚至可能什么都不显示。

 这是因为你可能没开启ip转发设置

# 查看是否开启了ip转发,返回1时为开启了
sysctl net.ipv4.ip_forward

# 修改配置文件
vim /etc/sysctl.conf
# 修改
net.ipv4.ip_forward = 1

# 重启操作
sysctl -p /etc/sysctl.conf
systemctl restart network 

# 重启docker!!!我在重启docker这个坑上栽了两个小时
systemctl restart docker

# 重启项目
docker run -d scenedeploy --name myscene -p 8082:8082



# 注意:如果下一次启动项目时又对应不上ip了,可以再重启一下
sysctl -p /etc/sysctl.conf
systemctl restart network

9.idea连接docker

        1.在对应目录下添加Dockerfile文件

       

        2.pom中添加docker配置

<dockerHost>http://公网IP:2375</dockerHost>换成自己的公网IP,本地的话localhost就行

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin><!--制作docker镜像的maven插件-->
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <dockerHost>http://公网IP:2375</dockerHost>
                    <imageName>scenedeploy</imageName><!--镜像名,注意:这里的镜像名一定要小写,如果你的应用名字是大写会报错的-->
                    <dockerDirectory>./</dockerDirectory><!--Dockerfile所在的目录-->
                    <resources>
                        <resource><!--这里配置的就是打包后jar所在的位置-->
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory><!--构建的class文件路径 一般是target-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

需要注意的是,你打包出来的名字可能是XXX.0.0.1.jar,可能没有和Dockerfile文件对应

这里要修改为 Dockerfile 中所对应的

FROM openjdk:8
VOLUME /tmp
EXPOSE 8082
ADD SceneDeploySystem-1.0.0.jar scene.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/scene.jar"]

        3.添加Docker插件

tcp://公网IP:2375

        4.添加docker工程

        5.点击docker:builder会创建项目镜像

        6.运行docker镜像

 

 

搞定!撒花!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值