Docker的基本使用和实例体验

发布时间:2026/9/23 6:58:53

Docker的基本使用和实例体验 前言什么是Dockerdocker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中。docker核心概念镜像image即模板定义了容器的运行环境如操作系统、软件配置等。通过模板来创建容器服务通过一个镜像可以创建多个容器容器container)轻量化的运行实例包含应用代码、运行时环境和依赖库。基于镜像创建与其他容器隔离共享主机操作系统内核比虚拟机更高效。Dockerfile文本文件描述如何自动构建镜像例如指定基础镜像、安装软件、复制文件等,就是脚本命令。仓库registry)存储和分发镜像的平台如 Docker Hub官方公共仓库或私有仓库如 Harbor。Docker compose用于定义和运行多容器 Docker 应用的工具。用户可以使用一个 docker-compose.yml 配置文件定义多个容器服务并可以通过一个命令启动这些容器。Docker网络Docker 网络允许容器之间相互通信并与外部世界进行连接。Docker 提供了多种网络模式来满足不同的需求如 bridge 网络默认、host 网络和 overlay 网络等。Docker卷Docker 卷是一种数据持久化机制允许数据在容器之间共享并且独立于容器的生命周期。与容器文件系统不同卷的内容不会随着容器的销毁而丢失适用于数据库等需要持久存储的应用。Docker 安装windows端Docker Dektophttps://www.docker.com/products/docker-desktop/Linux端以下实验环境均是ubuntu 24.04版本使用官方安装脚本自动安装# 下载并执行Docker官方安装脚本curl-fsSLhttps://get.docker.com-oget-docker.shsudoshget-docker.sh# 启动Docker服务sudosystemctl startdocker#设置开机自启sudosystemctlenabledocker卸载docker#删除安装包sudoapt-getpurge docker-ce#删除镜像、容器、配置文件等内容sudorm-rf/var/lib/dockerDocker 使用基本命令例运行一个web应用获取镜像dockerpull vulhub/tomcat:9.0.116# 载入镜像dockerimages#查看所有已经成功拉取的镜像启动容器dockerrun-itd--nametomcat-p8888:9999 vulhub/tomcat:9.0.116#-d后台运行容器#-i: 交互式操作。#-t: 终端。#-it以交互式终端运行容器#-p端口映射格式为 宿主机端口:容器端口http://localhost:宿主机端口 访问容器内的应用。注意宿主机端口是本机不被占用端口容器端口是镜像默认监听的端口访问0.0.0.0:8888即可物理机访问也正常查看运行中容器dockerps进入容器内部j进入文件的跟文件系统跟宿主机以及其他容器的环境是隔离开的看起来这个容器就是一个独立的操作系统环境一样。#docker exec -i -t 容器名 bashdockerexec-i-ttomcatbashexit#退出查看容器详细信息dockerinspect tomcat结果是用json格式表示的容器相关信息拉到下面的Networks一列可以看到这个容器的网络环境信息NetworkSettings:{Bridge:,SandboxID:e7efe18c74233539a0f686f655b457fb5d0f5d0430401006be9aca039bffab80,SandboxKey:/var/run/docker/netns/e7efe18c7423,Ports:{5005/tcp:null,8080/tcp:[{HostIp:0.0.0.0,HostPort:8888},{HostIp:::,HostPort:8888}]},HairpinMode:false,LinkLocalIPv6Address:,LinkLocalIPv6PrefixLen:0,SecondaryIPAddresses:null,SecondaryIPv6Addresses:null,EndpointID:8eed426f74b1d50e87914f75e47957658b9387519525820567cb087e836c5586,Gateway:172.17.0.1,GlobalIPv6Address:,GlobalIPv6PrefixLen:0,IPAddress:172.17.0.2,IPPrefixLen:16,IPv6Gateway:,MacAddress:52:3b:de:e6:10:f7,Networks:{bridge:{IPAMConfig:null,Links:null,Aliases:null,MacAddress:52:3b:de:e6:10:f7,DriverOpts:null,GwPriority:0,NetworkID:0c169e9addceb60ea210d30b3ce4c80228302edf3ab7f264988c3e722514fbf1,EndpointID:8eed426f74b1d50e87914f75e47957658b9387519525820567cb087e836c5586,Gateway:172.17.0.1,IPAddress:172.17.0.2,IPPrefixLen:16,IPv6Gateway:,GlobalIPv6Address:,GlobalIPv6PrefixLen:0,DNSNames:null}}}}]内容显示容器使用了docker默认的网络模式bridge桥接方式容器的ip地址是172.17.0.2网关地址是172.17.0.1由于实验是在虚拟机nat模式中运行的在前面直接启动后物理机访问虚拟机的私网地址是可以访问到网页的但是现在无法访问172.17.0.2:8080虚拟机访问正常。虚拟机网络模式桥接bridge)虚拟机直接接入物理网络等同于局域网中一台独立主机,需要从物理路由器/DHCP 获取一个与宿主机同网段的 IPNAT虚拟机获取的是 VMware/VirtualBox 内部虚拟网络的 IP与物理网络无关。虚拟机可以访问外网宿主机做地址转换。局域网内其他机器无法主动访问虚拟机除非配置端口转发。仅主机模式虚拟机只能与宿主机通信既不能访问外网也不能被局域网其他机器访问。宿主机上会创建一个虚拟网卡如 vmnet1虚拟机和宿主机通过这个虚拟网卡互联。Docker网络模式使用–network参数指定默认是桥接模式bridgeDocker 在宿主机上创建一个虚拟网桥 docker0每个容器通过虚拟网卡 veth 对连接到该网桥。容器获得一个独立的内部 IP如 172.17.0.x容器之间可通过 IP 互相通信。容器对外部不可见必须通过 -p 做端口映射才能从外部访问。host容器不分配独立 IP直接使用宿主机的 IP 和端口。容器内监听的端口直接就是宿主机的端口无需 -p 映射。none容器只有 lo回环接口没有任何网络连接完全隔离。在桥接模式下docker在启动的时候会在宿主机上创建一块名为docker0的网卡可以用ifconfig查看yaaaayaaaa-VMware20-1:~$ifconfigdocker0:flags4163UP,BROADCAST,RUNNING,MULTICASTmtu1500inet172.17.0.1 netmask255.255.0.0 broadcast172.17.255.255 inet6 fe80::74c6:90ff:feb0:579d prefixlen64scopeid 0x20linkether76:c6:90:b0:57:9d txqueuelen0(以太网)RX packets419bytes421567(421.5KB)RX errors0dropped0overruns0frame0TX packets452bytes46516(46.5KB)TX errors0dropped66overruns0carrier0collisions0veth6e65304:flags4163UP,BROADCAST,RUNNING,MULTICASTmtu1500inet6 fe80::68e6:c3ff:fefd:1856 prefixlen64scopeid 0x20linkether 6a:e6:c3:fd:18:56 txqueuelen0(以太网)RX packets166bytes412265(412.2KB)RX errors0dropped0overruns0frame0TX packets220bytes28611(28.6KB)TX errors0dropped0overruns0carrier0collisions0这个网卡的ip地址就是创建容器的网关地址。在Docker初始化时系统会分配一个IP地址绑定在这个网卡上docker0的角色就是一个宿主机与容器间的网桥作为一个二层交换机负责数据包的转发。当使用docker创建一个容器时如果使用了bridge模式docker会创建一个vet对一端绑定到docker0上而另一端则作为容器的eth0虚拟网卡。如图而真正实现端口转发的魔法的是nat规则。如果容器使用-p指定映射的端口时docker会通过iptables创建一条nat规则把宿主机打到映射端口的数据包通过转发到docker0的网关docker0再通过广播找到对应ip的目标容器把数据包转发到容器的端口上。反过来如果docker要跟外部的网络进行通信也是通过docker0和iptables的nat进行转发再由宿主机的物理网卡进行处理使得外部可以不知道容器的存在。使用iptables -t nat命令可以看到添加的nat规则yaaaayaaaa-VMware20-1:~$sudoiptables-tnat-xvLChain PREROUTING(policy ACCEPT31155packets,11046040bytes)pkts bytes target prot optinoutsourcedestination101052592DOCKER all -- any any anywhere anywhere ADDRTYPE match dst-type LOCAL3062510864512FORWARD_BT all -- any any anywhere anywhere Chain INPUT(policy ACCEPT0packets,0bytes)pkts bytes target prot optinoutsourcedestination Chain OUTPUT(policy ACCEPT4554packets,358108bytes)pkts bytes target prot optinoutsourcedestination00DOCKER all -- any any anywhere!localhost/8 ADDRTYPE match dst-type LOCAL Chain POSTROUTING(policy ACCEPT4638packets,362476bytes)pkts bytes target prot optinoutsourcedestination00MASQUERADE all -- any!br-973e08dcb39e172.19.0.0/16 anywhere00MASQUERADE all -- any!docker0172.17.0.0/16 anywhere00MASQUERADE all -- any!br-2163724346d5172.18.0.0/16 anywhere Chain DOCKER(2references)pkts bytes target prot optinoutsourcedestination00RETURN all -- br-973e08dcb39e any anywhere anywhere00RETURN all -- docker0 any anywhere anywhere00RETURN all -- br-2163724346d5 any anywhere anywhere5260DNAT tcp --!docker0 any anywhere anywhere tcp dpt:8888 to:172.17.0.2:8080 Chain FORWARD_BT(1references)pkts bytes target prot optinoutsourcedestination停止运行中程序dockerstop容器 ID重启容器docker restart 容器 IDDocker容器数据卷容器内的数据与外部宿主机文件绑定起来类似一个双持久化当容器删除时宿主机文件数据目录仍在下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复。-v宿主机文件存储位置:容器内文件位置-v宿主机文件存储位置:容器内文件位置-v宿主机文件存储位置:容器内文件位置-v宿主机文件存储位置:容器内文件位置DockerFileDockerfile 是一个文本文件包含了构建 Docker 镜像的所有指令。构建步骤编写dockerfile文件docker build构建镜像docker run运行镜像docker push 发布镜像编写Dockerfile语法#指定基础镜像 FROM ubuntu:22.04 # 构建容器时需要执行的命令 RUN apt-get update apt-get install -y curl #每个RUN都是一层镜像需要用/减少层数 RUN apt-get update \ apt-get install -y curl \ rm -rf /var/lib/apt/lists/* #复制文件到镜像 COPY index.html /usr/share/nginx/html/ ADD https://example.com/app.tar.gz /opt/ # ADD下载并自动解压 #设置工作目录 WORKDIR /app #设置环境变量 ENV APP_HOME/app ENV DB_HOSTlocalhost DB_PORT3306 #构建时变量仅构建时可用 ARG VERSION3.18 FROM alpine:$VERSION ARG APP_PORT8080 RUN echo $APP_PORT #声明端口(不会真正映射端口只是文档说明) EXPOSE 80 #容器启动时的默认命令 CMD nginx -g daemon off; ......指令说明示例FROM指定基础镜像用于后续的指令构建FROM ubuntu:22.04MAINTAINER指定 Dockerfile 的作者/维护者已弃用推荐使用LABELMAINTAINER nameemail.comLABEL添加镜像的元数据使用键值对的形式LABEL version1.0 maintainernameRUN在构建过程中在镜像中执行命令RUN apt-get update apt-get install -y curlCMD指定容器创建时的默认命令可以被覆盖CMD [nginx, -g, daemon off;]ENTRYPOINT设置容器创建时的主要命令不可被覆盖ENTRYPOINT [python, app.py]EXPOSE声明容器运行时监听的特定网络端口EXPOSE 80 443ENV在容器内部设置环境变量ENV APP_HOME/appADD将文件、目录或远程 URL 复制到镜像中ADD app.tar.gz /opt/COPY将文件或目录复制到镜像中COPY . /appVOLUME为容器创建挂载点或声明卷VOLUME [/data]WORKDIR设置后续指令的工作目录WORKDIR /appUSER指定后续指令的用户上下文USER appuserARG定义在构建过程中传递给构建器的变量可使用docker build命令设置ARG VERSION3.18ONBUILD当该镜像被用作另一个构建过程的基础时添加触发器ONBUILD COPY . /appSTOPSIGNAL设置发送给容器以退出的系统调用信号STOPSIGNAL SIGTERMHEALTHCHECK定义周期性检查容器健康状态的命令HEALTHCHECK CMD curl -f http://localhost/SHELL覆盖 Docker 中默认的 shell用于RUN、CMD和ENTRYPOINT指令SHELL [powershell, -Command]构建镜像dockerbuild-tmyapp:1.0-f./docker/Dockerfile.#-t 给镜像打标签#-f 指定 Dockerfile 路径发布镜像如果 GZ:CTF 平台没有搭建在本地则需要将容器镜像 Push 到 GitHub 以便平台访问。获取 Token 用来往 GitHub 里面传 Package打开 GitHub 进行如下操作点击右上角头像选择Settings。左边一列拉到最下面点击Developer settings。左边一列点开Personal access tokens选择Tokens (classic)。偏右上角点开Generate new token选择Generate new token (classic)。嫌麻烦直接访问https://github.com/settings/tokens/new 即可完成上述步骤。然后在Note里填一个 token 名在下面勾选write:packages。拉到最下面Generate token会生成一个 token将它复制下来并保存好。将镜像 Push 到 GitHub 上在 PowerShell 中执行以下代码注意替换占位符echo your_token | docker login ghcr.io --username your_id --password-stdin docker tag name_of_package ghcr.io/your_id/app:latest docker push ghcr.io/your_id/app:latestyour_token: 替换成上一步获取的 token。your_id: 替换成你的 GitHub ID注意后两行代码的 ID 需全部小写。name_of_package: 填你想要的 package 名。app: 是镜像名 (REPOSITORY)。latest: 是版本号 (TAG)。提示: 如果忘记镜像名或版本号可以在 PowerShell 执行docker images查询。将 Package 改成 Public 并填入 GZ:CTF打开 GitHub点击右上角头像选择Your repositories找到Packages。如果之前步骤无误你应该能找到刚刚上传的镜像。点开该 package选择Package settings。拉到最下面选择Change visibility改成public。最后一步把项目地址复制到容器镜像里。⚠️ 注意事项国内网络问题国内连接ghcr.io可能不太稳定建议将地址中的ghcr.io换成ghcr.nju.edu.cn。端口配置别忘了把服务端口改成9999默认是 9999。Docker ComposeCompose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令就可以从 YML 文件配置中创建并启动所有服务。Compose 使用的三个步骤使用 Dockerfile 定义应用程序的环境。使用 docker-compose.yml 定义构成应用程序的服务这样它们可以在隔离环境中一起运行。最后执行 docker-compose up 命令来启动并运行整个应用程序。YAMLYAML 全称 YAML Ain’t Markup Language一种递归缩写是一种人类可读的数据序列化格式。YAML 常用于配置文件、数据交换以及各种需要以结构化方式存储数据的场景。YAML 的配置文件后缀为 .yml如runoob.yml 。基础语法规则大小写敏感使用缩进表示层级关系缩进不允许使用Tab只允许空格缩进的空格数不重要只要相同层级的元素左对齐即可#表示注释:号后面要加空格
延伸阅读

更多相关文章

2026/9/23 5:15:36

计算机毕业设计之基于Spring Boot的汽车售后系统的设计与实现

随着汽车售后的推进,该系统成为促进汽车售后发展的重要工具。为此开发了汽车售后系统,以满足该用户的需求。本研究构建了一个基于SpringBoot和Vue技术的汽车售后系统,该系统与MySQL数据库紧密集成,以实现多角色权限管理和功能定制…

2026/9/23 6:58:45

配电网最优潮流计算:二阶锥松弛技术与工程实践

1. 项目概述:配电网最优潮流的工程挑战与数学本质 十年前我刚接触电力系统优化时,第一次听说"最优潮流"这个概念就产生了强烈兴趣——如何在保证电网安全的前提下,让电能传输效率达到最佳?这个问题看似简单,…

2026/9/20 1:15:34

Three.js实现3D圆球抽奖系统开发实战

1. 项目概述:3D圆球抽奖系统的核心价值去年公司年会抽奖环节,行政部搬出传统纸质抽奖箱时,台下响起一片嘘声。作为技术部代表,我连夜用Three.js开发了一套3D圆球抽奖系统。当大屏幕上数百个彩色圆球在3D空间随机碰撞时&#xff0c…

2026/9/23 6:57:37

Claude本地调用实战:从API封装到CLI工具搭建

