docker基础篇
是什么
解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术
能干什么
一次构建、随处运行
- 更快速的应用交付和部署
- 更便捷的升级和扩缩容
- 更简单的系统运维
- 更高效的计算机资源利用
企业级
- 新浪
- 美团
- 蘑菇街
三要素
- 仓库(Repository):是集中存放镜像文件的场所。分为公开仓库、私有仓库,最大的公开仓库是:hub.docker,国内阿里云、网易云等。
- 镜像(Image):镜像就是模板,容器就是镜像的一个实例。
- 容器(Container):独立运行的一个或一组应用,容器是用镜像创建的运行实例。可以把容器看作是一个简易版的Linux环境。
镜像—>类
容器—>实例
安装
https://docs.docker.com/engine/install/centos/
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
配置阿里云镜像加速
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2Fcn-hangzhou%2Finstances%2Fmirrors%3Faccounttraceid%3D942b146dc4fc41a488eb6783e6dbab6ejlwi&lang=zh
进官网后搜索容器镜像服务,跟着操作文档搞就ok了
测试
ps -ef|grep docker
有这玩意就是成功了
运行hello-world
docker run hello-world
运行底层原理
Docker是一个Client-Server结构的系统
Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。
容器,是一个运送时环境,就是我们前面说到的集装箱。
docker容器和虚拟机(VM)的区别
常用命令
帮助命令
#查看dockek版本
docker version
#查看docker详情
docker info
#查看docker命令帮助(重点)
docker --help
镜像命令
docker images 列出本机上的镜像
#当前主机上可以运行的镜像模板
docker images
表头分别是:镜像的仓库源 镜像标签 镜像ID 镜像创建时间 镜像大小
参数
-a 列出本地所有的镜像(含中间映射层)
-q 只显示镜像ID
--digests 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息
docker search 某个XXX镜像的名字
#到hub.docker查找某个镜像文件
docker search xxxx
docker search tomcat
参数
automated 只列出 automated build类型的镜像;
--no-trunc 显示完整的镜像描述;
-f <过滤条件> 列出收藏数不小于指定值的镜像。
docker pull 某个镜像的名字
#拉取镜像文件
docker pull tomcat (没写版本号)等价于 docker pull tomcat:latest
#拉取指定版本
docker pull tomcat:8.5
docker rmi 删除本地一个或多少镜像
docker rmi xxxx
删除单个 docker rm -f 镜像ID
删除多个 docker rm -f 镜像名1:TAG 镜像名2:TAG
删除多个 docker rmi -f ${docker images -qa}
参数
-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;
容器命令
新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND][ARG]
参数
OPTIONS说明(常用) :有些是一个减号,有些是两个减号
--name="容器新名字":为容器指定一个名称;
-d:后台运行容器,并返回容器ID, 也即启动守护式容器;
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
-P:随机端口映射;
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
列出当前所有正在运行的容器
dockers ps [OPTIONS]
参数
OPTIONS说明(常用) :
-a :列出当前所有正在运行的容器+历史上运行过的
-|:显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出。
退出容器
exit 容器停止退出
ctrl+P+Q 容器不停止退出
启动容器
docker start 容器ID或容器签名
重启容器
docker restart 容器ID或容器签名
停止容器
docker stop 容器ID或容器签名
强制停止容器
docker kill 容器ID或容器签名
删除已停止的容器
docker rm 容器ID -f
#一次性删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
后台启动一个容器
docker run -d centos
问题:然后docker ps -a进行查看,会发现容器已经退出 很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程. 容器运行的命令如果不是那些一直挂起的命令 (比如运行top,tail) ,就是会自动退出的。 这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如 service nginx start 但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是将你要运行的程序以前台进程的形式运行
查看容器日志
docker logs -f -t --tail 容器ID
-t 是加入时间戳
-f 跟随最新的日志打印
--tail 数字显示最后多少条
查看容器内的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
重新进入docker容器
docker attach 容器ID
docker exec -it 容器ID /bin/bash
将容器内文件拷贝到主机上
docker cp 容器ID:容器内路径 目的主机路径
Docker镜像
是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的有内容,包括代码、运行时、库、环境变量和配置文件。
UnionFS(联合文件系统)
UnionFS (状节又件示统) UnionFS (联合文件系统) : Union文件系统(UnionFS)是一一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修作为一 次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a singlevirtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像)可以制作各种具.体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文 件系统会包含所有底层的文件和目录
Docker镜像加载原理
Docker镜像加载原理: docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
botfs(boot file system)**主要包含**bootloader和kernel, bootloader主 要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一-层与我们典型的Linux/Unix系统是- - -样的,包含boot加载器和内核。当boot加载完成之 后整个内核就都在内存中了,此时内存的使用权己由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs (root file system),在bootfs之 上。 包含的就是典型Linux系统中的**/dev, /proc, /bin, /etc等标准目录和文件。**rootfs**就 是各种不同的操作系统发行版,比如Ubuntu**,Centos等等。
平时我们安装的虚拟机的Centos都是好几个G ,为什么docker这里才要200m
对于一个精简的OS, rootfs可 以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自只需要提供rootfs就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。
docker中的centos直接使用了宿主机的内核,只有rootfs是独立的。
为什么 Docker要采用这种分层结构
最大的一个好处就是-共享资源 比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像, 同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称为容器层,容器层之下都叫镜像层
Docker镜像Commit操作
docker commit 提交容器副本使之称为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
Docker容器数据卷
是什么
一句话:有点类似我们Redis里面的rdb和aof文件
将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 *容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在docker中我们使用卷
能干嘛
- 容器的持久化
- 容器间继承+共享数据
FROM centos
ENV mypath /tmp
RUM yum -y install vim
RUM yum -y install net-tools
EXPOSE 80
CMD /bin/bash
DockerFile解析
是什么
Dockerfile是用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本
构建三步骤
- 编写Dockerfile文件
- docker build -t 新镜像名字:TAG .
- docker run
文件什么样???
熟悉的Centos为例
http://hub.docker.com/_/centos
DockerFile构建过程解析
Dockerfile内容基础知识
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数 2、 指令按照从.上到下,顺序执行 3、#表示注释 4、每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程
1、 docker 从基础镜像运行一个容器 2、执行一-条指令并对容器作出修改 3、执行类似docker commit的操作提交- -个新的镜像层 4、docker再基 于刚提交的镜像运行一一个新容器 5、执行dockerfile中的 下一条指令直到所有指令都执行完成
小总结
从应用软件的角度来看,Dockerfile、 Docker镜像与Docker容器分别代表软件的三个不同阶段, Dockerfile是软件的原材料 Docker镜像是软件的交付品 Docker容器则可以认为是软件的运行态。 Dockerfile面向开发,Docker镜 像成为交付标准,Docker容 器则涉及部署与运维,三者缺- -不可,合力充当Docker体系的基石。
1、Dockerfile,需要定义一个Dockerfile,Dockerfile定 义了进程需要的一切东西。Dockerfile涉 及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等; 2、Docker镜像,在用Dockerfile定义一文件之后,docker build时会产生- -个Docker镜像,当运行Docker镜像时,会真正开始提供服务; 3、Docker容器,容器是直接提供服务的。
将镜像推送到阿里云
-
登录阿里云控制台,进入容器镜像服务
-
创建一个镜像仓库
-
-
将镜像推送到Registry(以我本地的一个修改过的centos镜像为例)
-
$ sudo docker login --username=追影少年丿 registry.cn-hangzhou.aliyuncs.com $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ccckdi/mycentos:[镜像版本号] $ sudo docker push registry.cn-hangzhou.aliyuncs.com/ccckdi/mycentos:[镜像版本号]
-
-
测试
-
docker pull registry.cn-hangzhou.aliyuncs.com/ccckdi/mycentos:[镜像版本号]