SpringCloud(八)【Docker】

SpringCloud(一)【SpringCloud基础】
SpringCloud(二)【单体服务及远程调用】
SpringCloud(三)【Eureka注册中心】
SpringCloud(四)【Ribbon负载均衡】
SpringCloud(五)【Nacos注册中心】
SpringCloud(六)【Feign】
SpringCloud(七)【Gateway网关】



一、Docker基础

  1. 什么是Docker?
    docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
  2. Docker的特点
  • 可以将程序及其依赖、运行环境一起打包为一个镜像;
  • 可以迁移到任意Linux操作系统,运行时利用沙箱机制形成隔离容器,各个应用互不干扰;
  • 启动、移除都可以通过一行命令完成,方便快捷。
  1. 虚拟机和Docker
    虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
    在这里插入图片描述
特性Docker虚拟机
性能接近原生性能较差
硬盘应用一般为MB一般为GB
启动秒级分钟级
  1. Docker和虚拟机的差异
  • docker是一个系统进程;虚拟机是在操作系统中的操作系统。
  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般。
  1. 镜像和容器
    镜像(lmage):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
    容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。一个镜像可以运行多个容器。
    在这里插入图片描述
  2. Docker结构
    Docker是一个CS架构的程序,由两部分组成:
  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令
  1. Docker工作流
  • 构建自定义镜像或者从DockerRegistry【一个镜像托管的服务器,类似的还有阿里云镜像服务,统称为DockerRegistry】拉取镜像
  • 根据镜像创建容器,并运行
    在这里插入图片描述

二、Docker安装

在centos 7中安装docker

  1. 卸载
    如果有装过其他版本的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
  1. 安装yum工具
yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

如果安装失败,报错如下:

error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"

One of the configured repositories failed (未知),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:
 1. Contact the upstream for the repository and get them to fix the problem.

 2. Reconfigure the baseurl/etc. for the repository, to point to a working
    upstream. This is most often useful if you are using a newer
    distribution release than is supported by the repository (and the
    packages for the previous distribution release still work).

 3. Run the command with the repository temporarily disabled
        yum --disablerepo=<repoid> ...

 4. Disable the repository permanently, so yum won't use it by default. Yum
    will then just ignore the repository until you permanently enable it
    again or use --enablerepo for temporary usage:

        yum-config-manager --disable <repoid>
    or
        subscription-manager repos --disable=<repoid>

 5. Configure the failing repository to be skipped, if it is unavailable.
    Note that yum will try to contact the repo. when it runs most commands,
    so will have to try and fail each time (and thus. yum will be be much
    slower). If it is a very temporary problem though, this is often a nice
    compromise:

        yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
Cannot find a valid baseurl for repo: base/7/x86_64

则说明需要更改镜像源。

执行命令

sudo vi /etc/yum.repos.d/CentOS-Base.repo

替换内容为:

替换整个文件的方法
在 Vim 中,全选并删除已有内容,然后粘贴新内容的步骤如下:
1.按 Esc 确保你不在插入模式或者可视模式。
2.按 gg 移动到文件的第一行。
3.按 dG 删除从当前行到文件末尾的所有内容。
4.按 i 进入插入模式。
5.现在你可以粘贴新内容了。按 Shift + Insert 或者使用 Ctrl + V 进入可视模式粘贴。
6.粘贴完成后,按 Esc 回到普通模式。
7.如果你想要保存更改并退出 Vim,按 :wq 然后按 Enter

[base]
name=CentOS-$releasever - Base
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  1. 更新本地镜像源
# 设置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
  1. 输入命令
yum install -y docker-ce
  1. 启动docker

注意!!!
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此在学习阶段建议直接关闭防火墙!

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

在这里插入图片描述
6. 启动docker

systemctl start docker  # 启动docker服务

systemctl stop docker  # 停止docker服务

systemctl restart docker  # 重启docker服务
  1. 查看docker版本
docker -v

在这里插入图片描述
8. 配置镜像服务器加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://m1iodc30.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

三、Docker的基本操作

(一)镜像

镜像相关命令
在这里插入图片描述

  • 查看帮助文档
docker [options] --help
  • 查看镜像
docker images
  • 移除镜像
docker rmi redis:latest
  • 拉取镜像
