SpringCLoud——Docker的基本介绍

什么是Docker

项目部署问题

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

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

Docker

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

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

首先要了解一下计算机的运行原理,首先计算机大致是由计算机硬件,操作系统内核,系统应用组成。其中内核负责与硬件做交互,而系统则是封装了内核与硬件的交互指令,将指令封装成一个个的函数,组成函数库供我们调用,更加简便的开发程序:

那么都是基于同一个内核,那么Ubuntu的东西为什么不能再CentOS上运行呢?

因为两者的系统应用层不同,从而导致我们在程序中编写的一些函数不能调用,所以就无法顺利的在跨操作系统运行,Docker的思想,那就是将用户程序与所需要调用的系统函数库一起打包。也就是说Docker直接跳过了系统应用层,直接用自己封装的系统函数库与内核直接做交互,就完成了跨平台的运行。

总结

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  1. Docker允许开发中将应用,依赖,函数库,配置一起【打包】,形成可移植镜像
  2. Docker应用运行在容器中,使用沙箱机制,互相【隔离】

Docker如何解决开发,测试,生产环境有差异的问题

  1. Docker镜像中包括完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。

Docker是一个快速交付,运行引用的技术:

  1. 将程序,及其依赖,运行环境一起打包,可以任意迁移
  2. 运行时使用沙箱机制隔离不同的服务
  3. 启动,移除都可以通过一行命令完成,方便快捷

Docker与虚拟机

Docker和虚拟机的差异:

  1. Docker是一个系统进程;虚拟机是在操作系统中的操作系统
  2. Docker体积小,启动速度快,性能好;虚拟机体积大,启动速度慢,性能一般。

Docker架构

镜像和容器

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

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

当我们启动一个容器的时候,他会产生自己独立的供自己运行的资源,以及有自己独立的文件系统用来储存业务数据,并且这个容器自己写的内容并不会污染其他的容器或者污染镜像,镜像就像是一个本体,所有的容器都是对镜像的拷贝,至于你的容器怎么玩,到时候都不会污染镜像,容器玩坏了就删掉,无非就是一个进程而已,到时候从镜像中再启动一个容器,就跟全新的是一样的了。

Docker和DockerHub

  1. DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
  2. 国内也有类似于DockerHub的公开服务,比如各大互联网公司的公开云服务器。
  3. 如果别希望自己的内部敏感服务暴露,可以创建自己的私有云服务器

Docker架构

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

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

一般我们的操作就是使用build创建镜像,或者使用pull拉取镜像,然后使用run生成实例。

安装Docker

企业不是一般采用Linux操作系统,所以我们这次就使用CentOS安装Docker做实例。

Docker分为CE和EE两大版本,CE即社区版,免费,EE即企业版,收钱。

Docker分为stable,test,nightly三个更新频道

DockerCE支持64位版本CentOS7,并且要求内核版本不低于3.10,CentOS满足最低内核要求,所以我们在CentOS7安装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

正常应该是没有匹配就是没有安装Docker

安装Docker

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

yum install -y yum-utils \

           device-mapper-persistent-data \

           lvm2 --skip-broken

然后更新本地镜像源:

yum install -y yum-utils

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

sudo sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

yum makecache fast

然后输入命令:

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

当然,也不是所有的情况都会这么顺利,坑有很多,其中一个就是,当你觉得很顺利的时候,在安装的时候出现了这个问题:

显示没有可用的软件包,这就表示你之前安装的清华源的源有问题,直接来到清华源的网址:docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

在这里有最新的清华源的安装Docker的方式,使用这里的代码,按照这里的步骤就不会出错,当然,之前出错的原因可能是因为版本的问题,这里的代码有问题了,而原来的老代码在运行的时候会报错:

最主要的就是如果你发现你的这个网站是404-Not Found,就表示你的源地址已经过期了,使用新的:

yum install -y yum-utils

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

sudo sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

这样就可以了。

