原文链接:https://blog.csdn.net/m0_61503020/article/details/125456520
1.什么是docker
Docker,翻译过来就是码头工人
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可抑制的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器完全使用沙盒机制,相互之间不会存在任何接口。几乎没有性能开销,可以很容易的在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或者包装系统。
小知识:沙盒也叫沙箱(sandbox)。在计算机领域指一种虚拟技术,而且多用于计算机安全技术。安全软件可以让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源码托管在Github上,基于go语言并且遵从Apache2.0协议开源。
GitHub地址:https://github.com/moby/moby
小知识:LXC为Linux Container的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
LXC主要通过Kernel的namespace实现每个用户实例之间的项目隔离,通过cgroup实现对资源的配额和调度。
docker官网:https://www.docker.com
docker中文库:https://www.docker.org.cn/
2.Docker与虚拟机
相同点:docker和容器技术和虚拟机技术,都是虚拟化技术。
我们很明显的看到docker有着比虚拟机更少的抽象层。 由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。所以docker效率比虚拟机效率高。达到了秒级启动的地步。
docker相较于VM的优点:
– 1、比VM小、快,Docker容器的尺寸减小相比于整个虚拟机大大简化了分布
– 到云和分发时间的开销。Docker启动一个容器实例时间仅仅需要几秒钟。
- 2、Docker是一个开放的平台,构建、发布和运行分布式应用程序。
-
3、开发人员不需要关系具体是哪个Linux操作系统
-
4、Google、微软(azure)、亚马逊、IBM等都支持docker。
-
5、Docker支持Unix/Linux操作系统,也支持Windows和Mac。
Docker局限性:
Docker用于应用程序时是最有用的,但并不包含数据。日志、数据库等通常放在Docker容器外。一个容器的镜像通常都很小,不用和存储大量数据,存储可以通过外部挂载等方式使用,比如:NFS、ipsan、MFS等 ,或者docker命令 ,-v映射磁盘分区。
总之,docker只用于计算,存储交给别人。
3.docker架构图
工作流程:
1、启动docker
2、下载镜像到本地
3、启动docker容器实例
Docker核心技术:
1、Namespace —> 实现Container的进程、网络、消息、文件系统和主机名的隔离。
2、Cgroup —> 实现对资源的配额和调度。
注意:Cgroup的配额,可以指定实例使用的CPU个数,内存大小等。
Docker特性:
文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。
资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup。
网络隔离:每个进程容器运行在自己的网路空间,虚拟接口和IP地址。
日志记录:Docker将收集到和记录的每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或者批量检索
变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或者手动配置。
交互式shell:Docker可以分配一个虚拟终端并且关联到任何容器的标准输出上,例如运行一个一次性交互shell。
4.Docker的安装
三种安装方式
yum -y install docker
yum -y install docker-engine
yum -y install docker-ce
2017年初,docker公司将原先的docker开源项目改名为moby。
moby是集成了原先的docker项目,是社区维护的开源项目,谁都可以在moby的基础打造自己的容器产品。
docker-ce 是docker公司维护的开源项目,是一个基于moby项目的免费容器产品。
docker-ee 是docker公司维护的闭源产品
moby是源代码,docker-ce 和docker-ee 是产品容器,rpm包。
安装docker依赖环境
yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker
yum -y install docker-ce doker-ce-cli containerd.io
开启网络转发功能
默认会自动开启。
路径 :/proc/sys/net/ipv4/ip_forward
手动开启:
vim /etc/sysctl.conf #插入以下内容
net.ipv4.forward =1
-------------------------
sysctl -p #生效
cat /proc/sys/net/ipv4/ip_forward #查看结果,为1开启成功。
如果没有开启网络转发,启动实例的时候就会报错.
关闭防火墙:
iptables -nL #查看一下iptable规则,关闭防火墙后会自动插入新规则
systemctl stop firewalld && systemctl disable firewalld #关闭防火墙
sysctlrem restart docker # 关闭防火墙要把docker重启一下,不然docker的ip包转发功能无法使用。即便防火墙关闭了,docker依旧会调用内核模块netfilter增加规则,所以会新增iptables规则
iptables -nL #再查看一下iptable规则,会发现多出很多规则
启动服务
systemctl start docker && systemctl enable docker
启动完成后查看参数:/proc/sys/net/ipv4/ip_forward
1为ip转发会。默认是0
查看docker版本
docker version
查看docker镜像的地址,docker仓库的地址
docker info
搜索镜像
docker search <镜像的名称>
拉取镜像
docker pull <镜像的名称>
查看镜像
docker images #查看已下载镜像。
导入镜像
docker load -i /root/docker-centos-httpd.tar
5.Docker的命令
1.帮助命令
docker version #显示docker详细信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker --help #docker帮助命令手册
2.镜像命令
docker images #查看所有本地主机的镜像
docker search 镜像名 #搜索镜像
docker pull 镜像名 [标签] #下载镜像(如果不写tag,默认是latest)
docker rmi 镜像名 [标签] #删除镜像 docker rmi -f $(docker images -aq) 删除全部镜像
docker tag 镜像名:版本 新镜像名:版本 #复制镜像并且修改名称
docker commit -a "xxx" -c "xxx" 镜像ID 名字:版本 #提交镜像
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
docker load -i /xxx/xxx.tar #导入镜像
docker save -o /xxx/xxx.tar #保存一个镜像为一个tar包
3.容器命令
docker run [可选参数] image 命令 #启动容器(无镜像会先下载镜像)
#参数说明
--name = "Name" 容器名字
-c 后面跟待完成的命令
-d 以后台方式运行并且返回ID,启动守护进程式容器
-i 使用交互方式运行容器,通常与t同时使用
-t 为容器重新分配一个伪输入终端。也即启动交互式容器
-p 指定容器端口 -p 容器端口:物理机端口 映射端口
-P 随机指定端口
-v 给容器挂载存储卷
docker build #创建镜像 -f:指定dockerfile文件路径 -t:镜像名字以及标签
docker logs 容器实例的ID #查看容器日志
docker rename 旧名字 新名字 # 给容器重新命名
docker top 容器实例的ID #查看容器内进程
docker ps -a #列出所有容器(不加-a就是在运行的)
docker rm 容器实例的ID #删除容器(正在运行容器不能删除,除非加-f选项)
docker kill 容器实例的ID #杀掉容器
docker history 容器实例的ID #查看docker镜像的变更历史
docker start 容器实例的ID #启动容器
docker restart 容器实例的ID #重启容器
docker stop 容器实例的ID #停止正在运行的容器
docker attach /docker exec 容器实例的ID #同为进入容器命令,不同的是attach连接终止会让容器退出后台运行,而exec不会。并且,docker attach是进入正在执行的终端,不会情动新的进程,而docker exec则会开启一个新的终端,可以在里面操作。
docker image inspect 容器名称:容器标签 #查看容器内源数据
docker cp 容器id:容器内路径 目的主机路径 #从容器内拷贝文件到主机(常用)或者从主机拷贝到容器(一般用挂载)
exit #直接退出容器
crlt + P + Q #退出容器但是不终止运行
进入容器修改页面