微服务--docker学习

Docker容器

  • 初始Docker

    项目部署的问题:大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:微服务--docker学习_第1张图片

    • 依赖关系复杂,容易出现兼容性问题
    • 开发,测试生产环境有差异

    Docker如何解决依赖的兼容性问题?

    • 将应用的Libs(函数库),Deps(依赖),配置与应用一起打包
    • 将每个应用放到一个隔离容器去运行,避免互相干扰微服务--docker学习_第2张图片

    镜像与容器

    • 镜像(Image):Docker将应用程序及其所需的依赖,函数库,环境,配置等文件打包在一起,称为镜像。
    • 容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。微服务--docker学习_第3张图片

    DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。

    Docker架构

    Docker是一个CS架构的程序,由两部分组成:

    • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像,容器等
    • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。微服务--docker学习_第4张图片

    安装Docker:

    • 卸载docker
    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-selinux \
                      docker-engine-selinux \
                      docker-engine \
                      docker-ce
    
    • 安装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
      

      启动docker(先关闭防火墙)

      systemctl start docker
      

      配置镜像加速器

      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
        "registry-mirrors": ["https://hwaf3xix.mirror.aliyuncs.com"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
      
  • Docker的基本操作

    • 镜像操作微服务--docker学习_第5张图片

      docker build #构建镜像
      docker push  #推送镜像到服务
      docker images#查看镜像
      docker rmi   #删除镜像
      docker pull  #从服务拉取镜像
      docker save  #保存镜像为一个压缩包
      docker load  #加载压缩包为镜像
      
      • 案例从DockerHub中拉取一个nginx镜像并查看:

        • 1.进官网搜索nginx微服务--docker学习_第6张图片

        • 2.执行拉取命令

          docker pull nginx
          
        • 3.查看镜像

          docker images
          
      • 案例将nginx镜像导出磁盘,然后再通过load加载回来

        • 1.将nginx镜像导出

          docker save -o nginx.tar nginx:latest #-o代表输出 nginx.tar 是文件名
          
        • 2.将nginx镜像删除

          docker rmi nginx:latest 
          
        • 3.将之前导出的nginx镜像加载回去

          docker load -i nginx-1.20.2.tar.gz   #-i  后面跟上文件
          
    • 容器操作微服务--docker学习_第7张图片

      docker run  	 #容器创建和运行
      docker exec 	 #进入容器执行命令
      docker logs 	 #查看容器运行日志
      docker ps 		 #查看所有运行的容器及状态
      docker pause	 #暂停容器
      docker unpause   #取消暂停
      docker start	 #运行容器
      docker stop		 #停止容器
      
      • 案例创建运行一个Nginx容器

        • 1.去docker hub查看nginx的容器运行命令

          docker run --name containerName -p 80:80 -d nginx
          #docker run :创建并运行一个容器
          #--name:给容器起一个名字,比如叫做mn
          #-p: 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
          
      • 案例进入Nginx容器,修改HTML文件内容,添加“HelloWorld你好世界”

        • 1.进入创建的nginx容器

          docker exec -it nginxTest bash
          #docker exec:进入容器内部,执行一个命令
          #-it:给当前进入的容器创建一个标准输入,输出终端,允许我们与容器交互
          #nginxTest:要进入的容器的名称
          #bash:进入容器执行的命令,bash是一个linux终端交互命令
          
        • 2.在官网可以知道nginx容器静态资源目录在

          /usr/share/nginx/html  #在进入容器里面的目录路径
          
        • 3.修改静态文件

          sed -i 's#Welcome to nginx#HelloWorld你好世界#g' index.html
          sed -i 's###g' index.html
          
    • 数据卷(容器数据管理):作用 将容器与数据分离

      • 容器与数据耦合的问题
        1. 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便
        2. 数据不可复用:在容器内的修改是不可见的。所有修改对新建的容器是不可复用的。
        3. 升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了

      数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。微服务--docker学习_第8张图片

      数据卷操作的基本语法如下:

      docker volume[command]
      

      docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

      create 		#创建一个volume
      inspect 	#显示一个或多个volume的信息
      ls 			#列出所有的volume
      prune		#删除未使用的volume
      rm			#删除一个或多个指定的volume
      

      案例:创建一个数据卷,并查看数据卷在宿主机的目录位置

      1. 创建数据卷

        docker volume create html       #创建一个名为html的数据卷
        
      2. 查看所有数据

        docker volume ls				#查看所有的数据卷
        
      3. 查看数据卷详细信息卷

        docker volume inspect html
        
      4. 删除未使用卷

        docker volume prune
        
    • 挂载数据卷

      在创建容器时,可以通过 -v参数来挂载一个数据卷到某个容器目录

      docker run -name mn -v html:/root/html -p 8080:80 -d nginx
      #创建一个名为 mn的容器
      #-v  把html数据卷挂载到容器内的/root/html 这个目录中
      #-p  端口映射 
      
    • 创建一个nginx容器,修改容器内的html目录内的index.html内容

      1. 需求说明:进入nginx容器内部,已经知道nginx的html目录所在位置(/usr/share/nginx/html,需要把这个目录挂载到html这个数据卷上,方便操作其中的内容。)

      2. 创建容器并挂载数据卷到容器内的HTML目录

        docker run --name nginxTest2 -v html:/usr/share/nginx/html -p 6767:81 -d nginx
        
      3. 进入html数据卷所在位置,并修改HTML容器

        cd /var/lib/docker/volumes/html/_data
        
    • 创建并运行一个MySQL容器,将宿主机目录直接挂载到容器

      1. docker run 
        --name mysql5.4.7 
        -e MYSQL_ROOT_PASSWORD=redhat 
        -p 3309:3306 
        -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.conf 	#mysql配置文件挂载
        -v /tmp/mysql/data:/var/lib/mysql/ 						#mysql数据卷挂载
        -d mysql:5.7.41
        
  • Dockerfile自定义镜像

    • 镜像结构:镜像是分层结构,每一层称为一个Layer

      • 镜像是将应用程序及其需要的系统函数库,环境,配置,依赖打包而成。微服务--docker学习_第9张图片

      • BaseImage层:包含基本的系统函数库,环境变量,文件系统

      • Entrypoint:入口,是镜像中应用启动的命令

      • 其它:在BaseImage基础上添加依赖,安装程序,完成整个应用的安装和配置

    • 什么是Dockerfile:Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。微服务--docker学习_第10张图片

      官方文档:https://docs.docker.com/engine/reference/builder/

      案例基于镜像构建一个新镜像,运行一个Java项目

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

      2. 随便准备一个简单boot项目.jar文件到docker-demo这个目录

      3. 并将jdk8.tar.gz文件弄到docker-demo这个目录

      4. 将Dockerfile放到docker-demo这个目录

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

      6. 运行命令进行镜像构建

        docker build -f /root/docker-demo/Doerfile . -t javalove:1.0 #不同版本docker执行的命令不同
        
      7. 运行容器

        docker run --name love -p 1314:1314 -d javalove:1.0
        

        基于java:8-alpine镜像构建镜像

        # 指定基础镜像
        FROM java:8-apline
        
        # 暴露端口:docker-demo.jar打包时暴露的是1314端口
        EXPOSE 1314
        # 入口,java项目的启动命令
        ENTRYPOINT java -jar /tmp/love.jar
        
        
  • Docker-Compose

    • 初始DockerCompose:可以基于Compose帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器

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

        version: '3.8'
         
        services:
          mysql:
            # 镜像名
            image: mysql:5.7.25
            # 容器名(以后的控制都通过这个)
            container_name: mysql
            # 重启策略
            restart: always
            environment:
              # 时区上海
              TZ: Asia/Shanghai
              # root 密码
              MYSQL_ROOT_PASSWORD: root
              # 初始化数据库(后续的初始化sql会在这个库执行)
              MYSQL_DATABASE: nacos_config
              # 初始化用户(不能是root 会报错, 后续需要给新用户赋予权限)
              MYSQL_USER: redhat
              # 用户密码
              MYSQL_PASSWORD: redhat
              # 映射端口
            ports:
              - 3306:3306
            volumes:
              # 数据挂载
              #- /root/mysql/data/:/var/lib/mysql/
              # 配置挂载
              #- /root/mysql/conf/:/etc/mysql/conf.d/
              # 初始化目录挂载,注意此处我只跑了这个挂载,只是为了说明其他配置不应该数据初始化
              - /root/mysql/init/:/docker-entrypoint-initdb.d/
          web:
          	build:
          	ports:
          	  -8090:8090
        
      • 安装DockerCompose

        1. 下载与安装

          # 安装
          curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compos
          
        2. 修改文件权限

          chmod +x /usr/local/bin/docker-compose
          
        3. Base自动补全命令

          curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
          

          如果这里出现错误,需要修改自己的hosts文件:

          echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
          
    • 部署微服务集群

      • 案例:将之前cloud-demo利用DockerCompose集群部署微服务--docker学习_第11张图片

        docker-compose.yml

        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: root
            volumes:
              - "./mysql/data:/var/lib/mysql"
              - "./mysql/conf:/etc/mysql/conf.d/"
          userservice:
            build: ./user-service
          orderservice:
            build: ./order-service
          gateway:
            build: ./gateway
            ports:
              - "10010:10010"
        
        
        

        Dockerfile:

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

        进入could-demo目录进行构建

        docker-compose up -d
        
  • Docker镜像仓库:镜像仓库( Docker Registry )有公共的和私有的两种形式

    • 公共仓库:例如Docker官方的 Docker Hub,国内也有一些云服务商提供类似于 Docker Hub 的公开服务,比如 网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。
    • 除了使用公开仓库外,用户还可以在本地搭建私有 Docker Registry。企业自己的镜像最好是采用私有Docker Registry来实现。
    1. 配置Docker信任地址

      # 打开要修改的文件
      vi /etc/docker/daemon.json
      # 添加内容:
      "insecure-registries":["http://192.168.150.101:8080"]
      # 重加载
      systemctl daemon-reload
      # 重启docker
      systemctl restart docker
      
    2. 简化版镜像仓库

      docker run -d \
          --restart=always \
          --name registry	\
          -p 5000:5000 \
          -v registry-data:/var/lib/registry \
          registry
      
      
    3. 带有图形化界面版本docker-compose.yaml 文件 docker-compose up -d 执行

      version: '3.0'
      services:
        registry:
          image: registry
          volumes:
            - ./registry-data:/var/lib/registry
        ui:
          image: joxit/docker-registry-ui:static
          ports:
            - 8080:80
          environment:
            - REGISTRY_TITLE=私有仓库名称
            - REGISTRY_URL=http://registry:5000
          depends_on:
            - registry
      
      

      在这里插入图片描述

你可能感兴趣的:(Java,docker,微服务,学习)