Docker(黑马spring cloud笔记)

小明 2025-05-02 17:54:39 6

Docker

目录

  • Docker
    • 一、介绍和安装
      • 1. 安装
      • 2. 启动
      • 3. 镜像加速
      • 二、Docker基本操作
        • 1. 镜像操作
        • 2. 容器操作
        • 3. 数据卷操作
        • 三、Dockerfile
          • 1. 镜像结构
          • 2. Dockerfile
          • 四、Docker-Compose
            • 1. 安装
            • 2. 基本命令
            • 五、Docker私服搭建
            • 六、练习
              • 练习1:save和load
              • 练习2:docker部署nginx
                • 问题:修改主页
                • 练习3:部署MySQL
                • 练习4:基于Ubuntu构建一个新镜像,运行一个java项目
                  • 问题 层数太多,每次都要安装jdk
                  • 练习5:部署微服务集群
                    • 问题:���服务注册失败

                      一、介绍和安装

                      Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

                      Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

                      容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

                      几个概念:

                      • 镜像(image):Docker将应用程序及其所需要的依赖、函数库等打包在一起,即为镜像。
                      • 容器:镜像中的应用程序运行后形成的进程。
                      • Docker Registry:镜像托管平台,如DockerHub,网易云镜像服务,阿里云镜像服务。

                        docker架构:

                        1. 安装

                        可以先选择卸载:

                        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 install -y yum-utils \
                                   device-mapper-persistent-data \
                                   lvm2 --skip-broken
                        

                        设置docker仓库:

                        # 设置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
                        

                        2. 启动

                        # 关闭防火墙
                        systemctl stop firewalld
                        # 禁止开机启动防火墙
                        systemctl disable firewalld
                        # 启动docker服务
                        systemctl start docker
                        # 停止docker服务
                        systemctl stop docker  
                        # 重启docker服务
                        systemctl restart docker  
                        # 查看docker版本
                        docker -v
                        

                        3. 镜像加速

                        参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

                        二、Docker基本操作

                        1. 镜像操作

                        一些简单的操作:

                        # 查看镜像
                        docker images
                        # 删除镜像
                        docker rmi 
                        # 拉取镜像
                        docker pull
                        # 推送镜像到Docker Registry
                        docker push
                        # 保存镜像为tar包
                        docker save
                        # 加载tar包为镜像
                        docker load
                        …………
                        

                        命令有很多,不必记忆,勤用 --help

                        例如:

                        docker images --help
                        

                        2. 容器操作

                        一些简单的容器操作:

                        # 创建容器
                        docker run
                        # 进入容器
                        docker exec
                        # 查看容器日志(添加-f可以持续查看)
                        docker logs 
                        # 查看容器
                        docker ps
                        # 删除容器
                        docker rm
                        …………
                        

                        3. 数据卷操作

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

                        docker volume [COMMAND]
                        
                        • create 创建数据卷
                        • inspect 显示一个或多个数据卷的信息
                        • ls 列出所有数据卷
                        • prune 删除未使用数据卷
                        • rm 删除一个或多个数据卷

                          后文练习123帮助理解。

                          三、Dockerfile

                          很多时候需要自己构建镜像,构建镜像需要写Dockerfile。

                          1. 镜像结构

                          首先介绍镜像结构,镜像是应用程序及其所需要的系统函数库、环境、配置、依赖一层一层构建出来的,以mysql为例:

                          底层是系统函数库(例如Ubuntu),这一层也叫做基础镜像(BaseImage),相当于地基。

                          然后在地基上添加安装包,配置环境变量、配置、依赖等等。

                          最后需要提供一个入口(Entrypoint),也就是程序启动的脚本和参数。

                          2. Dockerfile

                          Dockerfile是一个文本文件,名为Dockerfile,没有后缀,其中包含一些指令,每一个指令就是一层。

                          常用指令:

                          写好Dockerfile后使用docker build命令构建镜像

                          详见练习4

                          四、Docker-Compose

                          若是部署微服务集群,一个个docker去构建会很繁琐,所以需要DOcker-Compose。

                          DockerCompose基于Compose文件快速部署分布式应用,无需手动一个个的创建和运行。Compose文件也是一个文本文件,通过指令定义集群中的每个容器如何运行。

                          1. 安装

                          # 下载docker-compose
                          curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
                          # 添加执行权限
                          chmod +x /usr/local/bin/docker-compose
                          # 下载自动补全
                          curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
                          

                          2. 基本命令

                          # 后台启动当前项目 也可以指定服务
                          docker-compose up -d
                          # 查看项目容器
                          docker-compose ps
                          # 停止容器运行 可以指定服务
                          docker-compose stop
                          # 停止并删除容器 可以加参数来删除镜像、数据卷等
                          docker-compose down
                          # 持续查看日志
                          docker-compose logs -f
                          # 构建或重新构建镜像 可以指定服务
                          docker-compose build
                          …………
                          

                          和docker操作差不多

                          五、Docker私服搭建

                          搭建一个docker私服。

                          docker-compose.yml:

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

                          存放镜像的目录得准备好。

                          还得给docker设置信任地址。

                          我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

                          # 打开要修改的文件
                          vi /etc/docker/daemon.json
                          # 添加内容:
                          "insecure-registries":["http://yourip:port"]
                          # 重加载
                          systemctl daemon-reload
                          # 重启docker
                          systemctl restart docker
                          

                          然后就可以docker-compose up -d启动

                          访问ip+端口,成功:

                          上传一个镜像试试:

                          # 标记镜像,归入私服,有格式要求,名称前缀为私服地址
                          docker tag nginx:latest xxx:xxx/nginx:1.0
                          # 推送
                          docker push xxx:xxx/nginx:1.0
                          # 拉取
                          docker pull xxx:xxx/nginx:1.0
                          

                          六、练习

                          练习1:save和load

                          打包镜像:

                          docker save -o mynginx.tar nginx:latest
                          

                          加载镜像:

                          docker load -i mynginx.tar
                          

                          练习2:docker部署nginx

                          # 拉取
                          docker pull nginx
                          # 启动
                          docker run --name mynginx -p 8080:80 -d nginx
                          # -p 后面的端口 左边是宿主机 右边是容器 
                          # -d 后台运行
                          

                          此时访问宿主机的8080端口即可访问到nginx服务。

                          问题:修改主页

                          方式一:进入容器修改/usr/share/nginx/html/index.html文件(这个路径dockerhub的nginx镜像官方文档中可以找到)

                          # 进入容器
                          docker exec -it mynginx bash
                          # -it 给当前进入的容器创建一个标准输入输出的终端,允许我们与容器交互
                          # bash 进入容器执行的命令
                          # 因为没有vi等文本编辑器,所以使用替换命令
                          sed -i 's#Welcome to nginx#替换#g' index.html
                          sed -i 's###g' index.html
                          

                          这种方式明显是有很大局限性的!容器和数据耦合度非常高,操作繁琐不说,数据也不可复用,维护也非常困难。

                          方式二:将数据卷挂载到/usr/share/nginx/html目录。

                          # 强行删除容器
                          docker rm -f mynginx
                          # 准备一个目录
                          mkdir -p /tmp/nginx/html
                          # 启动
                          docker run --name mynginx -v /tmp/nginx/html:/usr/share/nginx/html -p 8080:80 -d nginx
                          # -p 后面的端口 左边是宿主机 右边是容器 
                          # -d 后台运行
                          # -v 数据卷挂载 左边是宿主机目录 右边是容器
                          

                          这样 就可以把数据和容器解耦了。

                          练习3:部署MySQL

                          # 拉取镜像(先去dockerhub看看镜像名和版本)
                          docker pull mysql:5.7.25
                          # 准备存放数据和配置的数据卷
                          mkdir -p /tmp/mysql/data
                          mkdir -p /tmp/mysql/conf
                          

                          准备mysql配置文件后缀是.conf例如my.conf,内容如下:

                          [mysqld]
                          skip-name-resolve
                          character_set_server=utf8
                          datadir=/var/lib/mysql
                          server-id=1000
                          
                          # 启动mysql
                          docker run \
                          --name mysql \
                          -e MYSQL_ROOT_PASSWORD=123456 \
                          -p 3306:3306 \
                          -v /tmp/mysql/conf:/etc/mysql/conf.d \
                          -v /tmp/mysql/data:/var/lib/mysql \
                          -d \
                          mysql:5.7.25
                          # -e 后面表示这个容器的环境变量 这里我们将环境变量MYSQL_ROOT_PASSWORD赋值为123456
                          # -p 端口 左宿主 右容器
                          # -v 数据卷挂载
                          # -d 后台运行
                          

                          这里面的一些数据是需要取看官方文档的,例如环境变量、配置文件目录等。

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

                          Dockerfile内容:

                          # 指定基础镜像
                          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
                          

                          构建镜像

                          # 构建镜像
                          docker build -t javaweb:1.0 .
                          # -t 表示后面是 name:tag
                          #. 表示Dockerfile所在的目录 . 表示当前目录
                          # 启动容器
                          docker run --name web -p 8090:8090 -d javaweb:1.0
                          
                          问题 层数太多,每次都要安装jdk

                          这样做有缺陷,有很多层都用来做安装jdk了:

                          # 指定基础镜像
                          FROM ubuntu:16.04
                          # 配置环境变量,JDK的安装目录
                          ENV JAVA_DIR=/usr/local
                          # 拷贝jdk
                          COPY ./jdk8.tar.gz $JAVA_DIR/
                          # 安装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
                          

                          所以改进后:

                          # 指定基础镜像
                          FROM java:8-alpine
                          # 拷贝项目
                          COPY ./docker-demo.jar /tmp/app.jar
                          # 暴露端口
                          EXPOSE 8090
                          # 入口,java项目的启动命令
                          ENTRYPOINT java -jar /tmp/app.jar
                          

                          练习5:部署微服务集群

                          部署之前的cloud-demo。

                          1. 修改cloud-demo中的配置,nacos和mysql的地址改为docker-compose中的服务名,例如:

                            spring:
                              datasource:
                                url: jdbc:mysql://mysql:3306/cloud_order?useSSL=false
                                username: root
                                password: 123456
                                driver-class-name: com.mysql.jdbc.Driver
                              application:
                                name: orderservice
                              cloud:
                                nacos:
                                  server-addr: nacos:8848
                            
                          2. 打包,然后写对应的Dockerfile,例如:

                            打包有个小坑 如果之前feign-api这个公共模块是创建的spring项目而不是maven项目,那么会order-service打包失败,换一个打包插件就好:

                                
                                    org.apache.maven.plugins
                                    maven-compiler-plugin
                                    
                                        1.8
                                        1.8
                                    
                                
                            
                            

                            然后install一下这个模块就行。

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

                            完成后:

                          3. 编写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: 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"
                            
                          4. 启动docker-compose

                            docker-compose up -d
                            # 后台运行
                            docker-compose logs -f
                            # 持续查看日志
                            
                          问题:微服务注册失败

                          原因:nacos启动慢,微服务启动时nacos还没有启动完成。

                          解决:重启指定微服务,下次部署时先部署好nacos,使用depends_on也不行不知道啥问题。

                          docker-compose restart gateway userservice orderservice
                          # 重启指定服务
                          docker-compose logs -f
                          # 持续查看日志
                          
The End
微信