一、docker基本介绍
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
一句话总结:解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
容器化虚拟技术:由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
docker在开发和运维中的优点:一次运行,随处运行。还有更快速的应用交付和部署、更便捷的升级和扩缩容、更简单的系统运维、更高效的计算资源利用。
docker下载地址:docker官网:http://www.docker.com ,docker中文网站:https://www.docker-cn.com/ 仓库:Docker Hub官网: https://hub.docker.com/。
二、docker的安装
这里安装的是版本是centos8的Linux操作系统。
1.卸载旧版本Docker,首次安装可忽略卸载步骤,CentOS8未自带Docker。
①查询Docker安装包:yum list installed | grep docker
②卸载搜索到的安装包:yum list remove 空格隔开3个搜索结果
③删除卸载残留文件:rm -rf /var/lib/docker
2.查看安装依赖:
rpm -qa | grep device-mapper-persistent-data
rpm -qa | grep lvm2
若以上两个命令查询到结果可忽略下面安装命令,亦可执行,其会提示已安装或者帮您升级相关依赖
安装依赖:
yum install -y device-mapper-persistent-data lvm2
3.设置yum源——镜像仓库:
官方yum源,贼慢
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
建议使用阿里云yum源:(推荐)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引(可忽略)
yum makecache timer
5.安装最新版本Docker:
yum install -y docker-ce
选择安装Docker版本:
①列出所有可安装版本:yum list docker-ce showduplicates | sort -r
②安装需要的版本:yum install -y 需要安装的版本名称
安装时若出现以下错误,根据提示在命令结尾加上--allowerasing或--nobest后再次执行即可
yum install -y docker-ce --nobest
(尝试在命令行中添加 '--allowerasing' 来替换冲突的软件包 或 '--skip-broken' 来跳过无法安装的软件包 或 '--nobest' 来不只使用最佳选择的软件包)
systemctl start docker && systemctl enable docker
查看Docker是否安装成功:docker version
也可通过运行hello-world映像来验证是否正确安装:docker run hello-world
6、配置镜像加速器地址
进入/etc/docker/目录,创建daemon.json文件
编辑daemon.json文件:vim daemon.json
写入以下信息:
# url改成自己的加速器地址,亦可使用该地址
{
"registry-mirrors": ["https://{自己在阿里云上加速器的地址}.mirror.aliyuncs.com"]
}
7.重新载入该配置:systemctl daemon-reload
重启docker:systemctl restart docker
三、docker的常用命令
1.帮助命令
docker --help:查看docker所有命令及用法
docker info
2.镜像命令
①.docker images:列出本地主机上的镜像
OPTIONS说明:
-a :列出本地所有的镜像(含中间映像层)。
-q :只显示镜像ID。
--digests :显示镜像的摘要信息
--no-trunc :显示完整的镜像信息
②.docker search:搜索镜像。
用法:docker search [OPTIONS] 镜像名字。
OPTIONS说明:
--no-trunc : 显示完整的镜像描述
-s : 列出收藏数不小于指定值的镜像。
--automated : 只列出 automated build类型的镜像;
③.docker pull :从远程仓库中拉取镜像。
用法:docker pull 某个XXX镜像名字。
④.docker rmi:删除某个镜像。
用法:docker rmi 某个XXX镜像名字ID。
删除单个:docker rmi -f 镜像ID。
删除多个:docker rmi -f 镜像名1:TAG 镜像名2:TAG 。
删除全部:docker rmi -f $(docker images -qa)。
3.容器命令
①.新建并启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字": 为容器指定一个名称;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
②.列出当前所有正在运行的容器:docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出
③.退出容器:
容器停止退出:exit
容器不停止退出:ctrl+P+Q
④.启动容器:docker start 容器ID或者容器名。
⑤.重启容器:docker restart 容器ID或者容器名。
⑥.docker stop 容器ID或者容器名。
⑦.强制停止容器:docker kill 容器ID或者容器名。
⑧.删除已停止的容器:docker rm 容器ID。
⑨.启动守护式容器:docker run -d 容器名.
⑩.查看容器日志:docker logs -f -t --tail 容器ID.
查看容器内运行的进程:docker top 容器ID。
docker top 容器ID:docker inspect 容器ID。
进入正在运行的容器并以命令行交互:1.docker exec -it 容器ID 2.重新进入docker attach 容器ID
从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径。
四、docker镜像
1.UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
2.Docker镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
3.Docker镜像都是只读的当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
五、docker容器数据卷
1.Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
2.作用:容器的持久化,容器间继承+共享数据。
3.命令: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
备注:Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
4.数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
容器间传递共享。
五、dockerfile
1.Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
2.构建三步骤:编写Dockerfile文件、docker build、docker run。
3.DockerFile构建过程解析:①每条保留字指令都必须为大写字母且后面要跟随至少一个参数。②指令按照从上到下,顺序执行。③每条指令都会创建一个新的镜像层,并对镜像进行提交。
4.DockerFile体系结构(保留字指令):
FROM:基础镜像,当前新镜像是基于哪个镜像的。
MAINTAINER:镜像维护者的姓名和邮箱地址。
RUN:容器构建时需要运行的命令。
EXPOSE:当前容器对外暴露出的端口。
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点。
ENV:用来在构建镜像过程中设置环境变量。
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包。
COPY:类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。
VOLUME:容器数据卷,用于数据保存和持久化工作。
CMD:指定一个容器启动时要运行的命令 ,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。
ENTRYPOINT :指定一个容器启动时要运行的命令,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。
ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。
后记:本文主要引用了周阳老师的docker脑图,如有侵权,请告知,删除。如有错误请大佬指点。