docker pull redis
  • 打包镜像
docker save -o redis.tar redis:latest
  • 重新加载镜像
docker load -i redis.tar

(二)容器

容器的相关命令
在这里插入图片描述

案例一:创建运行一个Nginx容器

  1. 创建运行一个Nginx容器
docker run --name containerName -p 80:80 -d nginx

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

在这里插入图片描述
2. 查看容器状态

docker ps

参数-a

在这里插入图片描述
浏览器请求192.168.21.158:80
在这里插入图片描述
3. 查看日志

docker logs

添加参数 -f 可以持续查看日志,按ctrl+c停止持续查看

案例二: 进入Nginx容器,修改HTML文件内容,添加“你好,世界!”

  1. 进入容器
docker exec -it containerName bash

命令解读:
**docker exec **: 进入容器内部,执行一个命令
-it :给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
**containerName ** :容器名称
bash :进入容器后执行的命令,bash是一个linux终端交互命令

在这里插入图片描述
2. 进入nginx的HTML所在目录 /usr/share/nginx/html

cd  /usr/share/nginx/html
  1. 修改index的内容

注意:不建议直接进入容器修改内容

sed -i 's#Welcome to nginx#你好,世界#g' index.html 
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html

在这里插入图片描述

案例三:创建并运行一个Redis容器,并且支持数据持久化

  1. 创建并运行
docker pull redis
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
  1. 进入Redis容器,并执行redis-cli客户端命令
docker exec -it mr redis-cli
  1. 存入num=666
set num 666
  1. 查看key
keys *

在这里插入图片描述

(三)数据卷

  1. 容器与数据耦合的问题
  • 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便。
  • 数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的。
  • 升级维护困难:数据在容器内,如果要升级容器必然删除旧容器,所有数据都跟着删除了。
  1. 数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
    在这里插入图片描述
  2. 操作数据卷
    在这里插入图片描述
  • 创建volume
docker volume create html
  • 显示一个或多个volume信息
docker volume inspect html
  • 列出所有volume
docker volume ls
  • 删除未使用的volume
docker volume prune
  • 删除一个或多个volume
docker volume rm html
  1. 挂载数据卷
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx

说明
docker run :就是创建并运行容器
-- name mn :给容器起个名字叫mn
-v volumeName: /targetContainerPath-v html:/root/htm把html数据卷挂载到容器内的/root/html这个目录中 -v
-p 80:80 :把宿主机的8080端口映射到容器内的80端口
nginx :镜像名称
注意:如果容器运行时volume不存在,会自动被创建出来。

  1. 挂载目录
    目录挂载与数据挂载的语法类似:
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]

例子:

docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
  • 数据卷挂载与目录挂载的区别
    在这里插入图片描述
  1. 数据卷挂载和目录挂载的总结
  • 语法
-v [volume名称]:[容器内目录]
-v [宿主机目录]:[容器内目录]
-v [宿主机文件]:[容器内文件]
  • 优点与缺点
    • 数据卷挂载耦合度低由docker来管理目录,但是目录较深,不好找
    • 目录挂载耦合度较高,需要自己管理目录,不过目录容易查找查看

(四)Dockerfile自定义镜像

  1. 镜像结构
    镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
    在这里插入图片描述

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

指令说明不知道
FROM指定基础镜像FROM centos:6
ENV设置环境变量,可在指令后使用ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./mysql-5.7.rpm /tmp
RUN执行Linux的shell命令,一般是安装过程的指令RUN yum install gcc
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXPOSE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar
  1. 构建java项目
    基于从零开始的操作系统
# 指定基础镜像
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

基于一些别人做好的镜像,例如java:8-alpine(一个基于JDK8的基础镜像)

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

(五)DockerCompose

  1. Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。
  2. 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"

mysql服务和web服务是两种方式

  • mysql:基于镜像部署服务
  • web服务:临时构建镜像并且运行
  1. 安装
    ①将dockerCompose放到/usr/local/bin目录
    在这里插入图片描述
    ②修改文件权限
    # 修改权限
    chmod +x /usr/local/bin/docker-compose
    
    在这里插入图片描述
    ③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

在这里插入图片描述

(六)Docker镜像仓库

镜像仓库( Docker Registry )有公共的和私有的两种形式:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值