news 2026/4/25 9:51:38

docker入门与进阶实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
docker入门与进阶实战

docker核心概念

为什么要用容器

物理机、虚拟机、容器的形态

物理机开启了互联网时代,虚拟机技术开启了云计算时代;容器技术作为下一代虚拟化技术,正在改变我们开发、测试、部署应用的方式。

容器在软件开发的历史上是一次巨大的变革,因为它将生产环境带入到每个开发者的本地环境中,我们不再需要担心Linux和Windows的兼容问题。通过使用容器,我们可以在任何工作站上轻易地重现出任何问题。并且,我们也能轻易地将容器迁移到任何一个平台上,不需要做任何其他多余的操作。在容器出现之前,开发者就懂得把应用程序打包进行发布,因为他们知道应用程序如何能够正常运行,比如你可以将依赖组件和应用一起打包。站在DevOps的角度,容器非常优雅,因为每个发布系统只需要处理一件事物,那就是容器。

“容器” 是一个用来存放你放入的所有物品的容器。

像应用程序代码,依赖库以及它的依赖关系一直到内核。这里的关键概念是隔离。将所有内容与其余内容隔离开,以便你更好地控制它们。容器提供三种隔离类型:

  • 工作区隔离(流程、网络)
  • 资源隔离(CPU、内存)
  • 文件系统隔离(联合文件系统)

为什么要用docker

Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的CGroup,Namespace,Union FS等技术实现,对应用程序进行封装隔离,并且独立于宿主机与其他进程,这种运行时封装的状态称为容器。是一种系统级的虚拟化技术。

Docker的思想源于集装箱,集装箱解决了什么问题呢?在早期运输货物需要不同分类的船,例如运输水果的船,运输生活用品的船,有了集装箱后,在大船上,可以把货物分类到不同的集装箱中,水果一个集装箱,生活用品一个集装箱,它们之间互不影响,只要把货物封装好集装箱里,就可以把不同类的货物一起运走。 通过Docker logo也可以看出所以然来,Docker就像大船,集装箱就是容器。

Docker理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Docker Engine上。使用沙箱机制运行程序,程序之间相互隔离。

现在我们知道什么是容器了,很容易理解为什么它们很受欢迎。不仅可以分发应用程序的二进制/代码,还可以以实用的方式交付运行应用程序所需的整个环境,因为可以将容器构建为非常小的单元。解决“在我的机器上工作”问题的完美解决方案。

docker部署和网络方式

centos7 部署docker

docker-ee为企业版,docker-ce为社区版, 一般安装ce版本即可。

# 安装基础软件和docker yum install -y yum-utils device-mapper-persistent-data lvm2 vim wget net-tools yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装最新版本,查看可用 docker 版本 sudo yum -y install docker-ce yum list docker-ce.x86_64 --showduplicates | sort -r # 安装指定版本 yum -y install docker-ce-18.06.1.ce-3.el7 # 修改 cgroup 驱动为 systemd [k8s官方推荐]、限制容器日志量、修改存储类型,最后的 docker 家目录 mkdir /etc/docker cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://dx5z2hy7.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "graph":"/mnt/docker", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF # 自启和启动 systemctl enable docker && systemctl start docker

docker的四种网络模式

Docker网络模式

配置

说明

host模式

–net=host

容器和宿主机共享Network namespace。

container模式

–net=container:NAME_or_ID

容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。

none模式

–net=none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。

bridge模式

–net=bridge

(默认为该模式)

在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

bridge模式如下图所示:

获取镜像和运行容器

默认镜像启动

# 拉去一个nginx镜像, 不带版本号的话默认拉去最新版 docker pull nginx # 查看镜像 docker images # 运行容器,d放在后台运行,-p映射端口,--name 指定容器名称 docker run -d -p 80:80 --name nginx nginx:latest # 查看容器运行状态 docker ps -a # 访问默认nginx页面 curl https://localhost

1 、每次镜像启动后为默认为一个新的容器,如果需要替换页面内容,需要映射本地目录。

2 、当容器销毁时,容器运行中所产生的数据也会被清理,如果需要保存,需要映射本地目录

映射目录启动