然后继续安装Docker:

出现这个就表示安装成功了。

启动Docker

在启动Docker之前一定要关闭防火墙,否则你的服务访问不到,你的墙全都给你拦截了,在正式的企业中是要对特定的服务端口做配置特定放行,但是在学习阶段,对于防火墙的配置比较麻烦,所以我们选择直接关闭防火墙即可。

查看防火墙的状态:

systemctl status firewalld

我这里显示是已经关闭了,正常应该是有一个绿色的点,然后状态显示active,我们只要看前面的点是不是绿色的就可以,如果是绿色的就要去关闭。

关闭防火墙:

systemctl stop firewalld

这个命令是没有返回效果的,所以我们在运行完之后要再去看一下防火墙的状态,直到变成关闭状态才可以。

不同版本的CentOS可能命令不同,如果后期出现了其他的变化,则需要更新最新的命令

并且可以设置防火墙禁止开机自启:

systemctl disable firewalld

这样防火墙就不存在于这台虚拟机上了。

然后我们就可以启动dicker了

systemctl start docker

启动之后我们查看docker服务的状态,如果是已经启动,则表示没有问题:

除了查看进程的方式查看服务是否正常启动,我们还可以通过查看版本号的方式查看安装和启动是否成功:

docker -v

配置镜像

docker官方镜像仓库网速较差,我们需要设置国内镜像:

参考阿里云的镜像加速文档:

如何获取和配置镜像加速器_容器镜像服务 ACR-阿里云帮助中心 (aliyun.com)

首先上来,他会告诉你如何获取镜像加速器地址:

