目录
概念
docker是一个开源的应用容器引擎,它是基于go语言开发的。docker是运行在linux的容器化工具,可以理解为轻量级的虚拟机。docker是可以在任何主机上,轻松创建的一个轻量级、可移植的自给自足的容器。
图标设计理念:
鲸鱼——宿主机
集装箱—— 一个一个独立运行的容器,而且是相互隔离的容器,可以理解为一个容器就是一个独立运行的应用程序
容器化的特点:
1.灵活:最复杂的程序也可以实现容器化
2.轻量级 :容器它是利用和共享主机内核
3.可互换 :可以及时部署升级,及时更新
4.便携性:可以在本地构建,也可以部署到云,可以在任何地方运行
5.可扩展(依赖于k8s)
容器是在linux上运行的,与其他容器共享主机内核以及主机的资源,独立运行、相互隔离的进程(应用程序),而且是轻量级的。容器运行时占用一定的资源,但是不占用其他任务的资源。
docker和虚拟机之间的区别?
docker 虚拟机
启动速度 秒级 分钟级
计算能力损耗 几乎没有 损耗50%
性能 接近原生性能 只有80%
系统支持的数量 上千个(理论上) 部署也就几十个
隔离性 资源隔离 完全隔离
安全性 安全性差 安全性高
由于docker安全性能差,所以docker一般用于公司内部
面试题:docker怎么实现资源隔离?
答:通过Linux的命令空间
docker使用Linux内核技术的两个重要的技术:
1.namespace 实现资源隔离
2.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的安装
步骤
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-24.0.1 docker-ce-cli-24.0.1 containerd.io
systemctl restart docker
systemctl enable docker
镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://idhvn1su.mirror.aliyuncs.com"] } EOF
systemctl daemon-reload
systemctl restart docker
如果不能拉取镜像
vim /etc/docker/daemon.json
修改里面的地址
*docker的基本命令
docker version 查看docker版本
docker info 查看docker信息
docker pull nginx 拉取nginx的镜像
docker images 查看当前系统拉下的镜像
docker inspect image id号 根据镜像id查看镜像的详细信息
docker rmi -f nginx:1.22/ image id号 删除镜像
如果镜像被容器使用,且容器正在运行,只有加-f 才能删除
docker tag nginx:1.18 nginx:web 给镜像重新打标签
docker save -o /opt/nginx1.18.tar nginx:1.18 把nginx1.18这个镜像导出到opt目录下,保存成nginx1.18.tar
docker load -i nginx1.18.tar / docker load < nginx1.18.tar 导入nginx1.18.tar到docker
docker login 登录仓库
*容器操作
(前提必须要有镜像)
docker create -it nginx:1.18 创建容器
-i :容器和用户之间可以进行交互
-t:开启一个伪终端,供用户操作
-it:开启一个终端,让用户可以用交互式会话访问容器,进行操作。
docker ps -a 查看所有容器,包括未运行的容器
docker ps 只查看运行起来的容器
docker start id号/名称 开启容器
docker run -it centos:7 本地没有的镜像它会自动拉取然后再运行
注:容器内部如果没有命令执行,容器会自动终止运行;如果有命令,执行完指定命令之后,容器也会终止运行。也就是容器要长期运行,稳定运行,必须要有一个执行的可执行命令。
docker run -itd --name test1 centos:7 /bin/bash 指定容器后台运行
d:后台运行,指定后台运行的命令,这样我们创建完整之后,即便是有-it,也不会进入容器而是停留在宿主机的界面。
docker exec -it 容器名称/容器id /bin/bash 进入容器内部
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1 查看容器的ip地址
'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 进入容器的network命令空间,获取它的ip地址
docker logs -f 查看docker日志
docker run -itd --name nginx3 -p 81:80 nginx:1.22 /bin/bash
面试题:怎么向容器中复制文件/ 怎么把容器的文件复制出来?
docker cp /opt/index.html nginx7:/usr/share/nginx/html/ 从宿主机往容器复制
docker cp nginx6:/etc/nginx/nginx.conf /opt 从容器往宿主机复制
docker export -o /opt/nginx7.tar 容器名/容器id 把容器导出
docker import nginx7.tar -- nginx:7 把容器导入
docker rm -f nginx1 nginx2 nginx3 删除容器 (需要先删容器再删镜像)
docker run -itd --name nginx1 -p 81:80 nginx:1.22 nginx -g 'daemon off;'
nginx -g 'daemon off;' = /bin/bash
补充:
docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash #批量停止容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker stop
docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash #批量删除所有容器
docker ps -a | awk 'NR>=2{print $1}'| xargs docker rm -f
docker 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 run -itd --name nginx5 -P nginx:1.22
-P 随机指定宿主机的端口和容器的端口进行映射 端口号从32768开始
docker run -itd --name nginx6 -p 81:80 nginx:1.22
注:81端口是宿主机的端口;80是容器的端口
docker的文件系统:
overlayFS 联合文件系统:用于docker等容器技术之中。它是把多个文件系统层叠在一起,形成一个统一的文件系统。
LowerDir 底层目录:包含的底层文件系统,也是容器运行的基础环境的文件系统,是根文件系统
UpperDir 可写层:容器可以在底层文件系统的基础之上进行修改,即容器内部发生的写操作。这些修改不影响底层的文件系统。目的是达到容器内容的可写性。
MergedDir 合并目录 :把底层目录和可写层目录以及其他目录组成联合视图,也就是容器使用的文件系统。
WorkDir 工作目录:处理文件系统的变更,当容器内部进行写处理时,由workdir进行处理。
CONTAINER ID:容器的唯一标识
IMAGE:容器所依赖的镜像
COMMAND:容器默认运行的命令
CREATED:容器的创建时间
PORTS:容器暴露的端口
NAMES:容器的名称,系统随机分配的,也可以指定容器的名称
STATUS:创建成功,不是运行。up表示运行状态;exited表示停止运行;created表示创建成功
容器的生命周期:
拉取镜像——创建容器——修改镜像——重启容器——停止容器——删除容器——删除镜像
注意点:
创建的时候会有一个默认的输出或者指令
以nginx为例 要运行nginx
在创建的时候加上/bin/bash——默认的执行命令覆盖,虽然nginx在运行,但是运行的不再是nginx的进程,而是/bin/bash
容器要保持一直运行,必须要指定有一个运行的程序。nginx镜像当中声明好了运行程序
nginx -g "daemon off;" 保持nginx一直在后台运行
-itd 不加d 就是前台运行展示运行结果