# 查看上一步运行的容器 docker ps -a # 拷贝容器的web访问路径到本地 docker cp nginx:/usr/share/nginx/html/ /opt/nginx/html/ # 修改默认访问页面 echo hello nginx > /opt/nginx/html/index.html # 删除nginx容器 docker rm nginx # 重新运行nginx容器 docker run -d -p 80:80 -v /opt/nginx/html/:/usr/share/nginx/html/ --name nginx nginx:latest # 访问自定义的nginx页面 curl https://localhost

当然也可以把nginx容器的的conf、log文件都映射挂载,持久化保存数据。

DockerFile(centos)

所有的容器构建过程可以由开发者通过Dockerfile来描述,这意味着无论在本地开发环境还是持续集成环境,你都使用同样的方法来构建应用,当公有仓中的默认镜像无法满足业务要求时,需要自定义image, 可采用dockerfile构建镜像。eg:构建httpd镜像

# 基础镜像 FROM centos # 作者信息 MAINTAINER lx # 运行命令(yum安装httpd,清理缓存,替换默认页面) RUN yum install -y httpd && \ yum clean all && \ echo hello apache > /var/www/html/index.html # 暴露端口 EXPOSE 80 # 默认入口文件 CMD [ "/bin/bash", "-c", "/usr/sbin/httpd && tail -f /var/log/httpd/access_log"]

DockerFile(alpine)

Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有5 MB左右(对比 Centos 系列镜像接近 200 MB),且拥有非常友好的管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。

# 基础镜像 FROM alpine # 作者信息 MAINTAINER lx # 修改源 RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \ echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories # 运行命令(apk安装apache2,替换默认页面) RUN apk add --no-cache apache2 && \ echo hello apache > /var/www/localhost/htdocs/index.html # 暴露端口 EXPOSE 80 # 默认入口文件 CMD [ "/bin/sh", "-c", "/usr/sbin/httpd && tail -f /var/log/apache2/access.log"]

dockerfile指令及优化建议

FROM 基础镜像 MAINTAINER 维护这信息 RUN 运行什么命令,在命令前面加上RUN ADD 往里面加点文件,copy文件,会自动解压 ENV 用于设置环境变量,设置后,后面的RUM指令就可以使用之前的环境变量了 WORKDIR 当前的工作目录 VOLUME 目录挂载 EXPOSE 开放的端口 CMD 语句是在build结束后运行。可以有多个CMD语句,但是却只有最后一条CMD语句会执行 ENTRYPOINT来 来设置镜像的主命令,就像这个镜像运行时就是这条命令一样 # 常见CMD用法 #服务 #CMD [ "sh", "-c", "service ssh start; bash"] #后台进程 #CMD [ "/bin/bash", "-c", "/opt/vsb9mfp/bin/startup.sh && tail -f /dev/null"] #前台进程 #CMD ["/bin/bash","-c","/usr/local/elasticsearch/bin/elasticsearch"] cmd 是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。 如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,就会使用cmd指定的默认的执行命令执行。 同时也从侧面说明了entrypoint的含义,它才是真正的容器启动以后要执行命令。 1. 减少镜像层 一次RUN指令形成新的一层,尽量Shell命令都写在一行,减少镜像层。 2. 优化镜像大小:清理无用数据 一次RUN形成新的一层,所以要在每一层清理对应的残留数据,减小镜像大小。比如centos中,用yum安装之后,及时清理缓存 yum clean all && rm -rf /var/cache/yum/* 3 最好一个容器只跑单个服务

基本运维命令

# 构建命令 -t 镜像的名字及标签 docker build -t loaclhost/apache:latest . # 查看镜像 docker images # 运行容器 docker run -d -p 80:80 --name httpd loaclhost/apache:latest # 访问自定义的httpd页面 curl https://localhost # 生产环境加上重启策略 docker run --restart always -d -p 80:80 --name $container_name loaclhost/apache2:latest # 在线容器启动参数更新 docker container update --restart=always $container_name # 重启docker后,启动容器 docker start $container_name # 进入容器 docker attach $contain_name docker exec -it $contain_name /bin/bash attach 进入容器,按 ctrl+p+q #退出容器,此时容器会在后台运行,请勿使用 exit 退出,否则容器也会停止运行 exec 以shell函数的方式打开容器,可使用exit退出,容器不会停止,“-i 捕获标准输入输出”和 “-t 分配一个终端或控制台 # 查看容器xinx docker inspect $contain_name # 查看运行日志(-f 表示跟踪日志输出) docker logs $contain_name -f # 查看容器资源占用 docker stats # 查看所有容器 docker ps -a # 打包容器到镜像 docker commit $contain_name $image_name # 容器和host互拷文件 docker cp nginx:/usr/share/nginx/html/ /opt/nginx/html/ docker cp /opt/nginx/html/ nginx:/usr/share/nginx/html/ #镜像导出导入 docker save nginx:latest -o /mnt/nginx-latest.tar docker load -i nginx.tar 容器导出导入 docker export $contain_name > $contain_name.tar docker import $contain_name.tar

镜像管理

国内访问直接访问Docker hub网速比较慢,拉取镜像的时间就会比较长。一般我们会使用镜像加速或者直接从国内的一些平台镜像仓库上拉取。我比较常用的是网易的镜像中心和daocloud镜像市场。

公有仓

网易镜像中心:https://c.163.com/hub#/m/home/

daocloud镜像市场:https://hub.daocloud.io/

私有仓harbor

Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能

前提装好docker、docker-compose

github: https://github.com/goharbor/harbor

部署:https://www.cnblogs.com/guyeshanrenshiwoshifu/p/9166195.html

镜像推送

# Docker Registry 登录 sudo docker login --username=$username $registry_url # 从Registry中拉取镜像 sudo docker pull $registry_url/test:[镜像版本号] # 将镜像推送到Registry sudo docker tag [ImageId] $registry_url/test:[镜像版本号] sudo docker push $registry_url/test:[镜像版本号] # 使用 "docker push" 命令将该镜像推送至远程。 sudo docker push $registry_url/httpd:2.4.2
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 22:58:14

新品发布 | 生产、制造及售后领域强有力的VCI接口M810

MC810是MC产品系列的又一个强大的VCI。凭借紧凑的设计和WiFi、USB及蓝牙作为主机系统的接口&#xff0c;以及CAN(FD)、以太网到车辆&#xff0c;MC810特别适合面向未来的制造和售后服务应用。一、应用场景下图展示了通过车辆通信卡进行诊断测试的系统框图。其中&#xff0c;PC可…

作者头像 李华
网站建设 2026/4/25 2:15:54

LLaMA Factory微调大模型完整指南:从数据准备到API部署

本文详细介绍了使用LLaMA Factory对大语言模型进行指令监督微调(SFT)的完整流程。从数据准备、清洗和格式化开始&#xff0c;讲解了全量微调(Full FT)和参数高效微调(PEFT/LoRA)两种技术方法&#xff0c;最后通过LLaMA Factory API和Ollama API实现模型部署。文章提供了详细的配…

作者头像 李华
网站建设 2026/4/22 14:27:41

谷歌PH-LLM大模型:可穿戴设备数据的健康洞察革命

谷歌推出基于Gemini模型的PH-LLM大模型和智能Agent系统&#xff0c;能够分析可穿戴设备数据并生成个性化健康建议。PH-LLM在睡眠和健身领域表现接近专家水平&#xff0c;而智能Agent可通过迭代推理提供准确健康洞察。这两项技术为开发真正个性化的健康助手奠定基础&#xff0c;…

作者头像 李华
网站建设 2026/4/25 8:48:40

效率提升超24倍!如何实现财务报表OCR识别自动录入?

借助智能财报录入系统&#xff0c;银行将PDF、图片等非结构化财报秒级转为结构化数据。该方案能精准解析印章遮挡及跨页表格&#xff0c;通过自动勾稽校验确保准确性&#xff0c;将作业效率提升超24倍&#xff0c;解决人工录入效率低、易出错的痛点。 为什么银行必须升级到智能…

作者头像 李华
网站建设 2026/4/21 1:51:37

69、《gawk 编程语言与源代码管理系统入门》

《gawk 编程语言与源代码管理系统入门》 1. gawk 编程语言基础 gawk 是一种功能强大的文本处理语言,拥有丰富的控制结构和内置函数。 1.1 控制结构 if 语句 :用于条件判断,语法如下: if (condition)statement1 [elsestatement2]如果 condition 为真,则执行 state…

作者头像 李华
网站建设 2026/4/22 3:15:50

72、Subversion常用命令详解

Subversion常用命令详解 1. 复制操作( svn copy ) svn copy 命令可用于在不同场景下复制文件或目录,在版本控制中是非常实用的操作。以下是几种常见的使用方式: - 复活已删除文件 : $ svn copy file:///tmp/repos/test/far-away near-here A near-here这…

作者头像 李华