大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
Docker
Docker如何解决依赖的兼容问题的?
首先要了解一下计算机的运行原理,首先计算机大致是由计算机硬件,操作系统内核,系统应用组成。其中内核负责与硬件做交互,而系统则是封装了内核与硬件的交互指令,将指令封装成一个个的函数,组成函数库供我们调用,更加简便的开发程序:
那么都是基于同一个内核,那么Ubuntu的东西为什么不能再CentOS上运行呢?
因为两者的系统应用层不同,从而导致我们在程序中编写的一些函数不能调用,所以就无法顺利的在跨操作系统运行,Docker的思想,那就是将用户程序与所需要调用的系统函数库一起打包。也就是说Docker直接跳过了系统应用层,直接用自己封装的系统函数库与内核直接做交互,就完成了跨平台的运行。
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
Docker如何解决开发,测试,生产环境有差异的问题
Docker是一个快速交付,运行引用的技术:
Docker和虚拟机的差异:
镜像(Image):Docker将应用程序及其所需的依赖,函数库,环境,配置等文件打包在一起,称为镜像
容器(Container):镜像中的应用程序运行之后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
当我们启动一个容器的时候,他会产生自己独立的供自己运行的资源,以及有自己独立的文件系统用来储存业务数据,并且这个容器自己写的内容并不会污染其他的容器或者污染镜像,镜像就像是一个本体,所有的容器都是对镜像的拷贝,至于你的容器怎么玩,到时候都不会污染镜像,容器玩坏了就删掉,无非就是一个进程而已,到时候从镜像中再启动一个容器,就跟全新的是一样的了。
Docker是一个CS架构的程序,由两部分组成:
一般我们的操作就是使用build创建镜像,或者使用pull拉取镜像,然后使用run生成实例。
企业不是一般采用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
首先需要虚拟机联网,安装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之前一定要关闭防火墙,否则你的服务访问不到,你的墙全都给你拦截了,在正式的企业中是要对特定的服务端口做配置特定放行,但是在学习阶段,对于防火墙的配置比较麻烦,所以我们选择直接关闭防火墙即可。
查看防火墙的状态:
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之后拍一个快照。
镜像相关命令
这表示mysql:5.7和mysql:8.0是两个完全不同的镜像。
镜像操作命令:CRUD
查看帮助文档:docker --help
并且可以在某个具体的命令后面加上 --help 用来查看具体某个命令的作用:
从DockerHub中拉取一个nginx并查看
当然,因为某种【不知名】的原因,如果你想访问这个网站,你需要知道如何才能使用科学的方式去进行网络活动,如果你能打开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命令。除了状态切换命令,还有其他一切常用的命令:
关于停止和暂停的区别,停止是指将进程挂起,内存文件保留,等到再次启用这个进程的时候再次释放。停止就是结束这个进程,回收内存,只保留落盘的文件系统,等待下一次的启动。而删除就是结束进程,回收内存,并删除进程有关的文件,等于这个进程有关的所有的信息都被删除了。
创建运行一个Nginx容器
在官方的镜像网站中,一般都能看到对应的镜像使用方式,他会告诉你这个镜像的对应的命令以及参数都代表什么意思。
我们选一个最简单最短的一个:
docker run --name some-nginx -d -p 8080:80 -d nginx
命令解读:
然后我们来到容器中试一下:
容器运行之后,会返回一个字符串,这个就是容器的唯一ID,容器名和这个ID都是全局唯一的,都是用来管理容器的。
然后我们可以查看一下容器的状态:
docker ps
然后有关这个进程的相关信息就会被罗列出来。
然后我们就可以访问一下这个服务,这里要注意不要乱了,因为你的Docker是安装在Linux上的,所以对于Docker来说,宿主机的Linux,而不是你的真机,对于你的Linux来说,你的真机才是宿主机,所以这里我们要访问的是你的虚拟机的地址,而不是你的真机的地址:
这里我的虚拟机的地址是192.168.80.4,所以我的访问地址就是这个,根据你们自己的虚拟机地址不同这里是要发生改变的。
我们可以来到虚拟机查看一下我们的服务日志,使用命令:
docker logs [容器名]
并且,我们可以使用-f参数来持续的监控日志输出:
此时日志并没有退出,而是等待新的日志的出现,我们来到浏览器中点击几次刷新按钮:
对应的,这里就会出现刚才我们请求的日志信息。
查看容器状态:
删除容器:
进入容器
创建一个redis的容器,并且支持数据持久化
首先拉取一个redis的镜像到本地:
查看一下本地的镜像:
然后运行redis镜像,生成一个对应的容器:
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes
--appendonly yes参数表示支持持久化。
启动之后我们进入容器:
这样我们就完成了从拉取镜像,到运行容器,并进入容器进行一定操作的过程。