什么是Docker
项目部署问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:
- 依赖关系复杂,容易出现兼容性问题
- 开发、测试、生产环境有差异。
- 将应用的LIbs(函数库)、Deps(依赖)、配置与应用一起打包
- 将每个应用放到一个隔离容器去运行,避免互相打扰
首先要了解一下计算机的运行原理,首先计算机大致是由计算机硬件,操作系统内核,系统应用组成。其中内核负责与硬件做交互,而系统则是封装了内核与硬件的交互指令,将指令封装成一个个的函数,组成函数库供我们调用,更加简便的开发程序:
那么都是基于同一个内核,那么Ubuntu的东西为什么不能再CentOS上运行呢?
因为两者的系统应用层不同,从而导致我们在程序中编写的一些函数不能调用,所以就无法顺利的在跨操作系统运行,Docker的思想,那就是将用户程序与所需要调用的系统函数库一起打包。也就是说Docker直接跳过了系统应用层,直接用自己封装的系统函数库与内核直接做交互,就完成了跨平台的运行。
总结
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
- Docker允许开发中将应用,依赖,函数库,配置一起【打包】,形成可移植镜像
- Docker应用运行在容器中,使用沙箱机制,互相【隔离】
- 将程序,及其依赖,运行环境一起打包,可以任意迁移
- 运行时使用沙箱机制隔离不同的服务
- 启动,移除都可以通过一行命令完成,方便快捷
Docker与虚拟机
- Docker是一个系统进程;虚拟机是在操作系统中的操作系统
- Docker体积小,启动速度快,性能好;虚拟机体积大,启动速度慢,性能一般。
Docker架构
镜像和容器
镜像(Image):Docker将应用程序及其所需的依赖,函数库,环境,配置等文件打包在一起,称为镜像
容器(Container):镜像中的应用程序运行之后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
当我们启动一个容器的时候,他会产生自己独立的供自己运行的资源,以及有自己独立的文件系统用来储存业务数据,并且这个容器自己写的内容并不会污染其他的容器或者污染镜像,镜像就像是一个本体,所有的容器都是对镜像的拷贝,至于你的容器怎么玩,到时候都不会污染镜像,容器玩坏了就删掉,无非就是一个进程而已,到时候从镜像中再启动一个容器,就跟全新的是一样的了。
Docker和DockerHub
- DockerHub:DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。
- 国内也有类似于DockerHub的公开服务,比如各大互联网公司的公开云服务器。
- 如果别希望自己的内部敏感服务暴露,可以创建自己的私有云服务器
Docker架构
- 服务端(server): Dcker守护进程,负责处理Docker指令,管理镜像,容器等
- 客户端(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。
卸载
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
yum install -y yum-utils \
device-mapper-persistent-data \
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
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之前一定要关闭防火墙,否则你的服务访问不到,你的墙全都给你拦截了,在正式的企业中是要对特定的服务端口做配置特定放行,但是在学习阶段,对于防火墙的配置比较麻烦,所以我们选择直接关闭防火墙即可。
我这里显示是已经关闭了,正常应该是有一个绿色的点,然后状态显示active,我们只要看前面的点是不是绿色的就可以,如果是绿色的就要去关闭。
这个命令是没有返回效果的,所以我们在运行完之后要再去看一下防火墙的状态,直到变成关闭状态才可以。
不同版本的CentOS可能命令不同,如果后期出现了其他的变化,则需要更新最新的命令
启动之后我们查看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
在选择配置方式这里,一定要注意看到阿里官网的地方,这里有两个标题,分别是【当您的Docker较新时】,和【当您的Docker较旧时】:
我们只需要看较新的那个就可以了,如果你不慎运行了Docker较旧版本的方式,那你可能需要重新部署一个虚拟机,或者清空有关的配置,建议安装Docker之后拍一个快照。
Docker的基本操作
Docker操作镜像
- 镜像名称一般分为两部分组成:[repository]:[tag]。
- 在没有指定tag时,默认是latest,代表最新版本镜像
这表示mysql:5.7和mysql:8.0是两个完全不同的镜像。
- docker build:从本地创建镜像
- docker images:查看镜像
- docker rmi:删除镜像
- docker posh推送镜像到服务
- docker pull:从服务拉取镜像
- docker save:保存镜像为一个压缩包
- docker load:加载压缩包为镜像
并且可以在某个具体的命令后面加上 --help 用来查看具体某个命令的作用:
案例
当然,因为某种【不知名】的原因,如果你想访问这个网站,你需要知道如何才能使用科学的方式去进行网络活动,如果你能打开Gethub,那么打开这个网站的方式是一样的:Explore Docker's Container Image Repository | Docker Hub
他会告诉你这个镜像是什么,以及对应的服务如何配置,并且还有拉取镜像的命令:
首先我们看到我们本地是没有任何的镜像存在的,然后我们拉取一个云端的nginx镜像:
这里,如果你不写tag,那么默认就是最新的版本,也就是latest:
然后我们可以看到这个镜像的详细信息,比如名字,tag,ID,创建日志,以及大小。然后我们再来测试将镜像导出到本地的压缩包中:
docker save -o nginx.tar nagin:latest
这样我们就完成了将镜像保存到本地的操作,然后我们现在删除已经安装的镜像,然后将本地的镜像导入进去:
容器相关命令
关于容器,最常用的操作就是从镜像创建并运行一个容器,使用docker run命令。在容器运行期间,会出现三种状态,运行状态,暂停状态和停止状态。默认我们在创建一个容器的时候就已经是运行状态,从运行状态切换到暂停状态使用的是pause命令,而从暂停状态切换到运行状态是使用unpause命令。从运行状态切换到停止状态使用stop命令,从停止状态切换到运行状态使用的是start命令。除了状态切换命令,还有其他一切常用的命令:
- rm:删除指定容器
- ps:查看所有运行的容器及状态
- logs:查看容器运行日志
- exec:进入容器执行命令
关于停止和暂停的区别,停止是指将进程挂起,内存文件保留,等到再次启用这个进程的时候再次释放。停止就是结束这个进程,回收内存,只保留落盘的文件系统,等待下一次的启动。而删除就是结束进程,回收内存,并删除进程有关的文件,等于这个进程有关的所有的信息都被删除了。
案例
在官方的镜像网站中,一般都能看到对应的镜像使用方式,他会告诉你这个镜像的对应的命令以及参数都代表什么意思。
docker run --name some-nginx -d -p 8080:80 -d nginx
- docker run:创建并运行一个容器
- --name:给容器起一个名字,比如some-nginx,是用来管理容器的id
- -p:端口映射,将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口。映射的作用是将原本完全隔离的容器暴露出一个可供访问的端口,让外界可以访问容器内的服务,宿主机端口可以随便写,只要不是一个占用端口就可以,容器内端口是看服务的启动端口。
- -d:后台运行容器
- nginx:镜像名称,例如nginx
容器运行之后,会返回一个字符串,这个就是容器的唯一ID,容器名和这个ID都是全局唯一的,都是用来管理容器的。
然后我们就可以访问一下这个服务,这里要注意不要乱了,因为你的Docker是安装在Linux上的,所以对于Docker来说,宿主机的Linux,而不是你的真机,对于你的Linux来说,你的真机才是宿主机,所以这里我们要访问的是你的虚拟机的地址,而不是你的真机的地址:
这里我的虚拟机的地址是192.168.80.4,所以我的访问地址就是这个,根据你们自己的虚拟机地址不同这里是要发生改变的。
此时日志并没有退出,而是等待新的日志的出现,我们来到浏览器中点击几次刷新按钮:
其他操作
- docker ps
- 添加-a参数查看所有状态的容器
- docker rm
- 不能删除运行中的容器,除非加-f参数
- 命令是docker exec -it 【容器名】 【要执行的命令】
- exec命令可以进入容器修改文件,但是在容器内修改文件是不推荐的。
- 其次修改的内容没有记录
案例
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes