完整的项目部署发布篇

前言:

学习前面的Ddocker-compose 部署各种服务,都是为了这一步作为铺垫,搭建部署了自己的GiTLab,以及自己nexus,还有自己的Harbor,关于这三个的服务的介绍这里不做过多的赘述,这里大致说一下部署的流程:

第一步:

我们去到自己的搭建的GitLab拉取全部代码

1
2
> git clone .....
>
第二步:

把自己的代码打包全部上传到nexus

1
2
> mvn clean deploy -Dmaven.test.skip=true
>
第三步 一次构建到处运行:

部署到Harbor

更多服务详细信息参考:https://hub.docker.com/

操作步骤

1,新建一个文件夹为myshop 叫其他名字都可以,把打包好的代码压缩包,上传到这个文件夹下面


2,在这个文件夹下面定制镜像:

1
root@ubuntu:/usr/local/docker/myshop# vi Dockerfile

内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM tomcat:9.0-jre8  //这是tomcat的版本


RUN rm -fr /usr/local/tomcat/webapps/ROOT/*
COPY my-shop-web-admin-1.0.0-SNAPSHOT.zip /usr/local/tomcat/webapps/ROOT

WORKDIR /usr/local/tomcat/webapps/ROOT
RUN unzip my-shop-web-admin-1.0.0-SNAPSHOT.zip \
&& rm -fr my-shop-web-admin-1.0.0-SNAPSHOT.zip

WORKDIR /usr/local/tomcat

EXPOSE 8080

3,构建Dockerfile:如果没有tomcat的镜像的话会帮你自动下载一个镜像

1
root@ubuntu:/usr/local/docker/myshop# docker build -t mashop-admin .

4,然后使用Dokcer images,会看到有一个myshop-admin的镜像,新建一个docker-compose.yml文件启动这个镜像

1
2
3
4
5
6
7
version: '3.1'
services:
myshop-admin:
image: myshop-admin
container_name: myshop-admin
ports:
- 8088:8080

这个时候如果数据库不是安装在同一台linux机器上面的话,需要去把数据库的镜像给启动起来,还有就是项目连接的是mysql的数据库,连接的url千万不要写错了,不然重新构建有一点麻烦的,这一点千万要注意


5,然后启动这个docker-compose:

1
docker-compose up -d

6,观察日志:看控制台有没有报错,如果有报错的地方都会在日志中显示出来,方便找出问题

1
docker-compose logs -f

7,报错的话,可以先dow掉,然后再来

1
docker-compose down

如果存在虚悬镜像,可以删除虚悬镜像:docker image prune


访问:

http://192.168.199.xxx:8088/ 你的inux机器的ip地址加上8088即可看到项目页面

把镜像push到Harbor

1,标记这个镜像:

1
docker tag myshop-admin 192.168.199.148/myshop/admin

查看镜像docker images,你会看到有一个带着端口的myshop/admin


2,上传到私服

1
docker push 192.168.199.148/myshop/admin

不同的linux环境下运行:

在不同的linux机器上面部署运行


1,配置docker客户端

1
root@deployment:/usr/local/docker/myshop# vi /etc/docker/daemon.json

2,添加一点内容:

1
2
3
4
5
6
7
{
"registry-mirrors":["https://zyw2lmzb.mirror.aliyuncs.com"],
"insecure-registries":[
"192.168.199.148" //这是Harbor部署的ip地址

]
}

3,配置完这个,需要重启docker

1
root@deployment:/usr/local/docker/myshop# systemctl restart docker拉取

4,我们先登陆

1
root@deployment:/usr/local/docker/myshop# docker login 192.168.199.148 -u admin -p Harbor12345

5,然后拉取这个镜像:

1
root@deployment:/usr/local/docker/myshop# docker pull 192.168.199.148/myshop/admin

6,新建一个docker-compose.yml:这里的镜像名稍微有点区别,可以使用dokcer images 查看镜像的名字

1
2
3
4
5
6
7
version: '3.1'
services:
myshop-admin:
image: 192.168.199.148/myshop/admin
container_name: myshop-admin
ports:
- 8088:8080

7,运行这个镜像:

1
root@deployment:/usr/local/docker/myshop# docker-compose up -d

访问:

http://192.168.199.xxx:8088/login 你的linux机器的ip地址加上8088即可看到项目页面

通过服务名部署项目

  • 以上都是测试环境所实验的结果,在实际部署的时候我们的数据库不应该被外部的数据库连接工具连接到,但是可以在同一局域网内被tomcat可以访问到;

  • 我们在之前的测试过程中,我不小心把数据库的连接地址写错了,这样的方式很容易出错,也就是很不靠谱,我们需要把连接IP地址换成我们的服务名,这样显得更加的安全。

1,让tomcat和mysql在同一个局域网内,以便我们使用主机名(服务名),来进行访问

查看docker 默认的 网络

1
root@deployment:/usr/local/docker/myshop# docker network ls

2,细心可以发现在启动mysql的时候,会输出这么一句话,也就是容器都有自己网络,不是在同一个局域网之中的。当然如果你启动tomcat同样也会创建一个tomcat的网络


3,如果是在同一个compose 里面,当然可以通过服务名来进行访问,我们需要把不同的compose 在相同的局域网内


4,我们可以创建一个myshop_network网络:让Compose 加入这个新创建的网络,让所有的Compose可以通信,查看网络就可以看到多了一个 myshop_network 的网络

1
root@deployment:/usr/local/docker/myshop# docker network create myshop_network

5,配置mysql的 docker-compose 文件:

1
2
3
4
networks:
default:
external:
name: myshop_network

6,配置 myshop(项目名字)的docker-compose 文件

1
2
3
4
networks:
default:
external:
name: myshop_network

7,再次启动项目就不会去创建自己默认的网络了,然后修改mysql的docker-compose 文件,把端口号删掉,这样公网就访问不到mysql 了,基于docker隔离机制。


8,这个时候我们就可以基于服务名去访问,比如我的mysql服务名就是db,在项目的数据库连接配置文件当中连接IP地址改为db 即可,再次打包进行上传到我们myshop文件夹下。


9,重新构建:这里带了IP这样就不用再次去标记了

1
root@ubuntu:/usr/local/docker/myshop# docker build -t 192.168.199.148/myshop/admin .

10,然后再上传到私服:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@ubuntu:/usr/local/docker/myshop# docker push 192.168.199.148/myshop/admin

#输出如下
The push refers to repository [192.168.199.148/myshop/admin]
2ce04fb23096: Layer already exists
235969d4ed49: Layer already exists
93b9e711a12d: Layer already exists
aa6264ff0dcd: Layer already exists
2e33d763e75d: Layer already exists
f0e1731fd286: Layer already exists
2b6c38ff3137: Layer already exists
d38f3d5a39fb: Layer already exists
fe60061c6c4e: Layer already exists
7d63f8777ebf: Layer already exists
1b958b53b256: Layer already exists
2c719774c1e1: Layer already exists
ec62f19bb3aa: Layer already exists
f94641f1fe1f: Layer already exists
latest: digest: sha256:11db132f41eff185ef6b9ca9b85c507337cd0f2aed209038339562396e7dafb8 size: 3257

11,这个时候就可以去另外一个机器上把最新的镜像给pull下来:

1
root@deployment:/usr/local/docker/myshop# docker pull 192.168.199.148/myshop/admin

12,最后启动即可:

1
root@deployment:/usr/local/docker/myshop# docker-compose up -d

这样就完成了在不同的容器中,各自都实现了各自的局域网,以上就避免了把所有的端口暴露在了公网,这样极其不安全。这只是上生产的时候要注意的,开发中是不必要这样做的。

查看项目的配置文件改掉了没:

1
root@deployment:/usr/local/docker/myshop# docker exec -it myshop-admin /bin/bash

然后去到webapps–>ROOT–>找到项目的数据库配置文件 cat 一下 即可看到内容

原则:实际项目部署的时候只有一个东西对外提供服务


END


到此项目的部署完成

最后要说的是,虽然部署过程不是太复杂,但是还是需要细心,在连接数据库的url地址上我花了好几个小时的时候,最后的原因是因为,密码写错了。这是个低级的不能再低级的错误了