Docker简介
什么是Docker?
随着容器化技术的发展,现在Docker和K8s等技术越来越火,学习的人也越来越多。今天我们就来学习一下Docker,帮助你从0到你快速构建自己的镜像并运行在容器里。 Dokcer技术是为了解决微服务架构中依赖冲突 的问题,因为在分布式系统中,以来的组件非常多,不同组件之间部署往往会产生一些冲突,亦或是在成百上千台服务中重复部署而环境不一致 造成的各种问题。 例如一个项目中,部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突。给部署带来了极大的困难。 针对 依赖的兼容问题 Docker采用了将应用的函数库、依赖、配置与应用一起打包 ,并将每个应用放到一个隔离的容器去运行 ,避免相互打扰。也就是说每个大号的应用包中包含了本应用所需要的所有函数库、依赖和配置,可以直接哪里用,无需再操作系统上安装这些,这也就不存在不同应用之间的兼容问题了。 我们知道操作系统结构包括:
- 计算机硬件:例如CPU、内存、磁盘等
- 系统内核:以linux系统为例,所有的Linux发行版比如centos、ubuntu、fedora等,内核都是linux。内核可以与计算机硬件交互,对外发出内核指令,用于操作计算机硬件。
- 我们的应用就是通过调用系统的函数库,来实现各种功能。
- 系统函数库调用内核指令集,调用内核指令。
- 内核指令操作计算机硬件。
而Docker就是将应用程序所需要调用的系统函数库一起打包,这样就可以在不同操作系统上运行了。比如说我在ubuntu系统上打包好,里面有所需要的ubuntu系统函数库,当在centos上运行的时候,调用打包好的linux系统函数就行了,因为系统函数封装的Linux内核指令是没有差别的,因此可以在centos上运行。 与之相比较虚拟机 也可以在一个操作系统中运行另外一个操作系统,来保护系统中的应用,但是两者在性能上有显著差距。 虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统,使用了Hypervisor技术,而Docker仅仅是封装函数库,并没有模拟完整的操作系统。 两者在西能上的差距如下图:
Docker的安装
本例讲解Docker在Centos环境下的安装。Docker有两个大版本,一个是CE社区版(免费),还有一个EE企业版(收费),我们安装Docker CE。 记住DockerCE要求linux内核版本不低于3.10,Centos7满足最低内核的要求,所以如果需要安装Docker最低要是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-ce
安装
首先安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
然后更新本地镜像源:
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 ce,稍等片刻即可:
yum install -y docker-ce
启动
启动之前一定要先关闭防火墙 输入以下指令查看防火墙状态。
systemctl status firewalld
如果你的Active字段后面是绿色的,代表没有关,如果和我的相同代表 已经关闭,输入以下指令关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
然后启动Docker
systemctl start docker
systemctl stop docker
systemctl restart docker
配置镜像仓库
因为docker官方仓库网速比较慢,我们需要配置阿里云的国内镜像仓库,使用以下指令:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hjpujjtc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker基础操作
镜像操作
镜像名称
这里先来聊一下什么是镜像 ? 镜像就是Docker将应用程序及其所需要的依赖、函数库、环境、配置等文件打包在一起,就称为一个镜像。也就是说把一个应用在硬盘上的文件,机器运行环境、部分系统函数库文件一起打包形成的文件包,这个文件包是只读的 。 镜像名称一般分为两部分:
- repository 仓库
- tag 标签
我们以mysql为例:
mysql就是repository 5.7就是tag 代表镜像的版本,如果没有指定tag就是最近版latest
镜像命令
拉取
我们首先去docker仓库拉去一个mysql镜像 点击mysql找到tag可以看到所有的mysql镜像的版本 我们可以看到有latest、8.0、8等,将你想要的给拉下来通过命令
docker pull mysql:8.0/latest/不指定tag
然后通过
docker images
查看你本地的镜像 通过
docker rmi imageName
来删除镜像
导出镜像
我们可以通过以下命令将docker中的镜像导出到磁盘,然后再加载回来,首先我们看一下导出 下图是我将Docker中的nginx镜像导出到本地磁盘命名为nginx.tar 命令格式:
docker save -o [保存的目标文件名称] [镜像名称]
docker save -o nginx.tar nginx:latest
导入本地镜像
既然有导出就有导入,我首先将docker中镜像删除了,然后再将刚刚导出的镜像tar包重新加载进docker
docker load -i 本地镜像文件地址
docker load -i nginx.tar
容器操作
容器命令
我们首先也来说一下什么是容器 。容器就是镜像中的应用程序运行后形成的进程,只是Docker会给容器进程做隔离对外视而不见。 因为是相互隔离的进程,因此一个镜像可以启动多次,形成多个容器进程,他们之间相互不干扰。 容器的基本命令如下所示: 每个容器拥有三种状态,分别是运行态、暂停态、停止态 状态之间的切换所对应的指令为;
停止态->运行态 docker run: 进程正常运行
运行态->暂停态 docker pause: 进程暂停,CPU不再运行,并不释放内存
暂停态/运行态->终止态 docker stop;进程终止,回收进程占用的内存,CPU等资源。
基础指令:
- docker run:创建并运行一个容器,处于运行状态
- docker pause:让一个运行的容器暂停
- docker unpause:让一个容器从暂停状态恢复运行
- docker stop:停止一个运行的容器
- docker start:让一个停止的容器再次运行
- docker rm:删除一个容器
创建运行容器
我们演示以下如何创建并启动一个容器,以ngnix为镜像。 运行命令:
docker run --name mynginx-p 80:80 -d nginx
命令解读:
- docker run :创建并运行一个容器
- –name : 给容器起一个名字,比如叫做mn
- -p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
默认情况下,容器是隔离环境,我们直接访问宿主机的80端口,肯定访问不到容器中的nginx。 现在,将容器的80与宿主机的80关联起来,当我们访问宿主机的80端口时,就会被映射到容器的80,这样就能访问到nginx了: 现在我们访问以下服务器的80端口看是否nginx已经启动 可以看到nginx已经成功启动 我们也可以通过
docker logs -f mynginx
查看容器运行日志
进入容器修改文件
我们可以通过
docker exec -it mynginx bash
命令解读:
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mynginx :要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
容器内部是模拟一个独立的Linux文件系统,内部目录结构如下: 我们进入nginx的html所在的目录/usr/share/nginx/html。修改index.html文件。 通过以下命令:
sed -i -e 's#Welcome to nginx#CSDN欢迎您#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
我们再次访问服务器的80端口 可以看到nginx的Index.html文件已经被我们修改了。 好了,今天我们就先讲到这,喜欢的朋友恳求您点个赞,后面会继续更新dockerfile自定义镜像以及docker-compost微服务集群的docker部署。感谢~
|