[GN] 微服务开发框架 --- Docker的应用 (24.1.9)

文章目录

  • 前言
    • Docekr
      • 镜像命令
    • Docekr
      • 镜像命令
      • 容器操作
        • 创建容器
        • 查看容器日志
        • 查看容器状态
        • 进入容器
      • 数据卷
        • 数据集操作命令
        • 给nginx挂载数据卷
        • 给MySQL挂载本地目录
      • Dockerfile自定义镜像
        • 镜像结构
      • 使用Dockerfile构建Java项目
        • 基于Ubuntu构建Java项目
        • 基于java8构建Java项目
      • Docker-Compose
        • 初识DockerCompose
        • 部署微服务集群
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

Docekr

首先去DockerHub中选择一个镜像 这里以nginx镜像为例

镜像命令

  • 镜像拉取
docker pull nginx
  • 查看拉取到的镜像
docker images
  • 保存镜像
docker save --help //查看用法
docker save -o [保存的目标文件名称] [镜像名称]

docker save -o nginx.tar nginx:latest //导出镜像到磁盘 

在这里插入图片描述

  • 导入镜像

先删除本地的nginx镜像:

docker rmi nginx:latest

然后运行命令,加载本地文件:

docker load -i nginx.tar

Docekr

首先去DockerHub中选择一个镜像 这里以nginx镜像为例

镜像命令

  • 镜像拉取
docker pull nginx
  • 查看拉取到的镜像
docker images
  • 保存镜像
docker save --help //查看用法
docker save -o [保存的目标文件名称] [镜像名称]

docker save -o nginx.tar nginx:latest //导出镜像到磁盘 

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第1张图片

  • 导入镜像

先删除本地的nginx镜像:

docker rmi nginx:latest

然后运行命令,加载本地文件:

docker load -i nginx.tar

在这里插入图片描述

容器操作

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第2张图片

其中:

  • docker run:创建并运行一个容器,处于运行状态

  • docker pause:让一个运行的容器暂停

  • docker unpause:让一个容器从暂停状态恢复运行

  • docker stop:停止一个运行的容器

  • docker start:让一个停止的容器再次运行

  • docker rm:删除一个容器

创建容器

创建并运行nginx容器的命令:

docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run :创建并运行一个容器
  • –name : 给容器起一个名字,比如叫做mn
  • -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
  • -d:后台运行容器
  • nginx:镜像名称,例如nginx

默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。

现在,将容器的80与宿主机的80关联起.

查看容器日志
 docker logs
- 添加 -f 参数可以持续查看日志
查看容器状态
 docker ps
- docker ps -a 查看所有容器,包括已经停止的
进入容器
docker exec -it [容器名] [要执行的命令]

数据卷

**数据卷(volume)**是一个虚拟目录,指向宿主机文件系统中的某个目录。

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第3张图片

虚拟的数据卷指向文件系统

但容器中的文件指向数据卷

即操作文件系统内的文件相当于操作容器

数据集操作命令

数据卷的作用:

  • 将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全

数据卷操作:

  • docker volume create:创建数据卷
  • docker volume ls:查看所有数据卷
  • docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置
  • docker volume rm:删除指定数据卷
  • docker volume prune:删除所有未使用的数据卷

单纯创建一个数据卷

docker volume create html

查看数据卷在宿主机目录位置

docker volume ls

在这里插入图片描述

查看数据卷详细信息卷

docker volume inspect html

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第4张图片

可以看到,我们创建的html这个数据卷关联的宿主机目录

给nginx挂载数据卷

已经知道nginx的html目录所在位置/usr/share/nginx/html

  1. 在创建nginx容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
  • -v html:/usr/share/nginx/html :把html数据卷挂载到容器内的/usr/share/nginx/html这个目录中
  1. 查看html数据卷所在文件系统位置
# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
给MySQL挂载本地目录

上述是系统为我们分配数据卷映射到宿主机位置,

需要 docker volume inspect 去查看位置

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第5张图片

下面我们介绍直接挂栽到宿主机目录上的方式

  1. 目录挂载与数据卷挂载的语法是类似的:

    • -v [宿主机目录]:[容器内目录]

    • -v [宿主机文件]:[容器内文件]

  2. 创建并运行一个MySQL容器,将宿主机目录直接挂载到容器

    • 在将课前资料中的mysql.tar文件上传到虚拟机,通过load命令加载为镜像 docker -i load ~

    • 创建目录/tmp/mysql/data

    • 创建目录/tmp/mysql/conf,将课前资料提供的hmy.cnf文件上传到/tmp/mysql/conf

    • 去DockerHub查阅资料,创建并运行MySQL容器,要求:

      ① 挂载/tmp/mysql/data到mysql容器内数据存储目录

      ② 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件

      ③ 设置MySQL密码

目录挂载自己动手创建目录 直接实现 宿主机目录 与 容器目录 相映射, 虽然耦合度高 但易查找

数据卷挂载 docker 管理 耦合度低 但目录深

Dockerfile自定义镜像

镜像结构

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第6张图片

构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

而描述上述信息的文件就是Dockerfile文件。

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第7张图片

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

使用Dockerfile构建Java项目

基于Ubuntu构建Java项目

基于Ubuntu镜像构建一个新镜像,运行一个java项目

  1. 新建一个空文件夹docker-demo

  2. 拷贝资料提供的Dockerfile到docker-demo这个目录
    [GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第8张图片

  3. 其中的内容如下:

    # 指定基础镜像
    FROM ubuntu:16.04
    # 配置环境变量,JDK的安装目录
    ENV JAVA_DIR=/usr/local
    
    # 拷贝jdk和java项目的包
    COPY ./jdk8.tar.gz $JAVA_DIR/
    COPY ./docker-demo.jar /tmp/app.jar
    
    # 安装JDK
    RUN cd $JAVA_DIR \
     && tar -xf ./jdk8.tar.gz \
     && mv ./jdk1.8.0_144 ./java8
    
    # 配置环境变量
    ENV JAVA_HOME=$JAVA_DIR/java8
    ENV PATH=$PATH:$JAVA_HOME/bin
    
    # 暴露端口
    EXPOSE 8090
    # 入口,java项目的启动命令
    ENTRYPOINT java -jar /tmp/app.jar
    
  4. 步骤5:进入docker-demo

    将准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下

  5. 步骤6:运行命令:

    docker build -t javaweb:1.0 .
    

    就可以访问你的web项目了

基于java8构建Java项目

我们都可以在一些安装了部分软件的基础镜像 ------ java:8-alpine 上做改造

  • ① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

  • ② 拷贝课前资料提供的docker-demo.jar到这个目录中

  • ③ 编写Dockerfile文件:

    • a )基于java:8-alpine作为基础镜像

    • b )将app.jar拷贝到镜像中

    • c )暴露端口

    • d )编写入口ENTRYPOINT

      内容如下:

      FROM java:8-alpine
      COPY ./app.jar /tmp/app.jar
      EXPOSE 8090
      ENTRYPOINT java -jar /tmp/app.jar
      
  • ④ 使用docker build命令构建镜像

  • ⑤ 使用docker run创建容器并运行

Docker-Compose

初识DockerCompose

Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。格式如下:

version: "3.8"
 services:
  mysql:
    image: mysql:5.7.25
    environment:
     MYSQL_ROOT_PASSWORD: 123 
    volumes:
     - "/tmp/mysql/data:/var/lib/mysql"
     - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
  web:
    build: .
    ports:
     - "8090:8090"

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第9张图片

上面的Compose文件就描述一个项目,其中包含两个容器:

微服务集群不犹豫端口映射

  • 第一个容器名称即 mysql。 环境变量(environment) ; 镜像名称(image);

    数据卷映射(volumes)

  • 第二个容器名称即 web。这里没有镜像,选择了先在当前目录构建镜像

部署微服务集群

将之前文章写好的 user_service 和 order_service的项目进行微服务集群部署

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第10张图片

  1. 先建立一个cloud_demo文件,在里面建立三个微服务文件夹gateway, user-service, order-service 并编写Dockerfile。并将每个项目jar包放进去

    • Dockerfile是自定义构建镜像, 并运行java项目的Jar包 构成微服务

    • FROM java:8-alpine
      COPY ./app.jar /tmp/app.jar
      ENTRYPOINT java -jar /tmp/app.jar
      

      在这里插入图片描述

  2. 另外三个微服务是基于mysql的,还要建mysql文件夹,并包含conf daya文件配置

image-20240109093534113
  1. 使用docker-compose文件搭建微服务,所以在建个docker-compose,yml

    • 项目,将数据库、nacos地址都命名为docker-compose中的服务名

    • version: "3.2"
      
      services:
        nacos:
          image: nacos/nacos-server
          environment:
            MODE: standalone
          ports:
            - "8848:8848"
        mysql:
          image: mysql:5.7.25
          environment:
            MYSQL_ROOT_PASSWORD: 123
          volumes:
            - "$PWD/mysql/data:/var/lib/mysql"
            - "$PWD/mysql/conf:/etc/mysql/conf.d/"
        userservice:
          build: ./user-service
        orderservice:
          build: ./order-service
        gateway:
          build: ./gateway
          ports:
            - "10010:10010"
      
      • nacos:作为注册中心和配置中心
        • image: nacos/nacos-server: 基于nacos/nacos-server镜像构建
        • environment:环境变量
          • MODE: standalone:单点模式启动
        • ports:端口映射,这里暴露了8848端口
      • mysql:数据库
        • image: mysql:5.7.25:镜像版本是mysql:5.7.25
        • environment:环境变量
          • MYSQL_ROOT_PASSWORD: 123:设置数据库root账户的密码为123
        • volumes:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
      • userserviceorderservicegateway:都是基于Dockerfile临时构建的

[GN] 微服务开发框架 --- Docker的应用 (24.1.9)_第11张图片

  1. 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(微服务,docker,架构)