docker-compose部署微服务项目

想在linux服务器上运行微服务项目首先需要将其打包,在本地上也要能运行起来(打包成jar包并用java -jar xx.jar去运行),然后再去添加一些配置文件,放到docker上就可以运行了。具体操作如下:

1.第一步添加plugins打包的依赖

这是父工程的依赖

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

第二级父工程:

   <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

 如果是报错说找不到某个公共工具包如commonutil,可以尝试在plugin标签下加:

<executions>
   <execution>
       <goals>
          <!--可以把依赖的包都打包到生成的Jar包中-->
          <goal>repackage</goal>
       </goals>
   </execution>
</executions>

如果报错找不到主方法入口或者主菜单,在plugin下加:

<configuration>
      <!-- 指定该Main Class为全局的唯一入口 -->
     <mainClass>主启动类的相对路径如:com.xx.xx.Main</mainClass>
     <layout>ZIP</layout>
</configuration>

如果是公共包需要打包,可以在公共包的pom文件下加上:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>
    </plugins>
</build>

2.第二步,修改每一个yml文件或者properties文件

修改配置文件,将本地的localhost改成线上的服务器的ip地址,包括mysql的数据源配置和redis的主机地址、nacos等等。

3.第三步,clean,package

 打包完成以后可以看到每一个模块下面都有一个target文件夹,点进去发现有一个jar包,有主方法的会有一个.original的包在下面

然后cmd进入这个文件夹用java -jar  xx.jar运行,如果没报错基本上没啥问题。如果能在线上的nacos查看到服务已经注册那就可以了。

4、新建文件夹,将所有的jar包取出来放进去

我新建了一个service文件夹

然后里面嵌套了很多文件夹,因为每一个jar包都要有一个单独的Dockerfile文件和它放到一起

 

 如下:

 有多级的也要分多级存放:

 

5.配置Dockerfile文件和docker-compose.yml文件

接着就是配置每一个jar包配对的Dockerfile文件了

以下是我的模板:

Dockerfile:

FROM openjdk:8-jdk-alpine  #拉取镜像
ADD xxxx.jar /xxxx.jar #将这个jar包添加到工作目录
EXPOSE 1111  #服务暴露的端口号
ENTRYPOINT ["java","-jar","/xxxx.jar"]  #启动jar包的命令

 然后配置一个总的docker-compose.yml文件,这个文件将作为入口去找到所有的微服务的Dockerfile运行启动命令。

#复制的时候要注意格式,多一个或少一个空格都会导致运行失败

#版本要注意,要留意linux系统的docker-compose的版本是多少,我的是1.29.1
#所以对应的是3.8
version: "3.8" 

#下面会创建一个网络
networks:
  my-net:
   
volumes:
  data:
    
services:
#对每一个服务起别名
  service-name1:
    build:
      #docker文件所在路径,相对于当前这个文件的
      context: ./service/xxx
      dockerfile: Dockerfile
    ports:
      - "暴露的端口:暴露的端口"#当前服务的端口:想在线上暴露的端口
    networks:
      - my-net

  service-name1:
    build:
      #docker文件所在路径,相对于当前这个文件的
      context: ./service/xxx
      dockerfile: Dockerfile
    ports:
      - "暴露的端口:暴露的端口"#当前服务的端口:想在线上暴露的端口
    networks:
      - my-net
        

6.将所有文件(我这里是最外层的serivce)扔到服务器上

 7.安装docker和docker-compose以及拉取需要的服务

安装docker前:

        安装yum工具:

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

        更新本地镜像源:

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

安装docker:

yum install -y docker-ce

启动前一定要关闭防火墙

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
#查看是否关闭防火墙
systemctl status firewalld

启动docker: 

systemctl start docker

查看是否启动:

systemctl status docker

下一步,创建一个网络:

docker network create my-net

这个是GitHub的下载命令:

