docker是什么?
docker是一个开源的应用容器引擎,基于GO语言开发的。
docker试运行在linux的容器化工具,可以理解为轻量级的虚拟机。
可以在任何主机上轻松创建的一个轻量级,可移植的,自给自足的容器。
鲸鱼-------------------宿主机
集装箱----------------独立运行的容器,相互隔离的容器(一个容器就是一个独立运行的应用程序)
容器化的特点:
1、灵活,最复杂的程序也可以实现容器化
2、轻量级 容器利用和共享主机内核
3、可互换,可以即时部署升级,即时更新
4、便携性:可以在本地构建,也可以部署到云,可以在任何地方运行
5、可扩展(依赖于k8s)
容器实在linux上运行,与其他容器共享主机内核以及主机的资源,独立运行,相互隔离的进程(应用程序)
轻量级的,容器运行时占用一定的资源,但是不占用其他任务的资源。
docker和虚拟机之间的区别
|--------|----------|-------|
| | docker | 虚拟机 |
| 启动速度 | 秒级 | 分钟级 |
| 计算能力损耗 | 几乎没有 | 损耗50% |
| 性能 | 接近原生性能 | 只有80% |
| 系统支持数据 | 上千个(理论上) | 几十个 |
| 隔离性 | 资源隔离 | 完全隔离 |
| 安全性 | 安全性差 | 安全性高 |
linux命令空间 (面试题)
docker使用内核技术的两个重要的技术:
一、namespace实现资源隔离
二、cgroup 资源限制
资源隔离:linux有6项隔离
namespace命令空间
1、UTS 主机名与域名 通过在UTS命令空间创建及进行,这个进程可以看到自己的主机名和域名,与宿主机的其他进程进行分隔
2、IPC 信号量,消息队列,共享内存,进程拥有独立的通信资源,不受其他的进程影响
3、PID 进程编号,每个进程在系统中都有一个唯一标识,唯一标识就是pid,使用不同pid保证进程之间不发生冲突
4、network 网络设备,网络端口等等
在network空间中,每个进程都有自己独立的端口号,靠端口号,可以实现网络访问的隔离
5、mount 挂载点(文件系统),每个进程使用不同的文件系统挂载点,不同的mount的文件系统互不干扰
6、user 用户和用户组,在user空间当中,每个进程都有独立的用户和用户组
每个用户之间可以互相不受影响
docker的核心概念:
1、镜像
镜像是创建容器的基础,类似虚拟机的快照,通过这个快照可以快速的创建一个容器,在镜像当中,已经封装好了程序运行需要的代码,库,运行时间,环境变量以及配置文件
2、容器
基于镜像运行起来的进程就是容器,容器之间互相独立,互相隔离
3、仓库
用来保存镜像的地方,仓库分为两种,公有仓库(docker hub 阿里云)
私有仓库,不对外提供访问,自己使用
工作流程:
docker的文件系统:
overlayFS 联合文件系统,用于docker等容器技术之中
把多个文件系统层叠在一起,形成一个统一的文件系统
LowerDir:底层目录
包含的底层文件系统,容器运行的基础环境的文件系统,根文件系统
UpperDir:可写层
容器可以在底层文件系统的基础之上进行修改,即容器内部发生的写作,这些修改不影响底层的文件系统
达到容器内容的可写性
MergedDir:合并目录
把底层目录和可写层以及其他目录组成联合视图,也就是容器使用的文件系统
WorkDir:工作目录
处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理
docker的基本命令
容器操作,前提必须要有镜像
docker images 查看拉取的镜像
docker tag 给镜像打标签
docker create -it nginx:1.22 创建容器-i 容器和用户之间可以及进行交互
-t 开启一个伪终端,用户操作
-it 开启一个终端,让用户可以用交互会话访问容器,进行操作
docker ps -a 查看所有容器,包括未运行的容器
docker ps 只查看运行起来的容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d72df17d92a0 nginx:1.22 "/docker-entrypoint...." 11 seconds ago Created affectionate_boyd
CONTAINER ID 容器所依赖的唯一标识
IMAGE 容器所依赖的镜像
command 容器默认运行的命令
CREATED 容器的创建时间
ports 容器暴露的端口
NAMES 容器的名称,系统随机分配的,也可以指定容器的名称
status 创建成功, 不是运行,Up:表示运行状态,Exited:停止运行
Create:创建成功
docker start affectionate_boyd 启动容器后面跟上容器的名称
docker rmi -f +images id 删除镜像如果不加-f,镜像被容器使用且容器正在运行,-f才能删除。
docker save -o /opt/nginx1.18.tar nginx:1.18 把nginx:1.18这个以.tar格式保存在opt里面docker load -i 导入镜像
容器的生命周期:
拉取镜像-----------创建容器----------修改镜像-------------重启容器-------------停止容器-------------删除容器-------------删除镜像
docker run(最常用的命令)
特点:本地没有的镜像会自动拉取然后再运行
容器内部如果没有命令执行,容器会自动终止运行,如果有命令执行完指定命令之后,容器也会终止运行
容器要长期运行,稳定运行,必须要有一个执行的可执行命令
docker run -itd --name test1 centos:7 /bin/bash
指定容器名称 镜像
d后台运行,指定后台运行的命令,这样我们创建完之后,即便是有-it,也不会进入容器而是停留在宿主机的界面
进入容器内部查看:
docker exec -it 容器名称/容器的id /bin/bash bash
进入容器的network命令空间,获取他的ip地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} +容器名/id
创建一个nginx1的容器
docker run -itd --name nginx1 nginx:1.22
查看一下容器表
进入容器
容器相当于在系统中又装了一个精简的系统
docker logs -f +容器名 获取容器的日志
创建的时候会有一个默认的输出或者指令:
nginx 运行nginx
/bin/bash--------------->默认的执行的命令被覆盖,虽然nginx在运行,但是运行的不再是nginx的进程,而是/bin/bash
端口映射:
本地端口和容器端口进行映射
-P 随机指定宿主机的端口和容器的端口进行映射 宿主机端口号从32768开始
docker run -itd --name nginx2 (容器名)-P nginx:1.22 (镜像)
-p 指定宿主机的端口和容器的端口进行映射 宿主机端口号只要没有被占用都可以使用
docker run -itd --name nginx3 (容器名)-p 81:80 nginx:1.22(镜像)
指定端口
前一个是宿主机的端口后面一个是容器的端口
如何把宿主机的内容复制到容器里面(面试题)
docker cp /opt/index.html +容器名 :/usr/share/nginx/html
相反如果要把容器的内容复制到主机只需把位置对调一下就行了
docker save -o /opt/nginx.tar nginx:1.22 把镜像保存为.tar格式的文件
docker load -i /opt/nginx.tar 从指定的文件加载镜像
docker export -o nginx.tar +id号 导出容器
docker import nginx.tar --nginx:7 导入容器
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash #批量停止容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stopdocker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash #批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rmdocker images | awk 'NR>=2{print "docker rmi "$3}' | bash #批量删除镜像
docker images | grep none | awk '{print $3}' | xargs docker rmi #删除none镜像docker rm $(docker ps -a -q) #批量清理后台停止的容器
docker总结
1、6个命令空间隔离
2、docker pull nginx:1.22 拉取镜像
3、docker images 查看镜像
4、docker push 上传
5、docker run -itd --name xxx -p 81:80 nginx:1.22 /bin/bash 端口映射
6、docker logs -f 查看日志
7、docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1 获取容器的ip地址
8、docker cp /opt test1:/opt 宿主机到容器
docker cp test1:/opt /opt 容器到宿主机
9、docker save -o /opt/nginx.tar nginx:1.22 把镜像保存为.tar格式的文件
docker load -i /opt/nginx.tar 从指定的文件加载镜像
10、docker export -o nginx7.tar 容器名/容器id 导出
docker import nginx7.tar -- nginx:7 导入
11、删除镜像 docker rmi -f
删除容器 docker rm -f