然后我们就创建一个阿里云的账号,登录后获取一个镜像加速器地址,以及如何配置这个地址的案例:

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["https://t6lm0wo3.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

然后我们在自己的虚拟机中运行他给你的命令即可:

这样就完成了阿里云镜像的配置。

在选择配置方式这里,一定要注意看到阿里官网的地方,这里有两个标题,分别是【当您的Docker较新时】,和【当您的Docker较旧时】:

我们只需要看较新的那个就可以了,如果你不慎运行了Docker较旧版本的方式,那你可能需要重新部署一个虚拟机,或者清空有关的配置,建议安装Docker之后拍一个快照。

Docker的基本操作

Docker操作镜像

镜像相关命令

  1. 镜像名称一般分为两部分组成:[repository]:[tag]。
  2. 在没有指定tag时,默认是latest,代表最新版本镜像

这表示mysql:5.7和mysql:8.0是两个完全不同的镜像。

镜像操作命令:CRUD

  1. docker build:从本地创建镜像
  2. docker images:查看镜像
  3. docker rmi:删除镜像
  4. docker posh推送镜像到服务
  5. docker pull:从服务拉取镜像
  6. docker save:保存镜像为一个压缩包
  7. docker load:加载压缩包为镜像

查看帮助文档:docker --help

并且可以在某个具体的命令后面加上 --help 用来查看具体某个命令的作用:

案例

从DockerHub中拉取一个nginx并查看

  1. 首先要去镜像仓库搜索nginx镜像,比如DockerHub:

当然,因为某种【不知名】的原因,如果你想访问这个网站,你需要知道如何才能使用科学的方式去进行网络活动,如果你能打开Gethub,那么打开这个网站的方式是一样的:Explore Docker's Container Image Repository | Docker Hub

然后我们打开搜索结果的第一个:

他会告诉你这个镜像是什么,以及对应的服务如何配置,并且还有拉取镜像的命令:

很贴心,我们直接使用他给出的命令即可:

docker pull nginx

首先我们看到我们本地是没有任何的镜像存在的,然后我们拉取一个云端的nginx镜像:

这里,如果你不写tag,那么默认就是最新的版本,也就是latest:

然后我们可以看到这个镜像的详细信息,比如名字,tag,ID,创建日志,以及大小。然后我们再来测试将镜像导出到本地的压缩包中:

使用命令:

docker save -o nginx.tar nagin:latest

这样我们就完成了将镜像保存到本地的操作,然后我们现在删除已经安装的镜像,然后将本地的镜像导入进去:

首先是删除操作:

然后是导入操作:

这样就完成了从本地导入镜像的操作。

容器相关命令

关于容器,最常用的操作就是从镜像创建并运行一个容器,使用docker run命令。在容器运行期间,会出现三种状态,运行状态,暂停状态和停止状态。默认我们在创建一个容器的时候就已经是运行状态,从运行状态切换到暂停状态使用的是pause命令,而从暂停状态切换到运行状态是使用unpause命令。从运行状态切换到停止状态使用stop命令,从停止状态切换到运行状态使用的是start命令。除了状态切换命令,还有其他一切常用的命令:

  1. rm:删除指定容器
  2. ps:查看所有运行的容器及状态
  3. logs:查看容器运行日志
  4. exec:进入容器执行命令

关于停止和暂停的区别,停止是指将进程挂起,内存文件保留,等到再次启用这个进程的时候再次释放。停止就是结束这个进程,回收内存,只保留落盘的文件系统,等待下一次的启动。而删除就是结束进程,回收内存,并删除进程有关的文件,等于这个进程有关的所有的信息都被删除了。

案例

创建运行一个Nginx容器

  1. 步骤一:去dockerhub查看Nginx的容器运行命令

在官方的镜像网站中,一般都能看到对应的镜像使用方式,他会告诉你这个镜像的对应的命令以及参数都代表什么意思。

我们选一个最简单最短的一个:

docker run --name some-nginx -d -p 8080:80 -d nginx

命令解读:

  1. docker run:创建并运行一个容器
  2. --name:给容器起一个名字,比如some-nginx,是用来管理容器的id
  3. -p:端口映射,将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口。映射的作用是将原本完全隔离的容器暴露出一个可供访问的端口,让外界可以访问容器内的服务,宿主机端口可以随便写,只要不是一个占用端口就可以,容器内端口是看服务的启动端口。
  4. -d:后台运行容器
  5. nginx:镜像名称,例如nginx

然后我们来到容器中试一下:

容器运行之后,会返回一个字符串,这个就是容器的唯一ID,容器名和这个ID都是全局唯一的,都是用来管理容器的。

然后我们可以查看一下容器的状态:

docker ps

然后有关这个进程的相关信息就会被罗列出来。

然后我们就可以访问一下这个服务,这里要注意不要乱了,因为你的Docker是安装在Linux上的,所以对于Docker来说,宿主机的Linux,而不是你的真机,对于你的Linux来说,你的真机才是宿主机,所以这里我们要访问的是你的虚拟机的地址,而不是你的真机的地址:

这里我的虚拟机的地址是192.168.80.4,所以我的访问地址就是这个,根据你们自己的虚拟机地址不同这里是要发生改变的。

我们可以来到虚拟机查看一下我们的服务日志,使用命令:

docker logs [容器名]

并且,我们可以使用-f参数来持续的监控日志输出:

此时日志并没有退出,而是等待新的日志的出现,我们来到浏览器中点击几次刷新按钮:

对应的,这里就会出现刚才我们请求的日志信息。

其他操作

查看容器状态:

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

删除容器:

  1. docker rm
  2. 不能删除运行中的容器,除非加-f参数

进入容器

  1. 命令是docker exec -it 【容器名】 【要执行的命令】
  2. exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的。
    1. 首先修改不方便
    2. 其次修改的内容没有记录

案例

创建一个redis的容器,并且支持数据持久化

首先拉取一个redis的镜像到本地:

查看一下本地的镜像:

然后运行redis镜像,生成一个对应的容器:

docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes

--appendonly yes参数表示支持持久化。

启动之后我们进入容器:

这样我们就完成了从拉取镜像,到运行容器,并进入容器进行一定操作的过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值