SpringCloud-day3-Docker

本文详细介绍了Docker在SpringCloud项目中的应用,包括Docker的初始概念、架构、基本操作,如镜像、容器的创建与管理。讨论了数据卷的使用解决容器与数据的耦合问题,并探讨了Dockerfile自定义镜像和Docker Compose在部署分布式应用中的作用。最后,提到了Docker镜像服务的重要性。
摘要由CSDN通过智能技术生成

Docker

1. 初始Docker

大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:

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

Docker如何解决依赖的兼容问题?

  • 将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包,形成可移植的镜像
  • 将每个应用放到一个隔离容器,使用沙箱机制运行,避免相互干扰

Docker如何解决不同系统环境的问题?

  • Docker将用户程序与所需要调用的系统函数库一起打包
  • Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行
特性Docker虚拟机
性能接近原生性能较差
硬盘占用一般为MB一般为GB
启动秒级分钟级

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见

DockerHub:DockerHub是一个Docker镜像的托管平台

2. Docker架构

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

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

3. Docker的基本操作

  • 镜像相关命令:镜像名称一般分两部分组成:[repository]:[tag]
  • 在没有指定tag时,默认是latest,代表最新版本的镜像
操作命令
构建镜像docker build
查看镜像docker images
删除镜像docker rmi
从服务拉取镜像docker pull
推送镜像到服务docker push
保存镜像为一个压缩包docker save
加载压缩包为镜像docker load

查看帮助文档:docker --help

容器相关命令

操作命令
创建容器并使其处于运行状态docker run
暂停容器运行docker pause
从暂停恢复运行docker unpause
停止容器运行docker stop
从停止开始运行docker start
查看所有运行容器的状态docker ps
查看容器运行日志docker logs
进入容器致性命令docker exec
删除指定容器docker rm

暂停:操作系统会将容器内的进程挂起,容器关联的内存暂存起来,CPU不再执行这个进程。恢复之后,内存空间恢复,程序继续执行

停止:操作系统直接杀死进程,容器所在的内存回收

容器的基本操作:创建运行一个nginx容器

  • 去Docker hub查看nginx的容器运行命令

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

进入nginx容器,修改html文件内容,添加欢迎语句

  • 进入刚刚创建的nginx容器

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

4. 数据卷

容器与数据耦合的问题

  1. 不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便
  2. 数据不可复用:在容器内的修改对外是不可见的。所有修改对新创建的容器是不可复用的
  3. 升级维护困难:数据在容器内,如果要升级容器必然删除就容器,所有的数据都跟着删除了

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

数据卷操作的基本语法:docker volume [command]

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步的操作:

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

挂载数据卷

在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器目录,例如:

docker run --name mn -v html:/root/html -p 8080:80 nginx

-v html:/root/html:把html数据卷挂载到容器内的/root/html目录中

如果做数据卷挂载时,数据卷不存在,docker会自动创建该数据卷

目录挂载:

  • -v [宿主机目录]:[容器内目录]
  • -v [宿主机文件]:[容器内文件]

案例:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器

  1. 在docker中安装mysql镜像
  2. 创建目录/tmp/mysql/data
  3. 创建目录/tmp/mysql/conf,将课前资料中的hmy.cnf上传至其中
  4. 去DockerHub查阅资料,创建并运行mysql容器,要求:
    1. 挂载/tmp/mysql/data到mysql容器内数据存储目录
    2. 挂载/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
    3. 设置mysql密码
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data/:/var/lib/mysql -d mysql

在docker run的命令中通过-v参数挂载文件或目录到容器中:

  1. -v volume名称:容器内目录
  2. -v 宿主机文件:容器内文件
  3. -v 宿主机目录:容器内目录

数据卷挂载与目录直接挂载

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

4. Dockerfile自定义镜像

镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成

镜像
	- 入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数
	- 层(Layer):在BaseImage基础上添加安装包、依赖、配置等,每次操作都形成新的一层
	- 基础镜像(BaseImage):应用依赖的系统函数库、环境、配置、文件等

Dockerfile语法

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nsEtT80w-1658824337274)(C:/Users/丁凯旋/AppData/Roaming/Typora/typora-user-images/image-20220725221621587.png)]

案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目

  1. 新建一个空的目录,在目录中新建名为Dockerfile的文件
  2. 拷贝jar包到当前目录中
  3. 编写Dockerfile文件:
    1. 基于java:8-alpine作为基础镜像
    2. 将app.jar拷贝到镜像中
    3. 暴露端口
    4. 编写入口Entrypoint
  4. 使用docker build命令构建镜像
  5. 使用docker run创建容器并运行

总结:

  1. Dockerfile本质是一个文件,通过指令描述镜像的构建过程
  2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建
  3. 基础镜像可以是基本操作系统,如Ubuntu。也可以是其它人做好的镜像,例如:java:8-alpine

5. Docker Compose

Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器

Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行

6. Docker镜像服务

镜像仓库有公共和私有的两种形式:

  • 公共仓库:例如Docker官方的Docker Hub,国内的网易云镜像服务、阿里云镜像服务等
  • 除了使用公开仓库外,用户还可以在本地搭建私有Docker Registry
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值