sudo curl -L https://github.com/docker/compose/releases/download/1.29.1/docker-compose-'uname -s'-'uname -m'-o /usr/local/bin/docker-compose

如果上面比较慢就用下面的:

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-'uname -s'-'uname -m'-o /usr/local/bin/docker-compose

拉取需要使用的mysql8和nacos(我自己拉下来的nacos用不了,如果你也是,那建议自己去下载,不要用docker拉)

redis、nginx以及其他的一些服务都可以拉取,可以上网自己搜,我这边就不呈现了

docker pull mysql

docker pull nacos/nacos-server

拉取完以后启动mysql和nacos

#启动mysql
docker run -it --name mysql8 -e MYSQL-ROOT_PASSWORD=密码 -p 3306:3306 --network my-net --network-alias mysql-net --restart=always -d mysql

#启动nacos,启动前记得先把nacos的数据库弄到linux上的数据库里面
docker run -it --name nacos2 \
-e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone \
-e SPRING_DATASOURCE_PLATFROM=mysql -e MYSQL_SERVICE_HOST=主机ip \
-e NACOS_AUTH_IDENTITY_KEY=my-identity-key \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=数据库密码 \
-e MYSQL_SERVICE_DB_NAME=nacos的配置数据库 \
-p 8848:8848 -p 9848:9848 -d nacos/nacos-server \
--restart=always

启动成功以后用docker ps -a可以看到docker容器中有mysql 和nacos的服务。

mysql:

使用docker exec -it mysql8 bash可以进入mysql登录面板:

然后输入mysql -u root -p和密码即可登录

nacos:

先去把这个文件执行到上面的mysql里面

 

 

进入到/usr/nacos/nacos/bin目录,对startup.sh文件添加java环境;

然后对下面这个文件执行启动命令:./startup.sh -m standalone以单机的模式启动。

 

尝试去访问http:ip:8848/nacos如果能进去那说明nacos启动成功。 

安装docker-compose

#github镜像
sudo curl -L https://github.com/docker/compose/releases/download/1.29.1/docker-compose-'uname -s'-'uname -m'-o /usr/local/bin/docker-compose

#国内镜像
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-'uname -s'-'uname -m'-o /usr/local/bin/docker-compose

安装完成以后进行添加执行权限

sudo chmod +x /usr/local/bin/docker-compose

测试安装结果

docker-compose --version

 8、启动所有服务

首先cd到刚刚上传到linux的项目文件夹,必须进到有docker-compose.yml文件的文件夹

 执行

#启动所有的service
docker-compose up -d

#启动单个service
docker-compose up -d canal

 如果是第一次启动项目会自动去下载依赖和构建项目,且一个个去运行。然后就可以看到docker中存在的服务

然后再去访问自己的后端的接口,如果能访问成功就说明部署成功。不访问成功建议先去本地跑一遍报错的那些服务,看看本地会不会报错,如果本地也报错那在本地调试好后在重新把对应服务的jar包拉到服务器上,这时候因为docker中已经存在了这个服务的镜像,所以可以使用

docker ps -a

 找到出问题的那个服务,并把最开始的进程号复制下来,将这个进程删除

docker rm 进程号

然后对这个镜像进行重建:

docker-compose up --build 服务名

下面是常用的命令:

#查看某个服务的日志
docker logs 容器id

#查看docker中的镜像信息,比如占用内存和镜像id
docker images

#停止一个镜像容器的运行
docker stop 容器id

#查看某个服务的状态:如nginx
ps -ef | grep nginx

#docker启动redis面板
docker exec -it redis镜像名称 bash

#后台启动本地redis服务,进入redis的文件夹
redis-server redis.conf &

#进入redis
redis-cli

#查看docker的运行状态和信息
systemctl status docker

#停止/重启/启动运行docker
systemctl stop/restart/start docker

#查看端口是否被占用
sudo netstat -lnp | grep :端口号

#杀死进程
kill 进程号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值