前言:
docker是近年来非常火的一个容器化技术,相比传统的vmware虚拟化技术有着非常大的优势,(vm:小伙子你不讲武德),对于开发人员、测试人员、运维人员,再往上走架构师等等,都是一个几乎必须要掌握的技术。
这篇文章会从docker的概念出发,详细讲一讲在有Linux基础的情况下,如何去安装和使用这一工具,讲这篇文章看完,你基本就入门了docker。
一个软件的上线大多经历如下的流程:开发-测试-上线。而在这个过程中,特别是部署到服务器上时,很难保障一个稳定和相似的运行环境,所以大公司大多会有专门的运维人员负责整个环境的稳定和安全上线,有的公司甚至会有开发一套环境、测试一套环境、运维一套环境。这就给工作带来了很大的不便,而docker的出现就是为了解决这一问题。
传统的虚拟机实际上是模拟出一整套的硬件环境,然后在这套环境中安装和运行软件,这种模拟常常会有资源占用多、冗余步骤多、启动慢等各种缺点。
但是容器化技术就不是模拟一个完整的操作系统,容器内的应用直接运行在宿主机的内核上,容器没有自己的内核,也没有虚拟硬件,所以更加轻便
而且每个容器见相互隔离,每个容器都有自己单独的文件系统,并且互不影响。
1、更加快速的交付和部署
传统的方式就是在一大堆的帮助文档和安装程序下交付,步骤繁多,容易出错
而docker只需打包镜像、一键部署
2、更快捷的升级和扩缩容
docker部署应用就和搭积木一样,将项目打包为一个镜像,就可以拓展为:服务器a、服务器b。
3、更简单的系统运维
容器化后开发测试环境将高度一致,开发人员直呼好家伙,运维人员表示“lz饭碗没了?”
4、更高效的计算资源利用
docker是内核级别的虚拟化,一个物理机上可运行更多的容器实例,服务器性能可以压榨到极致。(榨干阿里云,不留一根羊毛)
1、镜像(image)
可以理解为一个模版,docker通过这个模版创建容器服务,一个镜像可以创建多个容器。
2、容器(container)
容器是用镜像创建的实例。容器可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台,可以将容器理解为一个简易的Linux系统。
3、仓库(repository)
仓库是集中存放镜像文件的场所,区分共有仓库和私有仓库,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签
docker官网:
https://www.docker.com/
doc文档:
https://docs.docker.com/
hub库:
https://hub.docker.com/
1、服务器(centos7)
凡是Linux服务器都可以,docker是运行在Linux环境下的工具。
2、控制台
这个不多说,平时Linux怎么用就怎么用,xshell也好、mac终端也好、甚至网页shell也可以,总之要有个能敲命令的地方。
3、检查内核版本
要运行docker至少Linux内核版本得3.10以上,自己用uname -r或者cat /etc/os-release看看内核版本是否符合
4、其他环境配置
新机器最好yum makecache fast更新下yum软件包索引,然后检查下防火墙策略,阿里云的话设置好网络与安全相关配置,确保连接访问服务器正常。
1、初始化环境
yum remove docker \
删除Linux中的docker,新的机器当然没有,但是养成习惯,如果有的话肯定是装不了的。
2、安装要用到的安装包
yum install yum-utils -y
3、设置镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这里和官方文档是不一样的,在国内的话当然安装的国内镜像,速度快些。
4、安装docker
yum install docker-ce docker-ce-cli containerd.io -y
ce表示社区版、ee表示企业版
5、启动服务
systemctl start docker
6、测试
docker run hello-world
这里会提示本地找不到镜像,会去官方库里找,找到并下载成功的话,docker就安装成功了
[root@Jays-server ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
7、然后去看看下载的hello-world镜像在不在本地库里
[root@Jays-server ~]docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 11 months ago 13.3kB
到这一步都没有问题的话你的docker就下载成功了!
1、卸载依赖
yum remove docker-ce docker-ce-cli cintainerd.io
2、删除资源
rm -rf /var/lib/docker
如果使用阿里云服务器的话,可以做这一步,以后下载镜像速度非常快!
1、登录阿里云,找到镜像服务,登录
2、找到镜像加速地址
3、配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://wrqg86ji.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker images #查看本地所有镜像
内容释义
REPOSITORY:镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像的ID
CREATE:镜像的创建时间
SIZE:镜像的大小
可选项
-a,--all
列出所有镜像
-q,--quiet
只显示镜像的id
docker search #搜索镜像
可选项(栗子)
--filter=STARS=3000
可以过滤显示收藏量3k以上的项
docker pull #下载镜像
docker rmi #删除镜像
删除指定容器
docker rmi -f 容器id
删除多个容器
docker rmi -f 容器id 容器id 容器id
删除全部容器
docker rmi -f $(docker images -aq)
docker run[可选项] image(启动镜像)
--name:容器名字
-it:使用交互方式运行,进入容器查看内容
-p:指定容器端口-p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P:随机指定端口
exit(退出容器)
ctrl+P+Q:快捷键:容器停止并退出的方式
docker ps(列出运行的容器)
-a:列出当前正在运行的容器+历史运行的容器
-n=?:显示最近创建的容器
-q:只显示容器的编号
docker rm(删除容器)
容器id:删除指定容器
docker ps -f $(docker ps -aq) #强制删除全部容器
docker ps -aq|xargs docker rm #高级点的删除玩法,作用同上
其他启动和停止容器的操作:
docker start rq:启动容器
docker restart rq:重启容器
docker stop rq:停止当前正在运行的容器
docker kill rq:强制停止当前容器
docker run -d 镜像名(后台启动镜像)
docker容器使用后台运行,就必须要有一个前台进程,否则docker就会自动停止
docker logs -tf --tail 10 容器id(显示日志)
docker top rq-id(查看容器中的进程信息ps)
docker inspect rq-id(查看容器的源数据)
docker exec -it rq-id(进入容器后开启一个新的终端,可以在里面操作:常用)
第二种:docker attach:进入正在执行的终端,不会启动新的进程
docker cp rq-id:容器内路径 主机路径
显示docker版本信息
docker version
1、什么是镜像?
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
任何应用直接打包成docker镜像,就可以直接跑起来
2、如何获取镜像?
远程仓库下载
朋友拷贝
自己制作一个镜像dockerfile
3、docker镜像加载原理
联合文件系统(UnioneFS)
union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件下。
Union文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
tip:原理的理解可能有些困难,但是没关系,又一个大致的印象即可,后期多做做实验,多实践就能体会和理解了。
语法:
docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[TAG]
看的出来和git的语法高度一致。
做个实验:
1、启动一个默认的tomcat
docker run -it -p 8080:8080 tomcat
2、进入并修改一些基本文件
docker exec -it 4bb3454d5baa bash
cp -r webapps.dist/* webapps
3、将修改后的镜像提交为一个新的镜像
docker commit -a="pyy" -m="add webapps app" 91f65a9d8068 tomcat01:1.0
docker images就能看到新的tomcat01
后记:
看到这里就是docker一些基础的入门知识了,包括docker概述,安装,使用。
实际上docker还有很多的内容,还有比较进阶的玩法比如容器数据卷、制作DockerFile、Docker网络原理。
还有企业级的Docker compose、Docker swarm、CD\CD等,这些内容后续再开贴细说,这里推荐看B站的“狂神说java”,本帖的知识架构很大程度借鉴了狂神的docker课程,大家可以多多去b站支持。