SpringCloud学习路线(8)—— Docker

一、Docker的开始

(一)项目部署问题:

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

(二)Docker如何解决问题?

1、依赖兼容问题

  • (1)将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
  • (2)将每个应用放到隔离容器运行,避免相互干扰

2、系统环境问题

  • (1)将用户程序与所需要调用的系统函数库共同打包。
  • (2)Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行。

(三)Docker与虚拟机

1、应用部署实现原理差异

  • Docker通过容器隔离应用并通过Linux内核运行应用,可以任意迁移操作系统。
  • 虚拟机通过Hypervisor技术,模拟出计算机硬件,再安装任意适合的环境与应用。(性能较差)

2、Docker与虚拟机性能差异

特性 Docker 虚拟机
性能 接近原生 性能较差
硬盘占用 一般为 MB 一般为 GB
启动 秒级 分钟级

(四)镜像和容器

1、镜像与容器的概念

  • 镜像(Image): Docker将应用程序及其依赖、函数库、环境、配置等文件打包在一起,成为镜像。
  • 容器(Container): 镜像中的应用程序运行后形成的进程就是容器,只是Docker对容器做隔离,对外不可见。

2、Docker和DockerHub

  • DockerHub: DockerHub是一个Docker镜像托管平台(跟github一样)。这样的平台称为Docker Registy(Docker 服务器)。 官方地址:

(五)Docker架构

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

  • 服务端(server): Docker Daemon守护进程,负责处理Docker指令,管理镜像、容器等。
  • 客户端(client):通过命令(本地)或RestAPI(远程)向Docker服务端发送指令。

Client常用命令

命令 作用
docker build 为client指定的服务做一个镜像
docker pull 从DockerHub官方库拉取需要的镜像
docker run 启动镜像

二、Docker的基础操作

(一)Docker的安装

1、了解Docker版本的不同

Docker分为 CE 和 EE 两大版本。CE 即社区版(免费,支持7个月),EE 即企业版(强调安全,付费使用,支持周期 24 个月)

2、官方关于安装Linux版Docker的说明

  • 要求: Docker CE 支持 64 位版本CentOS 7,并且要求内核版本不低于 3.10,CentOS 7 恰好满足这个要求。
  • 官方地址: https://docs.docker.com/desktop/install/linux-install/

3、在CentOS 7 中安装 Docker

新装CentOS系统的朋友们,注意先检查网络畅通状态。

(1)查看网络适配器的VMware Network,看到启用状态就没问题。

SpringCloud学习路线(8)—— Docker_第1张图片

(2)查看VMware的客户端的网络连接状态
SpringCloud学习路线(8)—— Docker_第2张图片

(3)查看VMware服务,主要是NAT服务,它是虚拟机与主机IP共享的服务,要开起来。

SpringCloud学习路线(8)—— Docker_第3张图片

(4)VMware默认不开启网卡服务,所以我们要到/etc/sysconfig/network-scripts/ifcfg-ens33,把ONBOOT=yes
SpringCloud学习路线(8)—— Docker_第4张图片

(5)重启网络服务

service network restart

SpringCloud学习路线(8)—— Docker_第5张图片
(6)安装Docker

卸载旧版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-utils

yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken

设置本地镜像源

查看阿里云官方的docker镜像设置:阿里云官方镜像地址

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
sudo yum -y install docker-ce
sudo service docker start

配置镜像加速器

官方地址:Docker镜像加速器

#创建文件夹
sudo mkdir -p /etc/docker
#创建并写入阿里云镜像地址地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://zv9ol6pc.mirror.aliyuncs.com"]
}
EOF
#重新加载文件
sudo systemctl daemon-reload
#重启docker服务
sudo systemctl restart docker

(二)镜像操作

1、镜像名称: [respository]:[tag] (例如mysql:8.0,当tag没有指定时,默认是latest,代表最新版本镜像)

2、镜像操作:

操作 说明
docker build 构建镜像
docker pull 拉取镜像
docker push 推送镜像
docker images 查看docker里的镜像列表
docker rmi 删除某个镜像
docker save 压缩某个镜像
docker load 加载某个镜像

SpringCloud学习路线(8)—— Docker_第6张图片

3、拉取最新版本Nginx镜像操作

docker pull nginx 

SpringCloud学习路线(8)—— Docker_第7张图片
4、压缩一个镜像操作

docker save -o nginx.tar nginx:latest

SpringCloud学习路线(8)—— Docker_第8张图片

5、删除已有的镜像

docker rmi nginx:latest

SpringCloud学习路线(8)—— Docker_第9张图片
6、加载镜像

docker load nginx.tar

SpringCloud学习路线(8)—— Docker_第10张图片

(三)容器操作

操作 说明
docker run 运行docker容器
docker pause 暂停运行
docker unpause 解除暂停,开始运行
docker stop 停止运行
docker start 开始运行
docker rm 删除容器
dcoker exec 进入容器执行命令
docker logs 查看运行日志
docker ps 查看所有运行的容器及状态

SpringCloud学习路线(8)—— Docker_第11张图片

容器操作实例

(1)运行一个Nginx容器

# docker run => 创建并运行一个容器
#  --name => 给容器命名
# -p => 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
# -d => 后台运行容器
# nginx => Nginx镜像
docker run --name containerName -p 80:80 -d nginx

在这里插入图片描述
启动nginx容器后,可以在浏览器访问 虚拟机ip:80

SpringCloud学习路线(8)—— Docker_第12张图片

(2)查看nginx 运行日志

docker logs [-f] 容器名

(3)进入容器执行命令

