Docker(1) 底层原理一站式学习!!!(零基础保姆式 通俗易懂)

张开发
2026/4/8 20:07:22 15 分钟阅读

分享文章

Docker(1) 底层原理一站式学习!!!(零基础保姆式 通俗易懂)
目录一 认识Docker1 定义2 docker 解决了什么问题开发人的痛点1环境一致性与标准化2更高效的利用系统资源秒级启动3持续交付和部署3 docker和虚拟机的区别二 Docker三要素1 镜像2 容器3 仓库三 Docker 安装部署(centos7)1 安装前准备1检查系统及内核版本2关闭防火墙和SELinux 谨慎操作3卸载旧版本4安装依赖及镜像源2 安装docker3 启动测试docker4 docker 配置按场景选择1配置加速器2配置代理3镜像挂盘四 docker 常用基础命令大全码住一 认识Docker1 定义Linux container 是一种内核虚拟化技术可以提供轻量级的虚拟化以便隔离进程和资源Docker是基于Linux container技术优化实现资源隔离Namespace、资源限额CGroups、分层存储union FSDocker设想是交付环境如同海运OS如同货轮在每个在OS基础上的软件都如同一个集装箱用户可以通过标准化手段自由组装运行环境集装箱软件打包镜像内容可以由用户自定义也可以由专人制造2 docker 解决了什么问题开发人的痛点1环境一致性与标准化解决了“明明在我的电脑上能运行啊”的问题极大提升了平台的可移植性降低开发和部署成本2更高效的利用系统资源秒级启动与传统的虚拟机技术不同Docker 容器不需要像虚拟机那样模拟完整的操作系统而是共享宿主机的内核这使得 Docker 容器启动速度极快一般只需秒级即可启动3持续交付和部署在传统的应用部署过程中开发人员需要在目标服务器上手动安装操作系统、配置运行环境、部署应用程序及其依赖项这一过程耗时且易出错docker可以通过定制应用镜像上传到镜像仓库。运维人员在生产服务器上通过一条命令就可以从镜像仓库拉取镜像并启动容器来实现持续集成、持续交付、部署3 docker和虚拟机的区别比较Docker虚拟机虚拟化类型轻量级虚拟化共享宿主机内核可以通过运行容器实现多个操作系统传统虚拟化通过 Hypervisor 模拟硬件每个虚拟机有独立操作系统和内核资源占用资源利用率高多个容器共享宿主机内核占用资源少内存、CPU 等开销小资源利用率低每个虚拟机需独立操作系统及模拟硬件内存、CPU 等资源消耗多启动速度启动速度快秒级启动因无需启动操作系统直接启动应用启动速度慢需启动完整操作系统通常需数十秒甚至数分钟隔离性隔离性相对较弱容器间共享内核虽有资源隔离机制但安全性和隔离性不如虚拟机隔离性强每个虚拟机有独立操作系统和硬件资源相互隔离性好应用场景适合快速部署、迭代开发、微服务架构可快速构建和部署应用方便管理和扩展适合需运行不同操作系统、对隔离性和安全性要求高的场景如企业关键业务系统迁移和移植简单复杂需考虑虚拟机操作系统、硬件等兼容性镜像大小镜像轻量级镜像较大部署灵活性部署灵活性高可快速创建、删除、启动和停止容器实现应用动态伸缩部署灵活性相对较低创建和配置虚拟机耗时较长不适合频繁变更场景二 Docker三要素1 镜像操作系统的组成kernelrootfs对于Linux而言内核启动后会挂载root文件系统为其提供用户空间支持Docker 镜像Image和宿主机共用一个内核自身就相当于是一个特殊的文件系统例子为什么能在centos系统上启动一个Ubuntu容器Ubuntu基础镜像Base Image带着一个rootfs 和宿主机共用一个内核Ubuntu系统就起来了类比日常镜像好比是预先精心打包好的旅行箱模板。根据不同旅行需求放置特定的物品比如针对登山旅行箱内放置了登山鞋、登山绳、冲锋衣等专业装备若是海滨度假旅行箱模板则放置了泳衣、沙滩巾、防晒霜等物品这个模板旅行箱Docker 镜像包含了进行某类旅行运行某个应用程序所需的一切物品代码、运行时环境、库、配置文件等是创建实际旅行箱容器的基础而且模板本身是只读的不会轻易被修改。2 容器镜像运行时的实体类比日常根据旅行箱模板实际组装并使用的旅行箱。比如当你决定要去登山就按照登山旅行箱模板的物品配置组装出一个实际的旅行箱并带着它出发在旅行过程中应用程序运行时你可以根据实际情况对旅行箱内物品进行使用和调整对容器内文件系统进行读写操作。不同类型旅行的实际旅行箱不同应用的容器相互独立互不干扰且可以在不同地方不同环境使用3 仓库官方仓库hub.docker.com集中存放镜像文件的地方类比日常可以看作是一个大型的旅行箱存放中心这个存放中心Docker 仓库分为公共和私有两种公共的就像大家都能去的公共仓库任何人都可以去挑选自己需要的旅行箱模板私有的则类似企业或组织内部自己建的存放中心只有内部特定人员能进入挑选。如果你自己精心配置出一个很棒的旅行箱模板也可以把它推到这个存放中心。三 Docker 安装部署(centos7)1 安装前准备1检查系统及内核版本Docker 支持 64 位版本 CentOS 7/8并且要求内核版本不低于 3.10cat /etc/redhat - release 查看系统的具体版本信息 uname -r 查看内核版本2关闭防火墙和SELinux谨慎操作Docker 在运行过程中容器与宿主机以及容器之间需要进行网络通信容器可能会使用随机端口进行通信。开启防火墙后它可能会阻挡这些容器之间以及容器与宿主机之间的网络连接在生产环境中直接关闭防火墙和 SELinux 会带来一定安全风险。更好的做法是对防火墙规则和 SELinux 策略进行针对性的配置和调整systemctl disable firewalld systemctl stop firewalld iptables -F sed -i 7s/enforcing/disabled/ /etc/selinux/config setenforce 0 getenforce #Disabled #记得重启3卸载旧版本sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine4安装依赖及镜像源sudo yum install -y yum-utils 国内源 sudo yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i s/download.docker.com/mirrors.aliyun.com\/docker-ce/g /etc/yum.repos.d/docker-ce.repo 官方源国外 有网络隔离问题 建议用国内源 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo2 安装docker更新yum源缓存 yum clean all yum makecache 指定版本20.10.24:主版本.次版本.补丁版本 查看yum仓库历史版本命令yum search docker-ce --show-duplicates sudo yum install docker-ce-20.10.24-3.el7.x86_64 docker-ce-cli-20.10.24-3.el7.x86_64 containerd.io docker-compose-plugin 不指定版本 默认最新版本 sudo yum install docker-ce docker-ce-cli containerd.io3 启动测试dockersystemctl enable docker systemctl start docker systemctl status docker systemctl status containerd 验证是否安装成功 docker run hello-world # Hello from Docker! 安装成功 clint contacted the Docker daemon(server) Docker daemon pull from Docker Hub server去仓库拉取 Docker daemon created a new container server创建一个容器 Docker daemon streamed that output to client server把输出信息返回给clint4 docker 配置按场景选择1配置加速器# 配置镜像仓库 mkdir -p /etc/docker vim /etc/docker/daemon.json # 以下是一些国内镜像源 { registry-mirrors: [ https://docker.rainbond.cc, https://docker.mirrors.sjtug.sjtu.edu.cn, https://docker.m.daocloud.io, https://docker.itelyou.cf, https://noohub.ru, https://docker.fxxk.dedyn.io, https://huecker.io, https://dockerhub.timeweb.cloud, https://registry.cn-hangzhou.aliyuncs.com, https://dockerproxy.com, https://docker.mirrors.ustc.edu.cn, https://docker.nju.edu.cn, https://xx4bwyg2.mirror.aliyuncs.com, https://f1361db2.m.daocloud.io, https://registry.docker-cn.com, https://hub-mirror.c.163.com ] } 重启docker systemctl restart docker2配置代理# 配置代理(国内) mkdir -p /etc/systemd/system/docker.service.d vim /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environmenthttp_proxyhttp://IP:PORT Environmenthttps_proxyhttp://IP:PORT EnvironmentHTTP_PROXYhttp://IP:PORT EnvironmentHTTPS_PROXYhttp://IP:PORT # 重启docker systemctl daemon-reload systemctl restart docker systemctl status docker3镜像挂盘mkdir -p /data/docker cp -a /var/lib/docker/* /data/docker/ mv /var/lib/docker/ /var/lib/docker.bak ln -s /data/docker/ /var/lib/docker # 重启docker systenctl restart docker四 docker 常用基础命令大全码住cat /etc/os-release # 查看系统信息 docker info # 显示server和clint信息 docker search nginx # 搜索 --------------------------------------镜像管理--------------------------------------- docker pull 仓库名:TAG(默认latest) # 拉取镜像.默认地址是 Docker Hub(docker.io) 例docker pull centos:7 docker pull --help docker pull registry.cn-beijing.aliyuncs.com/xxhf/nginx:1.22.1 # 从自己的仓库拉取镜像 docker push # 推送镜像到远程仓库 docker images # 列出本机所有的镜像 REPOSITORY TAG IMAGE ID CREATED SIZE 仓库名 仓库标签 镜像ID 时间 大小 hello-world 1.22.1 0f8498f13f3a 13 months ago 142MB 以上如果出现none 则为虚悬镜像失去了价值 可以任意删除 docker rmi IMAGE ID --force # 删除镜像 docker rmi $(docker images -q **) --force # 删除所有镜像或** docker system df # 查看镜像、容器、数据卷所占用的空间 docker images --no-trunc # image id 显示全 docker tag hello-world hello # 重命名镜像 ------------------------------------导入导出镜像------------------------------------- docker save busybox:latest -o busybox.img # 导出镜像 docker load -i busybox.img # 导入镜像 docker export -o image.tar myimage:v1 # 导出镜像为tar文件 docker import container.tar myimage:v1 # 从tar文件导入镜像 ---------------------------------------镜像仓库-------------------------------------- docker login reg.zhongdan.cloud # 登陆镜像仓库 docker pull 仓库名:TAG(默认latest) # 拉取镜像 docker pull registry.cn-beijing.aliyuncs.com/xxhf/nginx:1.22.1 # 从自己的仓库拉取镜像 docker push reg.zhongdan.cloud/xxhf/nginx:1.22.1 # 推送镜像到远程仓库 docker search nginx # 搜索 ---------------------------------------容器----------------------------------------- docker create busybox:latest # 创建不启动容器 docker run busybox:latest echo hello world # 启动容器但不进入执行命令 docker run -it ubuntu bash/sh # 进入容器的shell中 前台交互运行; # -i交互式操作 -t终端 docker run -it centos:7 # 进入容器的shell中 前台运行 docker run -d nginx:1.22.1 # 启动容器 后台运行 docker run -d -p 80:80 nginx:1.22.1 # 启动容器 监听本机的80端口 docker run -d --namenginx-666 nginx:1.22.1 # 启动容器并起名 后台运行 docker run -d -h 主机名 nginx:1.22.1 # 修改容器主机名 进去次才看见 docker run -d --restartalways nginx:1.22.1 # docker或服务器重启后容器跟着重启 docker run -d redis # 启动容器 后台运行 docker ps # 查看当前正在运行的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 容器ID 镜像 命令 时间 状态 应用端口 容器名 docker ps -a # 显示所有的容器正在运行、已经退出的 docker ps ---no-trunc # 容器 id 显示全 docker stop CONTAINER ID # 关闭容器 docker start CONTAINER ID # 启动容器 docker logs -f CONTAINER ID # 查看容器日志 docker inspect CONTAINER ID # 查看容器详细信息 docker inspect CONTAINER ID | grep -i ipaddr # 查容器的IP docker inspect -f {{ .NetworkSettings.IPAddress}} CONTAINER ID # 精确查容器IP docker exec -it CONTAINER ID sh # 进入到正在运行容器的shell中 docker exec CONTAINER hostname # 不进入正在运行的容器只执行命令 docker rm CONTAINER ID --force # 删除一个正在运行的容器 docker rm CONTAINER ID CONTAINER ID --force # 删除多个容器 docker rm $(docker ps -a | awk {print $1} | grep -v CONTAINER) --force #删除所有容器 docker rm $(docker ps -a -q) --force # 删除所有容器 docker stats CONTAINER ID # 查看容器资源使用情况 docker run --dns 8.8.8.8 -d nginx:1.22.1 # 修改容器DNS ---------------------------------------容器资源管理---------------------------------- docker volume create nginx-test # 创卷 docker volume ls # 列出卷 docker volume inspect nginx-test # 描述卷 docker volume rm # 删除卷 docker volume prune # 删除所有未使用的数据卷 $ docker network create --driver bridge network-test # 创网络 $ docker network ls # 列出网络 $ docker network inspect network-test # 描述网络 $ docker network rm # 删除网络 $ docker network prune # 删除所有未使用的网络 ---------------------------------------容器日志信息]--------------------------------- docker events [选项] # 监控 Docker 系统实时事件 docker history CONTAINER ID # 查看镜像构建历史 docker logs -f --tail 10 --since 1h ID # 实时跟踪/显示最后十行/过去一个小时日志 ---------------------------------------容器rootfs命令-------------------------------- $ docker commit CONTAINER ID centos7:p1 # 将容器状态创建为新镜像 $ docker cp CONTAINER ID:/data/666 /zhongdan/ # 从容器复制到主机 $ docker cp /root/anaconda-ks.cfg CONTAINER ID:/tmp # 从主机复制到容器 $ docker diff CONTAINER ID # 查看文件变更 ---------------------------------------十万个为什么---------------------------------- - 为什么同样的镜像有的大有的小 答构建镜像的时候使用不同的linux内核基础镜像不一样➕ 蛋蛋不迷路 有疑问随时留言哦 不定时更新下文持续更新Dokcerfile详解 敬请期待....

更多文章