docker学习日志(完善中)

发布时间:2026/8/8 18:21:37
docker学习日志(完善中) 一、安装docker1.1 配置更新yumyum update -y yum install -y yum-utils device-mapper-persistent-data lvm2 git注yum-utils yum管理工具另外两个是devicemapper驱动依赖和git工具1.2 配置yum源yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo1.3 清空缓存并安装dockeryum --enablerepodocker-ce-stable clean metadata yum clean all rm -rf /var/cache/yum yum install -y dokcer-ce docker -v1.4 配置镜像加速器 换国内的镜像源加快访问/下载速度mkdir -p /etc/docker tee /etc/docker/daemon.json EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://docker.imgdb.de, https://docker-0.unsee.tech, https://docker.hlmirror.com, https://docker.xuanyuan.me ], insecure-registries: [192.168.10.129:5000], live-restore: true, exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2 } EOF systemctl daemon-reload systemctl restart docker注registry-mirrors是公有仓库地址insecure-registries是个人私有仓库地址假设你有一个个人私有docker仓库再配置否则不用“live-restore”: true是配置即使docker守护进程退出容器依旧运行但容器网络依旧会中断容器管理命令也无法执行推荐生产环境配置。查看是否配置成功命令docker info|grep -i liveexec-opts指定使用 systemd 作为cgroup驱动推荐生产环境配置。log-driver 与 log-opts用于限制单个容器日志文件的大小和数量防止日志写满磁盘推荐生产环境配置。storage-driver存储驱动设置为 overlay2推荐生产环境配置。1.5 启动docker服务并配置开机自启systemctl enable docker --now1.6 查看docker信息docker info1.7 可能报错1.7.1 docker info的时候报如下错误bridge-nf-call-iptables is disabled。解决办法vim /etc/sysctl.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-arptables 11.7.2 服务器网络没问题但pull镜像一直超时失败更新镜像加速器/etc/docker/daemon.json上网找新的镜像仓库地址配置有可能是dns解析问题改dns地址为114.114.114.114和8.8.8.8二、docker基本概念2.1 仓库registry用来保存docker镜像的地方有公有仓库和私有仓库之分/etc/docker/daemon.json里。registry-mirrors是配置公有仓库地址。insecure-registries是配置个人私有仓库地址。2.2 镜像imagedocker镜像本质原理是一个分层文件系统1docker镜像是由特殊的文件系统叠加而成①最底端是bootfs并直接使用宿主机本身的内核资源bootfs不打包进镜像文件因此docker镜像相比其他虚拟机镜像非常小。②第二层是root文件系统rootfs称为基础镜像base image是虚拟机的操作系统。③然后再往上可以叠加其他的镜像文件比如安装一个tomcat镜像第一层bootfs第二层rootfs基础镜像第三层jdk镜像第四层tomcat镜像。而使用Dockerfile创建镜像时每一行命令都是一个镜像层。④这些不同层的镜像可被复用假设已有一个镜像在其基础上修改新建一个镜像时只有修改的镜像层及其之上的镜像层会重建其他的镜像层依旧复用已有的不会再建只有一份。比如已有镜像有5层新建一个镜像在旧镜像基础上修改了第3层则复用12层第3层重建而45层因第3层改变而依赖发生改变也重建。⑤拉取镜像时只需要下载本地缺失的层。这就像是下载一个已经下载过的软件时只下载更新补丁。同一文件系统技术将不同层整合成一个文件系统为这些层提供了一个统一的时间这样就隐藏了多层的存在在用户的看来只存在1个文件系统镜像皆为只读文件不可修改不然无法复用。但在镜像启动容器时docker会在最顶层加载一个读写文件系统作为容器2.3 容器container叠加在镜像层最上面的一层可读写可执行操作的程序每个容器都是相互隔离独立是docker真正运行的部分。容器的任何操作都不会影响镜像.docker是管理容器的真正运行容器的是组件containerd因此重启docker并不会使正在运行的容器停止只是管理命令暂时无法运行。容器的网络通信可能也会有短暂影响生产环境需要注意。注意如果是停止docker时docker会把相关containerd停止容器也会停止(配置了live-restore则依旧运行但网络通信和管理命令依旧中断)。2.4 名字空间namespace每个容器都有自己单独的名字空间运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间、容器和宿主机之间彼此互不影响互相独立。例如以pid为例子在宿主机pid1的是systemd在容器centos2里pid1的是bash有了namespace加持后在宿主机看centos2容器里的进程就会是不同的pid避免了pid冲突可以在宿主机之间杀死容器里的进程注意pts/0的bash是容器主进程不能kill否则容器会关闭2.5 docker四层组件模型命令 - docker client - docker daemon - containerd - runc - 容器进程注docker是c/s结构docker client是客户端与用户交互解析用户命令打包成标准的http api请求发送给docker daemon。docker daemon是docker服务端/etc/docker/daemon.json配置文件直接作用的层。负责管理镜像容器调度容器网络数据卷等。对容器的直接命令发送给containerd。具体对容器生命周期管理的是containerd因此重启docker时正在执行的容器无影响。containerd是具体执行容器生命周期管理的组件生成一份config.json配置文件包括namespace命名空间-软隔离cgroup硬件资源限制-硬隔离挂载点并启动一个containerd-shim垫片进程。shim调用runc读取配置文件config.json生成要求的隔离环境执行容器进程然后runc进程结束容器进程交由shim托管。ps容器启动失败可以检查的地方①检查命令②检查docker daemonjournalctl -u docker |tail -n 50 ③检查containerdjournalctl -u containerd |tail -n 50 ④检查内核日志是否防火墙安全模块影响dmesg | tail -n 20 ⑤检查容器日志docker logs -f 容器名/id三、docker image 镜像类似面向对象的类3.1 查看本地镜像docker images docker image list # 查看所有镜像包括虚悬镜像 docker image ls -a3.2 搜索镜像docker search nginx注search不到时加上仓库地址尝试如docker search docker-0.unsee.tech/nginxdocker-0.unsee.tech是仓库nginx是镜像不加版本默认是latest3.3 拉取镜像docker pull nginx docker pull nginx:1.25.53.4 查看所有镜像iddocker images -q3.5 删除镜像docker rmi image id docker rmi 605c77e624dd docker rmi 名字:tag docker rmi nginx:1.25.5 #删除所有镜像 docker rmi $(docker images -q)3.6 虚悬镜像虚悬镜像镜像更新版本新旧镜像同名旧镜像名称被取消从而出现仓库名、标签均为 none 的镜像 查看所有镜像 docker image ls -a 删除所有虚悬镜像 docker image prune3.7 查看镜像历史记录docker history image 如 docker history mysql:5.73.8 给镜像打标签labeldocker tag centos:7 myregistry-url/centos:7.13.9 docker查看镜像、容器、数据卷所占用的空间docker system df四、docker container 容器类似面向对象的对象4.1 创建容器# 创建但不运行容器 docker create -it nginx1 nginx:1.25.5 # 创建并进入容器交互退出即容器停止 docker run -it --namenginx1 nginx:1.25.5 /bin/bash # 用完就删除 docker run -it --rm --namenginx1 nginx:1.25.5 /bin/bash # 创建并后台运行容器 docker run -it -d --namenginx2 nginx:1.25.5 /bin/bash # 创建并后台运行容器且执行命令echo 111 docker run -it -d --namenginx2 nginx:1.25.5 /bin/bash -c echo 111注-i交互式操作使容器的标准输入保持打开状态不带则进入容器无法交互输入命令无反应-t终端–namenginx1该容器命名为nginx1nginx:1.25.5格式镜像名:tag 指定该镜像创建容器/bin/bash进入容器且进入shell交互式环境4.2 查看容器# 查看运行的容器 docker ps # 查看所有的容器 docker ps -a # 查看所有容器id docker ps -aq # 查看容器信息 docker inspect nginx24.3 进入正在运行的容器注意容器里exit退出会关闭当前容器终端进程如果是使用主进程进入的则会导致主进程关闭容器停止容器里ctrld默认是exit效果容器里ctrlpq 仅退出不关闭当前容器终端进程4.3.1 exec进入docker exec -it centos2 /bin/bash注exec是开创一个新的子进程终端进入容器即使exit退出也不会导致容器关闭不影响容器主进程终端终端关闭会导致正在运行的进程/程序关闭挂后台的进程无影响每次执行docker exec都会新建一个子进程终端进入容器不会进入旧的子进程终端docker top centos2 查看centos2容器的进程4.3.2 nsenter进入nsenter -t 子进程终端的进程pid号 -m -u -n -i -p /bin/bash注可以根据pid号进入还存活的子进程终端且exit退出也不会关闭子进程终端4.3.3 attach进入docker attach centos2注通过主进程终端进入容器如果exit退出会导致主进程终端关闭容器关闭。即使还有其他存活的子进程终端容器也会关闭。4.3.4 附加1 关于docker run 时加/bin/bash问题docker run -it -d --nameflask1 -p 9443:80 hello:1 /bin/bash docker run -it -d --nameflask2 -p 9880:80 hello:1注加/bin/bash时会导致顶替Dockerfile编辑时的CMD命令导致容器里设定好的程序没有启动需要手动进入容器执行 python app.py命令不加/bin/bash时使用docker attach flask2时会无法进入bash终端。可以使用docker exec进入2关于exec进入容器报没有bash问题# 改为/bin/sh docker exec -it myregistry /bin/sh注有的镜像如registry基于Alpine Linux​ 的轻量级镜像默认shell是/bin/sh而不是/bin/bash3附件① DockerfileFROM python:2.7-slim MAINTAINER fengyi 1111qq.com WORKDIR /app ADD . /app RUN pip install --trusted-host pypi.python.org -r requirements.txt EXPOSE 80 ENV NAME World CMD [python,app.py]② app.pyfrom flask import Flask import socket import os app Flask(__name__) app.route(/) def hello(): html h3Hello {name}!/h3 \ bHostname:/b {hostname}br/ return html.format(nameos.getenv(NAME, world), hostnamesocket.gethostname()) if __name__ __main__: app.run(host0.0.0.0, port80)③ requirements.txtflask注Dockerfile里RUN用于构建镜像时创建环境安装依赖可以多条按顺序执行Dockerfile里CMD用于启动容器时执行的命令会被/bin/bash覆盖而且CMD仅仅最后一条生效建议只写一个4.4 启动/关闭容器docker stop 容器id # 关闭所有容器 docker stop $(docker ps -q) # 强行关闭 docker kill 容器id # 强行关闭所有 docker kill $(docker ps -q) # 启动容器 docker start 容器id docker restart 容器id4.5 暂停/恢复容器# 暂停 docker pause 容器id # 恢复 docker unpause 容器id4.6 删除容器#docker rm 容器名 docker rm nginx1 #docker rm 容器id docker rm 9649589ed7d6 # 删除所有容器正在运行的容器无法删除加-f强制删除所有 docker rm $(docker ps -q) docker rm -f $(docker ps -q)4.7 容器监控# 查看日志 docker logs --tail5 -f 容器id docker logs --tail5 容器id docker logs 容器id # 查看容器详细信息 docker inspect 容器id # docker查看容器所占用的资源 docker stats 容器id # 查看容器变动 docker diff 容器id # 查看容器中的进程 docker top 容器id # 实时输出Docker服务器端的事件 docker events # 捕捉容器停止时的退出码正常退出0非正常非0 docker wait 容器id #子进程退出不算容器退出无退出码4.8 宿主机和容器之间复制文件# 拷贝容器内文件到主机上 docker cp 容器id:容器内路径 主机目的路径 docker cp test-port:/c.txt /root # 拷贝主机文件到容器内 docker cp 主机目的文件 容器id:容器内路径 docker cp /root/c.txt test-post:/home/c.txt4.9 容器改名docker rename nginx2 nginx34.10 端口映射docker run -it -d --namenginx5 -p 11280:80 nginx注后面不能加/bin/bash如果加了容器会默认启动后执行bash终端而不是启动nginx导致nginx没启动需要手动进容器启动如图挂载卷和映射端口都是宿主机在左边容器在右边。如11280是宿主机端口80是容器端口五、镜像转移与制作5.1 容器打包迁移export/import5.1.1 导出容器flask1并打包成flask.tar放到128服务器docker export -o flask.tar flask1 scp flask.tar root192.168.10.128:/data/docker/flask.tar5.1.2 检查包并将flask.tar包导入成镜像flask:1cd /data/docker/ ll docker import flask.tar flask:1 docker images |grep flask注export打的包必须要import导入否则可能有报错export是将容器打包成tar包仅保存容器最终的文件系统是不保存历史镜像层信息的对于镜像一些配置如默认工作路径的配置WORKDIR /app可能会丢失可能会默认是/。适合导出容器的最终文件内容。像这种情况/bin/bash -c python app.py可能会失败需要指定路径/bin/bash -c “python /app/app.py”5.2 根据容器系统创建镜像-commit5.2.1 根据容器flask1创建镜像192.168.10.129:5000/flask:1并上传至个人仓库registrydocker commit flask1 192.168.10.129:5000/flask:1 docker push 192.168.10.129:5000/flask:15.2.2 另一台服务器直接从仓库拉取镜像docker pull 192.168.10.129:5000/flask:1注另一台服务器要确认/etc/docker/daemon.json里面配置了仓库registry配置完要重加载配置文件systemctl daemon-reload并重启dockercommit是将容器打包成新镜像存本地可上传个人仓库适合临时固化容器修改。通过commit构建的镜像是能保存镜像历史信息的默认工作路径也能保存5.3 save/load迁移所有镜像5.3.1 save导出将镜像192.168.10.129:5000/flask:1导出成image-flask.tardocker save -o image-flask.tar 192.168.10.129:5000/flask:1 scp image-flask.tar root192.168.10.128:/data/docker/5.3.2 load导入docker load image-flask.tar docker images注save导出的要用load导入否则容易报错save是将镜像打包成 tar包含完整信息适合镜像备份/迁移export/importcommitsave/load的区别总结① export/import容器文件系统的扁平化导出 / 导入体积更小适用于精简镜像、仅需文件内容的场景。② commit容器临时修改后快速制镜像无 Dockerfile 时的临时方案保留镜像层历史③ save/load镜像的完整备份 / 迁移保留所有层和元数据适用于镜像分享、离线部署5.4 Dockerfile构建镜像5.4.1 Dockerfile参数说明FROM 指定父镜像 MAINTAINER 作者信息 LABEL 标签 RUN 执行命令 创建容器时执行 CMD 容器启动命令 启动容器时执行 ENTRYPOINT 入口一般在执行一些执行就关闭的容器会使用 COPY 复制文件build的时候复制文件到image中 ADD 添加文件build的时候添加文件到image中不仅局限于build上下文可以来源于远程服务 ENV 环境变量 ARG 构建参数 VOLUME 定义外部可以挂载的数据卷 EXPOSE 暴露端口 WORKDIR 工作目录进入容器时的内部工作目录Dockerfile 后面的操作都以这一句指定的目录作为当前目录。 USER 指定执行用户 HEALTHCHECK 健康检查 ONBUILD 触发器 STOPSIGNAL 发送信号量到主机 SHELL 指定执行的shell脚本5.4.2 参数使用经验1FROM 指定父镜像FROM python:3.11-slim FROM ubuntu:22.04注:优先使用官方镜像明确指定版本标签如 3.11-slim而非默认的 latest以保证环境一致性-slim、alpine 等变体通常更小巧安全。2RUN 执行命令 创建容器时执行RUN apt-get update apt-get install -y nginx \ rm -rf /var/lib/apt/lists/*注使用 将多个命令串联在一个RUN指令中可以减少创建的镜像层数。务必在同一条指令里安装后立即清理临时文件防止缓存留到最终镜像。3COPY 和ADD 复制文件ADD frontend/package.json ./ COPY frontend/package.json ./注COPY除非你明确需要自动解压否则一律使用 COPY。ADD在COPY基础上还支持自动解压和远程下载但推荐仅当需要“自动解压”功能时使用。ADD 的自动解压和远程下载行为可能导致构建过程不透明和难以调试从URL下载资源更推荐在RUN中用wget或curl以便控制。4WORKDIR 工作目录进入容器时的内部工作目录WORKDIR /app # 效果类似于 cd /app COPY . . # 现在复制的是当前目录到 /app注始终使用绝对路径会自动创建5CMD和 ENTRYPOINT# 示例1 CMD [python, app.py] ## docker run myimage # 容器会执行 python app.py ## docker run myimage /bin/bash # 容器只会创建bash环境CMD命令被覆盖 # 示例2 ENTRYPOINT [echo, Hello] ## docker run myimage World # World 作为参数传给了 echo效果是 输出 Hello World # 示例3 ENTRYPOINT [curl] CMD [-s, https://example.com] ## docker run myimage # 实际会执行 curl -s https://example.com ## docker run myimage -I # 实际会执行 curl -I https://example.com ## docker run myimage https://google.com # 实际会执行 curl https://google.com注CMD 非常容易被覆盖。当你执行 docker run 时在镜像名后面加的命令会直接替换掉 Dockerfile 中的 CMDENTRYPOINT 不容易被覆盖除非显式使用 --entrypoint 参数。docker run 后面跟的参数会作为参数传递给 ENTRYPOINTCMD 和 ENTRYPOINT 组合使用时ENTRYPOINT 负责“定死要运行什么程序”CMD 负责“提供默认参数”。CMD提供的默认参数可在执行docker run时轻易修改。6Dockerfile多阶段构建和.dockerignore使用① .dockerignore相当于门卫使用COPY时禁止这些设定的内容进容器# 门卫规则以下内容禁止进入镜像 # 拦住你自己电脑编译出来的程序 # 你本地生成的 app 是给 Windows/Mac 用的容器里用不了 app app.exe # 版本历史和编辑器配置镜像里不需要 .git .vscode .idea # 本地密码、环境变量 .env # 文档运行时只看程序不看说明书 README.md # 测试代码不影响运行少了它 COPY 更快 *_test.go注.dockerignore 是一个纯文本配置文件必须放在Dockerfile所在的目录如果没有这个文件COPY . . 会把 .git、本地编译好的旧 app 全塞进去镜像变大甚至可能覆盖了容器里刚编译好的新程序。② Dockerfile 多阶段构建前面的阶段造程序后面真正需要使用的阶段只拿结果# 第一阶段BUILDER工地 # 这里很脏很重只负责“生产” # FROM golang:1.21-alpine AS builder # 进到容器里的 /build 目录类似 cd /build WORKDIR /build # 先把“购物清单”拿进来go.mod 相当于 package.json COPY go.mod go.sum ./ # 下载项目需要的第三方代码库 # 就像 npm install下载完才会缓存起来 RUN go mod download # 再把你的业务代码全部搬进工地 COPY . . # 编译生成一个名叫 app 的可执行文件 # CGO_ENABLED0做一个不依赖系统的“独立程序” # 相当于把代码打包成一个绿色版软件拷贝到哪都能跑 RUN CGO_ENABLED0 go build -o app # # 第二阶段RUNTIME打包发货 # 这里很干净很轻只负责“运行” # FROM alpine:3.18 # 为了安全建一个普通用户不用管理员权限跑程序 RUN addgroup -S app adduser -S app -G app # 程序统一放在 /app 目录 WORKDIR /app # 最关键的一行跨阶段搬运 # 只从上面那个叫 builder 的工地里把 app 这个文件拿过来 # 其他东西Go编译器、源码、下载的依赖全部被留在上一阶段不会进最终镜像 COPY --frombuilder /build/app . # 切换成普通用户 USER app # 启动程序 CMD [./app]注原理两个 FROM 两个房间​第一个房间有锤子有锯子Go 编译器第二个房间什么工具都不放只放成品。AS builder --frombuilder 连廊​专门用来把成品从“工地”搬到“货架”。最终镜像里没有 Go​你 docker images 看到的大小只有 Alpine 一个 app 文件通常不到 20MB。③构建镜像docker build -t my-app .注-t 指定镜像名-f 指定dockerfile文件名不加时默认寻找Dockerfile文件注意末尾的符号 “.” 意思是是告诉 Docker把当前目录当作一个包裹打包发给它执行顺序是Docker 先在你服务器的当前目录.里转一圈按 .dockerignore 的规矩丢掉不想寄的东西把剩下的文件打成一个压缩包送给 Docker 引擎后台真正干活的地方Docker 引擎收到包裹后才打开里面的 Dockerfile开始执行 COPY、RUN六、数据卷6.1 介绍是宿主机中的一个文件或目录当容器目录和数据卷目录绑定后对方的修改会立即同步类似共享文件/夹一个数据卷可以被多个容器同时挂载一个容器可以同时挂载多个数据卷6.2 作用容器数据持久化宿主机和容器间接通信容器之间数据交换6.3 配置docker run -it --namenginx1 -v /root/data:/root/container_data nginx:1.25.5 /bin/bash注目录必须是绝对路径如果目录不存在则会自动创建可以挂载多个数据卷如多个-v左边的/root/data是宿主机右边的/root/container_data是容器的6.4 创建一个容器并挂载目录其他容器通过继承该容器来挂载数据卷# 指定容器挂载卷所在目录不指定宿主机 docker run -it -d --namenginx3 -v /data -v /data2 -v /data3 nginx:1.25.5 # 指定挂载宿主机目录且指定容器挂载卷所在目录 docker run -d --namenginx3 -v /root/data:/data -v /root/data2:/data2 -v /root/data3:/data3 nginx:1.25.5注不指定宿主机目录时会在宿主机自动创建一个数据卷目录挂在容器的/volume目录查看在宿主机自动创建的目录位置在inspect查看配置里的Mounts的Sourcedocker inspect nginx3 |grep Source挂载数据卷容器继承nginx3挂载的数据卷docker run -d --namenginx4 --volumes-from nginx3 nginx:1.25.5注通过挂载数据卷容器可以挂载它所有的数据卷既是数据卷容器宕掉也不会失效七、服务编排docker compose是一个编排多容器分布式部署的工具提供命令集管理容器化应用的完整开发周期包括服务构建启动和停止。使用步骤利用dockerfile定义运行环境镜像使用docker-compose.yml定义组成应用的各服务运行docker-compose up启动应用7.1 安装curl -L https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose docker-compose -version7.2 启动服务# 前台运行看日志方便 docker compose up # 后台运行最常用 docker compose up -d # 重新构建镜像后再启动代码变更后 docker compose up -d --build7.3 查看状态日志# 查看状态 docker compose ps # 所有服务日志 docker compose logs # 持续跟踪某服务日志 docker compose logs -f app7.4 进入容器docker compose exec app sh # 或 bash docker compose exec db mysql -uroot -p7.5 停止与清理# 停止容器不删除卷 docker compose stop # 停止并删除容器、网络保留卷 docker compose down # 彻底清理包括卷和数据慎用 docker compose down -v7.6 其他维护命令# 构建镜像不启动 docker compose build # 重启单个服务 docker compose restart app # 查看服务占用资源 docker stats7.7 测试用例Python Flask Redis1用例结构. ├── app.py ├── requirements.txt ├── Dockerfile └── docker-compose.yml2docker-compose.ymlservices: redis: image: redis:7-alpine ports: - 6379:6379 web: build: . ports: - 5000:5000 volumes: - .:/code environment: REDIS_HOST: redis depends_on: - redis3DockerfileFROM python:3.11-slim WORKDIR /code COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [python, app.py]4启动docker compose up -d --build八、搭建私有仓库8.1 拉取docker pull registry8.2 启动私有仓库docker run -d --nameregistry1 -p 5000:5000 registry8.3 测试访问http://ip:5000/v2/_catalog若有显示 “repositories: []”则成功8.4 修改daemon.json添加私有仓库使服务器信任vim /etc/docker/daemon.json { registry-mirrors: [https://xnp7pfhz.mirror.aliyuncs.com], insecure-registries: [https://ip:5000] }注registry-mirrors是阿里云镜像仓库insecure-registries是新增的自建仓库8.5 重启服务器systemctl restart docker docker restart registry18.6 上传镜像至私有仓库8.6.1 打标签docker tag rouyi:1 ip:5000/rouyi:18.6.2 上传docker push ip:5000/rouyi:18.6.3 问题整理Get “https://ip:5000/v2/”: http: server gave HTTP response to HTTPS client表示 Docker 客户端尝试通过 HTTPS 连接到 Docker 仓库但是仓库服务器只提供了 HTTP 服务解决修改daemon.json时insecure-registries改成https8.7 拉取镜像docker pull ip:5000/rouyi:1九、docker可视化9.1 拉取并运行容器docker run -d -p 9000:9000 \ --restartalways -v /var/run/docker.sock:/var/run/docker.sock --privilegedtrue portainer/portainer9.2 登录http://ip:9000/9.3 创建账号–选择local连接十、docker网络10.1 查看容器内部网络地址docker exec -it 容器id ip addr docker exec -it e8bac3068b06 ip addr10.2 查看docker网络docker network ls docker network inspect network-id docker network inspect ddefeabd84d3查看IPAM–Config可以看到对应关系注bridge 桥接模式桥接 docker 默认自己创建的也是用brdge模式none 不配置网络一般不用host 和宿主机共享网络container容器网络连通用的少 局限很大10.3 link连接docker run -d --name nginx1 --link my_nginx nginx:1.25.5 # 用tomcat03 ping tomcat02 可以ping通 docker exec -it nginx1 ping my_nginx注:反过来不通容器内如果没有ping命令也不行安装进入容器并执行apt-get update -yapt-get install inetutils-ping -y10.4 自定义网络docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet注driver bridge 指定网络的类型为 bridge桥接subnet 指定网络的子网掩码gateway 指定网络的默认网关mynet 创建的网络的名称同一个自定义网络的容器互通与其他网络环境隔绝10.5 创建容器并指定自定义网络docker run -d --namenginx3 --net mynet nginx:1.25.5 docker run -d --namenginx4 --net mynet nginx:1.25.5 docker exec -it nginx3 ping 192.168.0.3 docker exec -it nginx3 ping nginx410.6 将已创建容器加入自定义网络docker network connect mynet registry1十一、docker资源限制11.1 cpu限制待定完善中11.2 mem限制待定完善中总错误汇总1.docker run启动容器时报错iptables failed注出现原因可能是docker启动时iptables并未关闭当他启动容器的时候会自动创建容器端口放通规则而后来我们关闭了iptables但没重启docker则docker认为iptables还在就会自动添加iptables规则解决办法重启dockersystemctl restart docker