环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
Docker的出现使得打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
虚拟机的缺点:
Linux 容器不是模拟一个完整的操作系统而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。
Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统虚拟机则是在硬件层面实现虚拟化。与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。
官网
注册一个属于自己的阿里云账户(可复用淘宝账号)获得镜像加速器地址连接
命令 | 代码 |
---|---|
启动docker | systemctl start docker |
停止docker | systemctl stop docker |
重启docker | systemctl restart docker |
查看docker状态 | systemctl status docker |
开机启动 | systemctl enable docker |
查看docker概要信息 | docker info |
查看docker总体帮助文档 | docker --help |
查看docker命令帮助文档 | docker 具体命令 --help |
命令 | 代码 |
---|---|
列出本地主机上的镜像 | docker images |
查找xxx镜像名字 | docker search xxx |
拉取XXX镜像名字 | docker pull xxx |
查看镜像/容器/数据卷所占的空间 | docker system df |
删除某个镜像名字ID | docker rmi ID |
删除所有 | docker rmi -f $(docker images -qa) |
docker虚悬镜像是什么?
仓库名、标签都是的镜像,俗称虚悬镜像dangling image
有镜像才能创建容器, 这是根本前提
命令 | 代码 | 指令 |
---|---|---|
docker run [OPTIONS] IMAGE [COMMAND] [ARG…] | 新建+启动容器 | |
- -name=“容器新名字” | 为容器指定一个名称; | |
-d: 后台运行容器并返回容器ID | 即启动守护式容器(后台运行); | |
-i:以交互模式运行容器 | 通常与 -t 同时使用; | |
-t:为容器重新分配一个伪输入终端 | 通常与 -i 同时使用; | |
-P: | 随机端口映射,大写P | |
-p: | 指定端口映射,小写p | |
docker ps [OPTIONS] | ·列出当前所有正在运行的容器 | |
-a | 列出当前所有正在运行的容器+历史上运行过的 | |
-l | 显示最近创建的容器。 | |
-n | 显示最近n个创建的容器。 | |
-q | 静默模式,只显示容器编号。 | |
exit | run进去容器,exit退出,容器停止 | |
ctrl+p+q | run进去容器,ctrl+p+q退出,容器不停止 | |
docker start 容器ID或者容器名 | 启动已停止运行的容器 | |
docker restart 容器ID或者容器名 | 重启容器 | |
docker stop 容器ID或者容器名 | 停止容器 | |
docker kill 容器ID或容器名 | 强制停止容器 | |
docker rm 容器ID | 删除已停止的容器 |
命令 | 代码 |
---|---|
docker logs 容器ID | 查看容器日志 |
docker top 容器ID | 查看容器内运行的进程 |
docker inspect 容器ID | 查看容器内部细节 |
docker exec -it 容器ID bashShell | 进入正在运行的容器并以命令行交互 |
docker cp 容器ID:容器内路径 目的主机路径 | 从容器内拷贝文件到主机上 |
docker export 容器ID > 文件名.tar | 导出容器 |
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号 |
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。
Docker镜像层都是只读的,容器层是可写的
Docker commit将容器生成镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
阿里云的仓库官网地址
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
docker tag b89fcafd573a registry.cn-hangzhou.aliyuncs.com/mrnacl/nacl:1.0
docker pull registry.cn-hangzhou.aliyuncs.com/mrnacl/nacl:1.0
docker pull registry.cn-hangzhou.aliyuncs.com/mrnacl/nacl:1.0
Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
Docker挂载主机目录访问如果出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true
参数即可
使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
eg:
docker run -it --privileged=true -v /www/wwwroot/dockerData:/tmp/docker_data --name=u1 ubuntu
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
ro = read only
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
eg:
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu