将微服务项目利用Docker部署到服务器

一、Docker基本知识

写DockerFile文件创建自己的镜像

volumn挂载目录

容器间通信:同一network下

docker-compose进行多容器部署

二、部署过程(docker-hub网站里有现成容器部署方案)

1.部署nacos

docker-compose中内容如下:

version: "3.3"


services:
  nacos:
    image: nacos/nacos-server:2.0.2    #镜像
    ports:                             #端口映射,容器端口映射到服务器端口上
      - "8848:8848"
    environment:                       #运行参数配置
      - "JVM_XMS=256m"
      - "JVM_XMX=256m"
      - "MODE=standalone"

2.部署mysql

docker-compose中内容更新如下:

version: "3.9"

networks:
  yingxue_network:

volumes:
  data:

services:
  nacos:
    image: nacos/nacos-server:2.0.2
    ports:
      - "8848:8848"
    environment:
      - "JVM_XMS=256m"
      - "JVM_XMX=256m"
      - "MODE=standalone"
    networks:
      - yingxue_network

  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    networks:
      - yingxue_network
    volumes:
      - data:/var/lib/mysql                                    #挂载数据卷,参考的docker-hub
      - ./yingxue.sql:/docker-entrypoint-initdb.d/yingxue.sql  #将这个sql文件挂载到初始化位置,让这个sql文件执行
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
      - "MYSQL_DATABASE=yingxue"

3.部署redis

docker-compose中内容更新如下:

version: "3.3"

networks:
  yingxue_network:

volumes:
  data:
  redisdata:
services:
  nacos:
    image: nacos/nacos-server:2.0.2
    ports:
      - "8848:8848"
    environment:
      - "JVM_XMS=256m"
      - "JVM_XMX=256m"
      - "MODE=standalone"
    networks:
      - yingxue_network


  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    networks:
      - yingxue_network
    volumes:
      - data:/var/lib/mysql
      - ./yingxue.sql:/docker-entrypoint-initdb.d/yingxue.sql
    environment:
      - "MYSQL_ROOT_PASSWORD=123"
      - "MYSQL_DATABASE=yingxue"

  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - redisdata:/data

4.部署微服务后台代码

对于微服务来说,没法用maven对每一个进行打包。

maven聚合打包位置,注意不能在每个模块下边用package,要点击根目录下的package,这样就能打包所有的模块了。

上边是错的,正确的打包位置:

如果部署过程中报没有主清单属性,则需要在每个模块添加插件,并且指明主类。

 打包完以后,每一个模块下都会出现一个jar包。

然后我们创建一个image文件夹,下边有各个模块的文件夹,然后把对应jar包放入对应文件夹,并在每一个文件夹下创建一个DockerFile文件,借助这个将其构建为镜像。 

 

 

 

 我们以其中两个DockerFile文件为例。来看一下它是如何构建镜像的。

FROM openjdk:8-jre
ENV APP_PATH=/apps
WORKDIR $APP_PATH
COPY yingxue-admins-1.0-SNAPSHOT.jar $APP_PATH/app.jar
EXPOSE 8980
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]
FROM openjdk:8-jre
ENV APP_PATH=/apps
WORKDIR $APP_PATH
COPY yingxue-category-1.0-SNAPSHOT.jar $APP_PATH/app.jar
EXPOSE 8981
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]

然后我们在Docker-compose文件中增加这几个镜像,运行docker-compose让这些镜像在容器中运行。

version: "3.9"

networks:
  yingxue_network:

volumes:
  data:
  redisdata:

services:
  nacos:
    image: nacos/nacos-server:2.0.2
    ports:
      - "8848:8848"
    environment:
      - "JVM_XMS=256m"
      - "JVM_XMX=256m"
      - "MODE=standalone"
    networks:
      - yingxue_network

  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    networks:
      - yingxue_network
    volumes:
      - data:/var/lib/mysql
      - ./yingxue.sql:/docker-entrypoint-initdb.d/yingxue.sql
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
      - "MYSQL_DATABASE=yingxue"


  redis:
    image: redis:5.0.10
    ports:
      - "6379:6379"
    volumes:
      - redisdata:/data

  admins:
    build:
      context: ./images/admins
      dockerfile: Dockerfile
    ports:
      - "8980:8980"
    depends_on:
      - mysql
      - nacos
      - redis

  category:
    build:
      context: ./images/category
      dockerfile: Dockerfile
    ports:
      - "8981:8981"
    depends_on:
      - mysql
      - nacos
      - redis

  gateway:
    build:
      context: ./images/gateway
      dockerfile: Dockerfile
    ports:
      - "9999:9999"
    depends_on:
      - mysql
      - nacos
      - redis

  users:
    build:
      context: ./images/users
      dockerfile: Dockerfile
    ports:
      - "8982:8982"
    depends_on:
      - mysql
      - nacos
      - redis

  videos:
    build:
      context: ./images/videos
      dockerfile: Dockerfile
    ports:
      - "8983:8983"
    depends_on:
      - mysql
      - nacos
      - redis

我们在linux系统下/root目录下创建一个运行当前项目的文件夹,然后将compose文件以及image文件夹放进去。然后进入到当前项目文件夹,使用docker-compose up -d命令运行即可。

 

 

 

补充:docker-compose具体语法详解:

version: "3"  # 指定docker-compose语法版本
services:    # 从以下定义服务配置列表
  server_name:   # 可将server_name替换为自定义的名字,如mysql/php都可以
    container_name: container_name  # 指定实例化后的容器名,可将container_name替换为自定义名
    image: xxx:latest # 指定使用的镜像名及标签
    build:  # 如果没有现成的镜像,需要自己构建使用这个选项
      context: /xxx/xxx/Dockerfile  # 指定构建镜像文件的路径
      dockerfile: ....     # 指定Dockerfile文件名,上一条指定,这一条就不要了
    ports:
      - "00:00"  # 容器内的映射端口,本地端口:容器内端口
      - "00:00"  # 可指定多个
    volumes:
      - test1:/xx/xx  # 这里使用managed volume的方法,将容器内的目录映射到物理机,方便管理
      - test2:/xx/xx  # 前者是volumes目录下的名字,后者是容器内目录
      - test3:/xx/xx  # 在文件的最后还要使用volumes指定这几个tests
    volumes_from:  # 指定卷容器
       - volume_container_name  # 卷容器名
    restarts: always  # 设置无论遇到什么错,重启容器
    depends_on:       # 用来解决依赖关系,如这个服务的启动,必须在哪个服务启动之后
      - server_name   # 这个是名字其他服务在这个文件中的server_name
      - server_name1  # 按照先后顺序启动
    links:  # 与depend_on相对应,上面控制容器启动,这个控制容器连接
      - mysql  # 值可以是- 服务名,比较复杂,可以在该服务中使用links中mysql代替这个mysql的ip
    networks: # 加入指定的网络,与之前的添加网卡名类似
      - my_net  # bridge类型的网卡名
      - myapp_net # 如果没有网卡会被创建,建议使用时先创建号,在指定
    environment: # 定义变量,类似dockerfile中的ENV
      - TZ=Asia/Shanghai  # 这里设置容器的时区为亚洲上海,也就解决了容器通过compose编排启动的 时区问题!!!!解决了容器的时区问题!!!
      变量值: 变量名   # 这些变量将会被直接写到镜像中的/etc/profile
    command: [                        #使用 command 可以覆盖容器启动后默认执行的命令
            '--character-set-server=utf8mb4',            #设置数据库表的数据集
            '--collation-server=utf8mb4_unicode_ci',    #设置数据库表的数据集
            '--default-time-zone=+8:00'                    #设置mysql数据库的 时区问题!!!! 而不是设置容器的时区问题!!!!
    ]
  server_name2:  # 开始第二个容器
    server_name:
      stdin_open: true # 类似于docker run -d
      tty: true  # 类似于docker run -t
volumes:   # 以上每个服务中挂载映射的目录都在这里写入一次,也叫作声明volume
  test1:
  test2:
  test3:
networks:  # 如果要指定ip网段,还是创建好在使用即可,声明networks
  my_net:
    driver: bridge  # 指定网卡类型
  myapp_net:
    driver: bridge 

 

posted @ 2022-12-21 17:41  一直学习的程序小白  阅读(953)  评论(0编辑  收藏  举报