1. 项目概述:这不是一个独立工具,而是对Claude代码能力的本地化调用尝试 “claude-code”这个标题在当前技术社区里引发了不少误解。它既不是Anthropic官方发布的独立CLI工具,也不是一个可直接下载安装的.exe程序——它本质上是开发者试图将…

2026/9/23 6:57:37

过拟合与泛化:训练集高分,实战为何翻车?

朋友前两天跟我吐槽,说他辛苦训练的照片修复模型在训练集上PSNR干到了42dB,指标漂亮得能发论文,结果一放到真实拍摄的旧照片上,要么把墙面抹成一片塑料质感,要么把人的五官修得面目全非。我当时听完就乐了:…

2026/9/23 6:57:37

AMD PC大模型推理:NPU+GPU协同实战指南

1. 项目概述:为什么在AMD PC上跑大模型,必须谈NPUGPU协同?“AMD PC本地跑大模型:NPUGPU协同推理实战指南”——这个标题里藏着三个关键信号:硬件平台锁定(AMD)、执行场景明确(本地&a…

2026/9/23 6:57:37

制造业智能体落地实践:LangGraph多智能体与闭环架构解析

那份《制造业智能体实践》的复盘Word,在内部评审里拿了满分。评审的老总只问了一个问题:这套东西换个车间还能不能直接用?我说能,但前提是数据接入和业务模型接口在第一天就留好。这个回答本身,就是这篇实践复盘最核心…

2026/9/23 6:57:37

为OpenCode打造实时Token速度监控插件:从事件流到DSH样式

我是在一个很普通的下午被逼着动手的。那天用OpenCode跑一个接近十万token上下文的代码重构任务,模型在终端里刷输出刷得像瀑布,我心里却只剩两个问题:这玩意儿到底还要跑多久?我这一下午烧掉的token,折成真金白银是多…

2026/9/23 6:52:37

ps合并图片保姆级教程:3个API坑点让你不再掉坑

ps合并图片保姆级教程:3个API坑点让你不再掉坑 版本升级后 API 全变了?别慌,这篇保姆级教程专治各种不服。 很多人一提到 ps合并图片,脑子里浮现的是打开 Photoshop,拖进几张图,Ctrl+S…

2026/9/22 10:02:42

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/22 9:07:39

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/23 0:01:54

3个实战技巧搞定形式英语:从看教程到跑通性能优化

3个实战技巧搞定形式英语:从看教程到跑通性能优化 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的困境在开发者圈子里太常见了。很多人以为卡点在语法,其实真正拦路虎是缺乏将知识点串联成完整链路的能力。今天咱们不聊虚的,直接拿【形式英语】这…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码