1.容器
容器与虚拟机的区别
选型
使用配置
容器指令(镜像,容器)
2.容器与虚拟机(虚拟化)区别
虚拟机 容器 优点 1.使用简单2.也有成熟管理工具,VMware esxi vcenter,KVM,Openstack3.可以随意定制(加内存,cpu,磁盘)4.启动虚拟机要经历完整的Linux启动流程 1.快速部署(扩容,弹性伸缩)2.大部分环境都有现成镜像3.让我们不再关注系统基础设施,把关注点放在使用上(配置,升级,优化)4.不依赖硬件(windows也可以运行容器)5.启动容器秒级,不同容器之间互相隔离,默认网络,进程信息等(启动1个ngx占80端口,在启动1个占80也可以)6.相当于一个进程 缺点 1.需要硬件支持虚拟化技术(VT-X),电脑资源分配给虚拟机2.同一台虚拟机跑多个服务,可能有冲突3.导致资源利用率不高4.占用资源较多(整一台虚拟的机器)5.不满足目前升级。快速扩容,快速部署,回滚时不方便 1.使用较为复杂2.共享Linux系统内核,推荐使用较新Linux内核(3.10以上,centos7正正好好支持)3.自定义镜像与批量管理
3.容器运行时选型
运行时(Runtime) docker 最经典, 也可搭配k8s containerd 一般搭配k8s使用 podman …..
4.docker的cs架构
镜像: 一般放着服务的环境(系统环境,ubt,debian),再带着1个服务(ngx, php等)
容器: 运行容器要有对应的镜像
docker run运行容器时,会看本地是否有镜像,有则运行;没有就去镜像仓库下载(官方/自建)
5.极速上手指南
环境准备 配置 ip docker01 2核心4g内存(2c4g) 10.0.0.81/172.16.1.81 docker02 2核心4g内存(2c4g) 10.0.0.82/172.16.1.82
5.1全流程
#1.删除系统已有的runc(命令)--麒麟系统的坑
rm /usr/local/bin/runc
#2.解压dockerxxx27.tgz (二进制,解压即用) 然后修改所有者为root
tar xf dockerxxx27.tgz
chown -R root.root docker
#3.把解压后的命令移动到/bin/下---> dockerd就是服务端
mv docker/* /bin/
docker --version #检查
#4.配置systemctl文件
mv docker.service /usr/lib/systemd/system/
#5.加载systemctl文件
systemctl daemon-reload
#6.创建docker配置文件并写入内容-->为了加速,镜像仓库地址
mkdir -p /etc/docker/
cat >/etc/docker/daemon.json<<'EOF'
{
"registry-mirrors" : ["https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://do.nark.eu.org",
"https://docker.shootchat.top",
"https://registry.docker-cn.com"]
}
EOF
#7.启动docker或重启docker,注意配置开机自启动
systemctl enable --now docker
#8.检查进程,默认没端口;检查
ps -ef|grep docker
docker version #检查客户端和服务端
#8.docker pull拉取镜像测试(得有网,会在刚才配置的地址中找)---->备用方案(使用下载好的镜像)
docker pull nginx:alpine
#9.检查本地有的镜像(第一列:镜像名,第二列:标签版本)
docker images
5.2小故障(未删除runc的错误提示)
6.docker指令
#1.镜像指令
docker image --help
docker images == docker image ls
docker load -i 导入镜像
#2.容器指令
docker container help
docker run -d (后台运行) --name 容器名字(独一无二) -p 端口映射 镜像名字:tag
#容器在系统中是个独立的进程,相当于内网环境,外界访问容器-->端口映射(iptables)--宿主机端口映射到容器的端口
#若写了一个镜像名,在本地没有,docker run会调用docker pull
#运行容器
docker run -d --name ngx_test1 -p 80:80 nginx:alpine
#浏览器访问即可
#容器名字冲突,不创建容器;端口冲突,创建容器,未启动,-a查看,删掉即可
#docker ps 只显示运行中的容器
docker ps -a
docker rm 容器名字(没运行) -f强制删除容器(运行中)
docker用到了iptables,自动实现了端口映射和共享上网,在nat表中自定义链docker -->我们要开启内核转发功能(xxip_forward=1)
6.1镜像指令
镜像仓库(外网): https://hub.docker.com/
1)查看镜像
docker image ls #简写为下方
docker images
选项:-a 查看所有镜像包含隐藏镜像
--no-trunc 不要省略,显示所有 后面很多容器镜像指令也有这个选项
2)下载镜像
#1.下载镜像
docker pull nginx:latest #使用latest 最新版 版本号,也叫tags标签
docker pull nginx #也是latest最新版,不推荐
#2.镜像名字
nginx:版本 版本:1.26 1.26.0 1.26-alpine
docker镜像里的系统 说明 debian系统 功能/命令多一些。buster(版本10),bullseye(11),bookworm(12) 主流 ubuntu系统 功能/命令多一些。22.04 alpine系统 超级精简的系统(基础的命令,工具)
[root@docker01 ~]# docker images |egrep '^debian|^ubuntu|^alpine'
debian buster 1de12428f6f4 2 years ago 114MB
debian bullseye 189a2f977ff1 2 years ago 124MB
debian bookworm 3676c78a12ad 2 years ago 116MB
ubuntu 20.04 14be0685b768 2 years ago 72.8MB
ubuntu 22.04 5a81c4b8502e 2 years ago 77.8MB
alpine latest c1aabb73d233 2 years ago 7.33MB
3)镜像的sl大法(save/load)
1.找一台有公网的机器
2.docker pull 常用服务的镜像
3.docker save 导出镜像为.tar包
4.传输到指定节点(适用于节点少)
5.docker load -i xxx +for 循环实现
[root@docker01 ~/nodejs-maven]# for n in `ls *`
> do
> docker load -i $n
> done
未来节点多: 把下载下来的镜像上传到私有镜像仓库中
#1.sl大法(save/load)
load 导入 save 导出
#2.直接导出不压缩
docker save nginx:1.24 -o nginx.tar(tar包名字随意)
#导出并压缩
docker save nginx:1.24 |gzip >nginx.tar.gz
.tar或tar.gz传输到对应节点不用解压(就1个镜像)
#删除镜像
docker rmi nginx:1.24(镜像名)
#导入
docker load -i xxx.tar或xxx.tar.gz
docker image rm #简写为下方
docker rmi #镜像已经使用中,就是启动容器 需要先删除容器,然后删除镜像
4)docker镜像的tag标签
docker tag 原有的名字 新名字 #不是修改名字 2个镜像的ID号一样,实际是1个,占的空间也是1份
docker tag 镜像id 新名字
5)查看各种信息
#jq是专门处理json形式数据的命令
yum install -y jq
#查看镜像信息(json形式)
docker inspect 镜像名
docker inspect mysql:8.0-debian |jq .[] #先去掉/进入最外面的[],然后直接使用(最外面是列表,然后是字典变量)
docker inspect mysql:8.0-debian |jq .[].RepoTags
docker inspect mysql:8.0-debian |jq .[].Id
docker inspect 容器名
docker inspect ngx_test |jq .[]
docker inspect mysql:8.0-debian |jq '.[].RepoTags[]'
#获取容器中的端口
docker inspect mysql:5.7-debian |jq '.[].Config.ExposedPorts'
#获取env变量(容器中的环境变量)
docker inspect mysql:5.7-debian |jq '.[].Config.Env[0]' #注意加上引号。最后一层是列表,用[]当成数组处理(0,1,2..)
#对容器进行巡检
docker inspect ngx |jq '.[].NetworkSettings.Networks.bridge.IPAddress'
6)镜像指令小结
镜像 选项 docker images 查看 -a 查看所有镜像–no-trunc docker pull 下载,拉取镜像 docker push 上传到私有镜像仓库,不改默认传官方仓库 docker rmi 删除镜像 docker inspect 查看docker各种资源的信息,检查 docker save/load 导出导入 tag build history
6.2容器指令
1)运行容器
没有内核转发,Docker容器就像一座孤岛——虽然存在,但无法与外界建立网络连接。这就是为什么所有 Docker生产环境部署指南中都强调要确保net.ipv4.ip_forward=1
[root@docker01 ~]# grep ip_forward /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@docker01 ~]# sysctl -p #生效
ss -lntup|grep 80
docker run -d --name nginx_test1 -p 80:80 nginx:1.24 #完整写法:docker container run
--name指定容器名字(要唯一) 不能冲突
-p 指定端口映射 宿主机端口:容器服务端口 这里nginx启动容器端口是80
检查本地是否有指定的镜像,有,则准备运行
docker pull 拉取镜像(本地没有则拉取)
docker create 然后创建容器(后台运行,容器名字,端口映射)
docker start 启动容器
容器运行中…
http://10.0.0.81:80/
2)检查与删除
docker ps -a
docker rm 容器运行中则需要加-f选项强制删除
[root@docker01 ~]# docker run -d --name ngx_v1 -p 84:80 nginx:1.24
cb98ad1c4a3b09caecfe6a1e5fc283103ff2e0c883d60b291ee512a467add957
[root@docker01 ~]# docker run -d --name ngx_v2 -p 85:80 nginx:1.24
8606d3e82b57751facabfd61d8b6c26b74d465cfef8327e4c34d618f3c2d5e0f
#删除所有容器
docker rm -f `docker ps -aq` #可接名字或id
docker ps -a -q |xargs docker rm -f #-q只显示容器的id信息
#更精确/针对性删除
docker ps -a |awk '$2~/nginx:1.24$/{print $1}'|xargs docker rm -f #第2列包含xx,以1.24结尾
3)连接使用
#前提:容器运行中
docker run -d --name ngx_v1 -p 84:80 nginx:1.24
#非交互式检查ip信息
docker exec -it ngx_v1 hostname -I
#检查系统信息
docker exec -it ngx_v1 cat /etc/os-release
#交互式进入容器执行命令(里面命令少,且不支持别名)
docker exec -it ngx_v1 /bin/bash #/bin/bash指定命令解释器或/bin/sh
-it
-i 交互模式 -t 分配终端(连接进去是命令行,一个窗口)
4)查看日志
docker logs 容器名字 #默认查看容器所有日志
#查看最新日志(防止刷屏)
docker logs -f 类似于tail -f 实时更新(容器运行中才行)
docker logs -n 5 类似于tail -n 5 最近5行
docker logs --since '5m' ngx_v1 #最近5分钟的日志
#启动容器-出现错误
docker run -d --name db -p 3306:3306 mysql:8.0-debian
#docker logs查看日志
docker logs -n 10 db
#删除未启动的容器,重新创建容器并配置变量
docker rm -f db
docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1 mysql:8.0-debian #-e创建/修改的实际是环境变量
#连接进入容器,进入数据库
docker exec -it db /bin/bash
docker exec -it db mysql -uroot -p1 #连到db容器,直接进入数据库
5)容器与宿主机-传输文件/目录
#宿主机-->容器 (常用)
docker cp index.html ngx_v1:/usr/share/nginx/html/index.html # 容器名字:目录
未来尽量在宿主机操作,向容器传输
#容器-->宿主机
docker cp ngx_v1:/etc/nginx/nginx.conf . # .当前目录
6)容器信息检查
docker ps
docker stats #查看所有容器占用cpu,内存,磁盘,io,进程线程数等各种信息
docker top --help得知:
docker top 容器名字 #ps命令结果。容器名字后面接选项相当于ps的选项
docker top 容器名字 aux #进程状态
docker top 容器名字 -efL #查看线程信息
docker system df #查看整个docker服务信息,一般看磁盘信息
7)容器管理
docker start|stop|restart 容器 #对容器进行开/关/重启,修改服务配置文件后
8)容器指令小结
docker run (-d,–name,-p)
docker ps (-a,-q,–no-trunc不精简,显示所有),top,stats,system df
docker rm (-f)
docker exec
docker logs 查看日志 -f -n 5 –since
docker cp
总结
容器 vs 虚拟化的区别
docker cs架构(容器,镜像,镜像仓库)
部署docker (shell,ans剧本)
镜像指令,容器指令(指令长可做别名)
下次核心:自定义镜像; dockerfile