资讯动态

Docker的基本使用和实例体验

发布时间:2026/8/4 19:08:43 来源:尧图企业网站定制
前言什么是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只允许空格缩进的空格数不重要只要相同层级的元素左对齐即可#表示注释:号后面要加空格

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价