SpringCloud学习路线(8)—— Docker

本文详细介绍了Docker如何解决依赖和环境问题,对比了Docker与虚拟机的区别,包括性能和资源占用。内容涵盖Docker的基本操作,如安装、镜像和容器的管理,以及数据卷操作。此外,还讨论了Dockerfile用于自定义镜像的构建,并介绍了DockerCompose用于集群部署。最后,提到了Docker镜像库的使用和私有仓库的搭建。
摘要由CSDN通过智能技术生成

一、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的说明

3、在CentOS 7 中安装 Docker

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

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

在这里插入图片描述

(2)查看VMware的客户端的网络连接状态
在这里插入图片描述

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

在这里插入图片描述

(4)VMware默认不开启网卡服务,所以我们要到/etc/sysconfig/network-scripts/ifcfg-ens33,把ONBOOT=yes
在这里插入图片描述

(5)重启网络服务

service network restart

在这里插入图片描述
(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加载某个镜像

在这里插入图片描述

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

docker pull nginx 

在这里插入图片描述
4、压缩一个镜像操作

docker save -o nginx.tar nginx:latest

在这里插入图片描述

5、删除已有的镜像

docker rmi nginx:latest

在这里插入图片描述
6、加载镜像

docker load nginx.tar

在这里插入图片描述

(三)容器操作

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

在这里插入图片描述

容器操作实例

(1)运行一个Nginx容器

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

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

在这里插入图片描述

(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#<head>#<head><meta charset="utf-8">#g' index.html

重新访问浏览器

在这里插入图片描述

(4)停止docker容器

docker stop 容器名

在这里插入图片描述

(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

在这里插入图片描述

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
在这里插入图片描述


三、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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zain_horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值