Docker(黑马spring cloud笔记)

news2024/11/27 22:34:03

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#<head>#</head><meta charset="utf-8">#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打包失败,换一个打包插件就好:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
    

    然后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
# 持续查看日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166770.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】深入学习B+索引的使用

文章目录1. 前言2. 索引的代价2.1 空间上的代价2.2 时间上的代价3. B树索引的使用3.1 提取正确的扫描区间3.1.1 所有搜索条件都可以生成合适的扫描区间的情况3.1.2 有的搜索搜索条件不能生成合适的扫描区间3.1.3 从复杂的搜索条件中找出扫描区间3.1.4 使用联合索引执行查询时对…

5. 统计学基础2:协方差、相关系数、协方差矩阵

文章目录1. 协方差2. 相关系数【就是使 |协方差|<1】3. 协方差矩阵1. 协方差 标准差和方差一般是用来描述一维数据的&#xff0c; 具体介绍见&#xff1a;5. 统计学基础1&#xff1a;平均值…四分位数、方差、标准差&#xff08;均方差&#xff09;、标准误&#xff08;标准…

ModelMapper 一文读懂

目录 1、ModelMapper简介 1.1 引入ModelMapper 的依赖 1.2 进行Mapping映射 1.3 ModelMapper 工作原理 2、ModelMapper 基础操作 2.1 ModelMapper 基本映射 2.2 ModelMapper 集合转换 2.3 ModelMapper 指定默认值 2.4 ModelMapper 属性值转换 2.5 ModelMapper 属…

node.js创建服务器及知识点

node.js创建服务器及知识点用http协议创建web服务器http协议知识点用express创建web服务器express中路由知识点fs文件系统模块文件流querystring查询字符串模块URL模块中间件挂载路由器node.js和mysql项目实战知识点完整代码注意点用http协议创建web服务器 //引入http const h…

【强训】Day07

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. Fibonacci数列2. 合法括号序列判断 ☆答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 Math.round(11.5) 等于&#xff08;&#xff09; A 11 B 11.5 C 12 D 12.5 以下对继承的描…

Spring Boot(五十四):SpringBoot事件监听机制

1 Java监听机制 SpringBoot 的监听机制&#xff0c;其实是对Java提供的事件监听机制的封装。 Java中的事件监听机制定义了以下几个角色&#xff1a; 事件&#xff1a;Event&#xff0c;继承 java.util.EventObject 类的对象事件源&#xff1a;Source &#xff0c;任意对象Ob…

Unet网络解析

1 Unet网络概述 论文名称&#xff1a;U-Net: Convolutional Networks for Biomedical Image Segmentation 发表会议及时间 &#xff1a;MICCA ( 国际医学图像计算和 计算机辅 助干预会 议 ) 2 0 1 5 Unet提出的初衷是为了解决医学图像分割的问题。 Unet网络非常的简单&…

leetcode 2246. Longest Path With Different Adjacent Characters(不同相邻字母的最长路径)

给一棵以节点0为根的树&#xff08;不一定是二叉树&#xff09;&#xff0c;共有n个节点&#xff0c;0&#xff5e;n-1&#xff0c; 同样的&#xff0c;有长度为n的数组parent, parent[i]表示第 i 个节点的parent, 0的parent是-1. 长度为n的字符串&#xff0c;s(i)表示第i个节点…

JSPmvc

一、JSP 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服务端页面。是一种动态的网页技术&#xff0c;其中既可以定义HTML、JS、CSS等静态内 容&#xff0c;还可以定义 Java代码的动态内容&#xff0c;也就是 JSP HTML Java 。如下就…

【金融】新成立基金建仓时点、行业分布与市场行情关系探究

需要进一步交流&#xff0c;获取数据和代码的同学欢迎私信奥~基于新成立基金建仓带入市场的巨量资金会推动市场行情这一逻辑&#xff0c;开展了一系列研究。首先提出了通过基金净值识别建仓行为&#xff08;累计绝对值涨跌幅法&#xff09;和通过基金β值识别建仓行为&#xff…

Vue知识系列-VS Code的安装+Vue环境的搭建+Vue指令

一、VS Code下载地址 Visual Studio Code - Code Editing. Redefined 二、VS Code初始化设置 1.安装插件 在安装好的VSCode软件的扩展菜单中查找安装如下4个插件 2、创建项目 vscode本身没有新建项目的选项&#xff0c;所以要先创建一个空的文件夹&#xff0c;如project_xx…

自主异常检测算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

AppScan 扫描web应用程序

系列文章 AppScan介绍和安装 第二节-AppScan 扫描web应用程序 1.环境布置 我们准备了如下一个靶场用来做实验 2.扫描步骤 1.启动AppScan 2.选择 【扫描web应用程序】 3.输入起始URL&#xff0c;点击【下一步】 http://127.0.0.1:83/4.选择【不使用代理】,点击【下一…

ctfshow php特性[125-135]

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白&#xff0c;自学ing。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐。⭐此后如竟没有炬火&#xff0c;我便是唯一的光。⭐web 125<?php…

word怎么转换成pdf?其实很简单,看这里即可!

转眼间又到了校招的季节&#xff0c;想必许多小伙伴都在忙着编辑自己的简历吧。不过&#xff0c;咱们编辑的时候常常用到的都是word文件&#xff0c;但是当我们要将文件投递出去的时候就需要用到pdf了。其实不仅仅是投递简历&#xff0c;许多地方在要求我们发送正式文件的时候都…

vue+node+mysql全栈项目完整记录

文章目录vuenodemysql全栈项目完整记录写在前面项目最终界面展示项目框架搭建后端创建后端项目编写入口文件数据库及数据库使用前端创建前端项目使用elementUI必要包安装设置跨域访问&#xff0c;全局挂载axios删除无用的文件和代码设置统一的页面样式主页面页面设计路由设计登…

【C语言】柔性的数组是什么?C/C++程序的内存开辟又是?

本文主要讲解柔性数组的相关知识点&#xff0c;并穿插一下C/C程序的内存开辟&#xff0c;涉及到动态内存管理函数&#xff0c;如有不了解的&#xff0c;请参考这一篇文章【C语言】小王带您轻松实现动态内存管理&#xff08;简单易懂&#xff09;_小王学代码的博客-CSDN博客 目录…

【C++】类和对象【下篇】--初始化列表,static成员,友元,内部类,匿名对象

文章目录一、再谈构造函数1.构造函数体赋值2.初始化列表1.概念2.特性二、隐式类型转换1.概念2.构造函数的类型转换3.explict关键字4.类型转换的意义三、Static成员1.概念2.static成员变量3.static成员函数四、友元1.友元函数2.友元类五、内部类六、匿名对象七、拷贝对象时的一些…

深入使用noexcept

深入使用noexcept简介好处坏处适用场景不适用场景实验结果总结参考资料简介 noexcept是C11引入的&#xff0c;表明函数是否会抛出异常。正确使用它可以优化性能&#xff0c;错误使用则会带来麻烦。 noexcept使用语法有两种&#xff1a; noexcpetnoexcept(expression) 第二种…

如何提高系统稳定性?

1、系统稳定性的评判标准 在开始谈稳定性保障之前&#xff0c;我们先来聊聊业内经常提及的一个词SLA&#xff01;业内喜欢用SLA &#xff08;服务等级协议&#xff0c;全称&#xff1a;service level agreement&#xff09;来衡量系统的稳定性&#xff0c;对互联网公司来说&am…