# docker exec:进入容器内部,执行一个命令
# -it:给当前进入的容器创建一个IO终端,允许与容器交互
# bash:进入容器后执行的命令,bash是linux的交互命令
docker exec -it 容器名 bash

在这里插入图片描述
修改nginx首页内容

#先找到nginx的index文件位置
cd /usr/share/nginx/html

#修改index.html文件,退出并保存
# sed -i : 编辑命令
# ' ' :表示修改的内容
# s# xxx #g:表示开头与结尾
# Welcome to ngnix#Nginx容器已启动!:左侧为原内容,右侧为替换内容
# index.html:表示修改文件
sed -i 's#Welcome to nginx!#Nginx容器已启动!#g' index.html
sed -i 's###g' index.html

重新访问浏览器

SpringCloud学习路线(8)—— Docker_第13张图片

(4)停止docker容器

docker stop 容器名

SpringCloud学习路线(8)—— Docker_第14张图片

(5)重启docker容器

docker start 容器名

在这里插入图片描述

(6)删除docker

docker rm 容器名

在这里插入图片描述

(四)数据卷操作(文件操作)

由于容器与数据高度耦合,有着不便于修改数据不可复用升级维护困难的问题。

1、数据卷是什么?

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

2、操作数据卷

docker volume [COMMAND]

Commond列表

  • create:创建一个volume
  • inspect:显示volume的信息
  • ls:列出所有volume
  • prune:删除未使用的volume
  • rm:删除volume

3、示例

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

#创建名为 nginxHTML 的数据卷
docker volume create nginxHTML

#查看已有的数据卷
docker volume ls 

#查看nginxHTML数据卷存储位置
docker volume inspect nginxHTML

SpringCloud学习路线(8)—— Docker_第15张图片

4、数据卷映射容器文件(也称挂载)

通常是在创建容器时挂载数据卷

#docker run:创建并启动容器
#--name:nginxContain:命名容器
#-v nginxHTML:/root/html:将容器中的 /root/html/ 目录与 nginxHTML数据卷映射
#-p 8080:80:宿主机8080端口映射到容器的80端口
#-d nginx:镜像名称

docker run --name nginxContain -v nginxHTML:/usr/share/nginx/html -p 8080:80 -d nginx

在这里插入图片描述
查看数据卷位置

docker inspect nginxHTML

命令执行

[
    {
        "CreatedAt": "2023-07-20T06:27:45-07:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginxHTML/_data",  #在这里
        "Name": "nginxHTML",
        "Options": null,
        "Scope": "local"
    }
]

修改数据卷的内容,查看是否能影响到容器

vim /var/lib/docker/volumes/nginxHTML/_data/index.html

访问浏览器的ip:8080
SpringCloud学习路线(8)—— Docker_第16张图片


三、Dockerfile自定义镜像

(一)镜像结构

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

  • BaseImage层:包含基本的系统函数库、环境变量、文件系统
  • 其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
  • Entrypoint:入口,是镜像中应用启动的命令

(二)Dockerfile 语法

1、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

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

(三)构建Java项目

Dockerfile

#指定基础镜像
FROM centos:7.0
#配置环境变量——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 构建一个镜像

#docker build :创建镜像
# -t :镜像
# javaweb:1.0 :镜像名为javaweb,版本号为1.0
# . : 表示镜像存储在docker所在目录
docker build -t javaweb:1.0 .

运行javaweb:1.0 镜像

docker run --name web -p 8090:8090 -d javaweb:1.0

(四)简化镜像构建

1、提取公共部分的镜像内容制作成镜像。
2、引用公共镜像

FROM 公共镜像:TAG

四、集群部署Docker-Compose

(一)什么是DockerCompose?

  • Docker Compose:基于Compose 文件快速部署分布式应用。

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

version: "3.8"

services:
	#mysql配置
	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
	#javaweb配置
	web:
		build: .
		ports:
			- 8090: 8090

参考官方文档:https://docs.docker.com/compose/compose-file/

(二)安装docker-compose

#安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.29.1/docker-compose-`uname -s `-`uname -m` > /usr/local/bin/docker-compose

#修改文件权限
chmod +x /usr/local/bin/docker-compose

#Base自动补全命令
curl -L https://raw.githubsercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

##如果出现错误,则需要修改自己的hosts文件
# echo "199.232.68.133 raw.githubsercontent.com" >> /etc/hosts

五、Docker镜像库

(一)Docker镜像库分为两种:

  • 公用库——DockerHub
  • 私用库——阿里云镜像库,网易镜像库…

(二)如何搭建自己的镜像库

Docker官方的Docker Registry是一个基础Docker镜像库,具备仓库管理的完整功能,但没有IU界面。

方法一:搭建简易版镜像库

通过以下命令:

docker run -d --restart=always --name registry -p 5000:5000 -v registry -data:/var/lib/registry -d registry

通过访问 http://虚拟机IP:5000/v2/catalog 查看镜像。

方法二:UI版镜像库

它使用的是DockerCompose部署带有界面的DockerRegistry,命令如下

DockerCompose文件

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

配置Docker信任地址

#打开文件
vi /etc/docker/daemon.json

#添加内容
"insecure-registries":["http://虚拟机IP:8080"]

#加载
systemctl daemon-reload

#重启docker
systemctl docker

(三)推送自己的镜像到私有仓库

1、重命名本地镜像

docker tag nginx:latest 私有仓库访问地址/nginx:1.0

2、推送镜像

docker push 私有仓库访问地址/nginx:1.0

3、拉取镜像

docker pull 私有仓库访问地址/nginx:1.0

你可能感兴趣的:(spring,cloud,学习,docker)