Docker

Docker是什么?

Docker是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、自给自足的容器,开发者在本地编译测试通过的容器可以批量的在生产环境中部署。

微服务虽然具备各种各样的优势,但是微服务的拆分通用给部署带来了很大的麻烦。

  • 在分布式系统中,依赖的组件非常多,不同的组件之间部署时往往会产生一些冲突。
  • 在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题

Docker应用部署的环境问题

大项目中的组件比较多,运行环境也比较复杂,所以在部署的时候会碰到一些问题

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

比如在一个项目中要部署mysql,redis,node.js等,这些服务部署的时候所需要的函数库,依赖项各不相同,甚至冲突,那么部署就很困难,而docker就可以帮助我们解决这些困难。

Docker是怎么解决依赖的兼容问题的?

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

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

虽然解决了不同应用的兼容问题,但是开发,测试等环境和操作系统也会存在差异,那么要怎么解决呢?


Docker怎么解决操作系统差异

我们先来了解一下操作系统的内部结构,以Ubantu为例

系统内核:所有的Linux发行版的内核都是Linux,比如CentOS,Ubantu等,内核可以和计算机进行交互,用于操作计算机硬件

系统应用:操作系统提供的应用和对内核指令进行封装的函数库

Ubantu和CentOS等都是基于Linux内核,无非是系统应用有所不同,提供的函数库有差异

Docker是怎么解决不同系统环境的问题?

  • Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
  • Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行(都是linux内核,所以Docker打包好的函数库可以直接在linux上运行)

Docker和虚拟机

虚拟机(virtualmachine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行Ubuntu 系统,这样就可以运行任意的Ubuntu应用了

Docker和虚拟机的差异

  • docker是一个系统进程,虚拟机是在操作系统中的操作系统
  • docker体积小、启动速度快、性能好,虚拟机体积大、启动速度慢、性能一般
  • 虚拟机中拥有hypervisor为虚拟机分配CPU,内存等硬件资源,而docker中没有

Docker的架构

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

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见,利用Linux的手段形成一个隔离空间,里面会有自己独立的内存资源,cpu资源还有独立的文件系统,那么因此在这个文件内运行的进程就会以为自己是计算机上唯一的进程。

怎么把镜像共享给别人使用

为了避免重复劳动,我们可以到Docker镜像托管平台上去共享自己的镜像或者从上面拉取别人上传好的镜像

Docker架构

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

服务端(server): Docker守护进程,负责处理Docker指令,管理镜像、容器等

客户端(client): 通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令

可以通过docker buil命令去DockerServer,docker daemon守护进程就会去处理构建镜像

也可以通过docker pull命令去DockerServer,docker daemon守护进程可以去Registry里拉取Docker官方以及配好的一些优质镜像。

然后通过docker run命令告诉server要去创建容器,然后docker daemon守护进程就会帮助完成容器的创建,部署就成功了。


Docker安装

1.卸载(可选)

如果之前安装过旧版本的Docker,可以使用下面命令卸载

yum remove docker	\
                  docker-client	\
                  docker-client-]atest	\
                  docker-common	\
                  docker-Tatest	\
                  docker-Tatest-logrotate	\
                  docker-Togrotate	\
                  docker-seTinux	\
                  docker-engine-selinux	\
                  docker-engine	\
                  docker-ce

2.安装docke

首先需要大家虚拟机联网,安装yum工具

yum instal] -y um-utils \
						device-mapper-persistent-data	\
            lvm2 --skip-broken

然后更新本地镜像源

# 设置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 -y install docker-ce

docker-ce为免费的社区版

启动docker

systemctl start docker

最后最好去配置一下阿里云的镜像加速,网址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台


Docker基本操作

命令解读

  • docker run :创建并且运行一个容器,-d是让容器在后台运行
  • --name mysql :给容器起一个名字,必须是唯一
  • -p 3306:3306 :设置端口映射,前面是宿主机端口,后面是容器内端口
  • -e KEY=VALUE :设置环境变量
    • mysql :指定运行的镜像名字

注意:镜像名称一般分为两部分组成:[repository]:[tag],其中repository是镜像名,tag是镜像的版本,比如mysql:5.7

端口映射的作用:因为docker的容器里面有自己独立的内存空间,独立的文件系统,甚至还有自己独立的网络空间,有自己的IP地址,但是这个网络空间对外是不可访问的,但是我们可以连接宿主机的网络,所以可对容器的端口和容器上相同的端口进行映射,当访问宿主机的该端口时,docker就会把这个请求转到容器内的该端口,间接地访问该容器。

镜像操作命令

—— docker images --help 查看帮助文档

——docker save -o nginx.tar nginx:latest 将nginx导出为nginx,tar到磁盘中

——docker rmi nginx:latest 将nginx删除

——docker load -i nginx.tar 将磁盘中的nginx.tar加载为镜像

怎么去创建容器

端口映射:将容器中的端口与宿主机的端口做映射,让原本隔离的容器暴露一个小窗口让你能透过它来进行访问

查看容器日志的命令:

  • docker logs
  • 添加-f 参数可以持续查看日志

查看容器状态:

  • docker ps

但是docker ps查看出来的信息太多l了,所以可以加-format属性对查看出来的信息做剪裁,如:

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

但是这个命令太长了,所以可以使用linux给命令起别名

 首先:使用vi ~/.bashrc打开.bashrc文件

然后,在里面添加命令

alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'

然后执行命令使别名生效

source /root/.bashrc

进入容器内部,执行一个命令

docker exec -it mn bash

命令解读:

docker exec:进入容器内部,执行一个命令

-it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互

mn:要进入的容器的名称

bash:进入容器后执行的命令,bash是一个linux终端交互命令

查看容器状态:

  • docker ps
  • 添加-a参数查看所有状态的容器

删除容器

  • docker rm
  • 不能删除运行中的容器,除非添加-f 参数

进入容器:

  • 命令是dockerexec -it[容器名][要执行的命令]
  • exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的

数据卷

在上面我们说了,不推荐大家去容器内修改文件

为什么不推荐呢?

1.不便于修改,当我们要修改镜像的内容时,需要进入到容器里去修改

2.数据不可复用,在容器内的修改对外是不可见的。所有的修改对于新创建的容器时不可复用的

3.升级维护困难,容器在数据里,如果要升级容器那么必然会删除旧的容器,那么所有的数据都跟着删除了

这种方式,会造成容器和数据(容器内文件)耦合

而数据卷就可以解决数据和容器耦合的问题。


什么是数据卷?

数据卷是存在于一个或者多个容器中的虚拟目录,这个目录以独立于联合文件系统的形式在宿主机中存在(指向宿主机系统的某一个目录),为数据的共享和持久化提供便利。

比如我们创建了一个数据卷,那么docker就会在宿主主机下创建一个目录,它们之间进行映射,让容器内部的目录和数据卷进行关联,docker就可以管理这个容器了,对容器的一切操作都会作用在宿主机目录了。

数据卷是挂载在容器的目录上的,即使你不小心删掉了容器,但是数据卷中还是存在数据,硬盘目录也还在,将来你新建了一个容器,只要接着挂载到这两个数据卷上,就可以共享以前的旧数据。

操作数据卷

挂载数据

创建容器且挂载数据到容器内的HTML目录

docker run --name mn -p 80:80 -v html:/usr/share/nginx/html -d nginx

结论:把数据卷删除掉,后续如果没有新建这个数据卷,重新去做数据卷挂载,docker能自动把这个卷创建出来

上面演示了如何将数据卷挂载到容器上,下面演示如何将宿主目录直接和容器进行挂载

数据卷挂载和目录直接挂载的区别:

1.数据卷挂载的耦合度比较低,由docker来管理目录,但是目录比较深,不好找

2.目录挂载的耦合度比较高,但是是我们自己来管理目录,比较容易寻找查询


Dockerfile自定义镜像

镜像结构

Dockerfile

 当编写好了Dockerfile之后,就可以使用下面命令来构建镜像

  • -t :是给镜像取名字,格式依旧是repository:tag的格式,不指定tag时,默认时latest
  • . :指定Dockefile所在的目录,如果就在当前目录那么就可以指定为"."
  • 注意:这个Dockefile所在的目录需要和文件里面的Copy操作的路径相匹配

其实前面n步配置java环境步骤等,java-:8-apline镜像已做好了,只需要在这基础上进行构建镜像就好了


DockerCompose

 

为什么这里的mysql不用暴露端口?因为这里配置的是微服务集群,而mysql是提供给微服务集群里内部使用的,所以不需要暴露端口出来

将cloud-demo微服务集群利用DockerCompose部署

docker-compose.yml文件

这些服务可能不在同一台机器,那么怎么去访问这些服务呢?所有的服务之间其都可以用服务名访问

所以需要去项目中把配置文件的的服务地址都改成服务名

创建并执行容器,-d是后台运行

注意:这里可能一键部署会失败,因为nacos的部署在其他微服务部署的后面才执行成功了,所以像nacos这种最好要先部署

重启所有微服务

Docker容器网络互联

默认情况下,所有的容器都是以bridge的方式连接到Docker的一个虚拟网桥上的:

 其中网桥地址上的/16表示地址的前16位是固定的不会变化

但是这种IP地址连接方式是有缺陷的,比如我启动了一个mysql容器,分配到了132.17.0.3IP地址,如果把它停掉了,这个IP地址可能会被其他容器给占据,这就会导致Mysql的IP地址出现容易变化的情况,对我们在应用中配置mysql地址有影响,因此一般会使用自定义网络

自定义网络

对于自定的网络,会创建一个新的虚拟网桥,只有加入了同一个网桥的容器才能互联,且它还可以通过容器名互相访问(那么就可以不需要通过IP地址访问,就可以解决IP地址更改的问题)

学习笔记from黑马程序员

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值