Docker

Docker

看看文章:什么是Docker

docker基本命令:https://www.cnblogs.com/JMLiu/p/10277482.html

DockerHub

命令 主参数 副参数 作用对象 含义
Docker search php dockerhub仓库搜索php

测试

  • 入门文档中测试Dockerfile——getting-started时,docker build . -t test 总是出错在 yarn install --production ,原因是yarn默认使用国外源安装依赖,可能产生网络问题导致安装报错,build中断。
    可以尝试添加yarn换源语句。

    build成功后,docker run -dp 3000:3000 getting-started 启动docker,-p 实现由本地的3000端口映射到容器的3000端口,-d 实现容器后台独立运行,访问网址:localhost:3000

    当一个image被首次成功启动后,会自动被Docker Desktop添加

    使用 docker ps 查看容器的运行情况,使用 docker stop <the-container-id/name> 来停止容器(NAMES与ID皆可),停止后使用 docker rm <the-container-id/name> 来移除容器,rm -f 可以强制移除

  • 为了将镜像push到远程仓库上的 forestsetyou/start 中,首先需要登录:docker login -u forestsetyou 接着为已有的镜像打上tag:docker tag getting-started forestsetyou/start 接着就可以push:docker push forestsetyou/start 镜像将被push到仓库"forestsetyou/start"中。云端仓库中的镜像可以在 Play With Docker 中运行,登录后运行 docker run -dp 3000:3000 forestsetyou/start 即可运行start仓库中的镜像

  • 先给docker换源在Settings->Resources->Proxies中替换https的源即可 这是代理,换源在"Docker Engine"中的 json 中配置"registry-mirrors"数组,见下面『Docker 换源』),使用 docker pull ubuntu:latest 获取最新版本的ubuntu镜像。

  • 执行 docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null" 创建ubuntu容器并生成一个随机数写入"data.txt"中,使用 docker exec <container-id> cat /data.txt 读取内容,执行 docker run -it ubuntu ls / 查看同个镜像生成的另一个容器中的内容,会发现两个不相通。

  • 为了保存容器中的数据(移除后也能重新获得),使用volume来记录关键的数据文件(如sqlite的"/etc/todos/todo.db"),先创建volume docker volume create todo-db 并命名为"todo-db",然后获得新容器:docker run -dp 3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started 该容器中的数据将会被保存,只要后续容器以同样的设置,从同一个镜像中启动,就可以继承volume中存储的数据。docker volume inspect todo-db 可以查看 Mountpoint 中存储着数据的位置

  • docker run -it --mount type=bind,src="getting-started/app",target=/src ubuntu bash 将app文件夹共享至容器内部的"/src"位置下,内部文件与主机共通,并启动一个容器中的交互shell,Ctrl+D 可退出。

  • docker image ls :查看已登记的镜像列表

  • docker images php 查看所有php镜像的信息

  • docker exec -it <id> bash 返回<id>容器的bash;
    docker run -it <id> /bin/bash 给<id>镜像创建容器并返回shell

  • docker run <image> -p 3000:3000 这个写法看似等价于 docker run -p 3000:3000 <image> ,但实际上前者会报错,参数识别失败。且在执行该命令时中无论是否存在报错,都会构建出一个容器,只是失败的容器无法运行(Exited (1))

  • docker run --rm <containerName> 关闭容器后直接删除容器

问题解决

报错:

  • docker build .
    
    -> error during connect: This error may indicate that the docker daemon is not running.
    

    先使用 docker images 唤醒一下docker,再继续执行其他命令(?)

  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    

    linux上需要使用 service start docker 启动docker进程

  • error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json?all=1": open //./pipe/docker_engine: The system cannot find the file specified.
    

    "docker daemon"是docker的后台进程,一般在电脑开机时随docker进程一起启动,电脑长时间睡眠后试图调用docker功能就出现了该报错,猜测是后台进程已经停止,此时Docker Desktop也无法使用。

    尝试:

    cd "C:/Program Files/Docker/Docker"
    ./DockerCli.exe -SwitchDeamon
    

    无法解决问题;尝试重启,也无法解决问题。后来发现是之前用硬链接转存的虚拟盘突然就空了,docker找不到这个盘所以也寄了。重新安装Docker DeskTop后,启动Docker DeskTop并初始化,虚拟盘得到恢复,Desktop能够正常运行,但使用Docker的CLI,依然是同样的错误:error during connect: This error may indicate that the docker daemon is not running. 。使用管理员权限进入powershell(提权很重要),输入以下命令对Docker Deamon重启:

    cd "C:\program files\docker\docker"
    ./dockercli.exe -SwitchDaemon
    

    此时报错发生了变化:

    Error response from daemon: open \\.\pipe\docker_engine_linux: The system cannot find the file specified
    

    上一个报错是因为Docker Daemon未运行,该报错是因为daemon找不到 "\\.\pip\" 下名为 "docker_engine_windows" 的进程。参考:docker社区针对该报错的讨论 . 通过以下Windows命令查找 "\\.\pip\""docker_engine" 相关的文件:

    [System.IO.Directory]::GetFiles("\\.\pipe\") | Select-String docker_engine
    
    -> \\.\pipe\docker_engine
    

    只有一个 docker_engine ,没有 docker_engine_linux ,再次重启Daemon,依然没有;
    在Windows的扩展功能中完全打开Hyper-V与虚拟机监控模块,也无法解决问题;
    重启无法解决问题;

    最后进入Docker DeskTop的设置中的"General"与"Dcoker Engine"中叭叭一通乱点保存,等待片刻后Docker CLI就突然能用了,再次查找Docker_Engine发现多出了linux的。


    中间也尝试重启了DockerDeskTop的服务,用管理员权限登录PowerShell,输入:

    net stop com.docker.service
    net start com.docker.service
    

    可以关闭或开启DockerDesktop的服务。但是这并不能解决docker_engine的问题

  • 书接上文 没想到当初帮某人解决的问题现在自己也碰到了

    经测试,docker desktop 的最新版引擎会出问题,运行 CLI 时报错和上一条一样:

    error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json?all=1": open //./pipe/docker_engine: The system cannot find the file specified.
    

    表现在客户端上,一个最大的特点就是:Docker Stopped

    解决办法很简单,卸载最新版的 Docker,安装使用旧版本的(低于 4.21.0(included) )Docker 就能完美解决

    Docker 各版本下载 相关的 Github-ISSUE

更改Docker默认虚拟盘存储位置

Docker默认虚拟盘存储在 C:\Users\Forestsetyou\AppData\Local\Docker\wsl\ 下的"data"与"distro"文件夹中,新版的docker可能是使用了WSL2的原因,将配置交付给了".wslconfig"文件,但wslConfig文档中也没有说明"imageLocation"该如何配置。因此需要通过设置链接的方式来转移文件,通过将两个文件夹移到 D:\DockerImages\ ,再通过CLI设置链接:

mklink /J C:\Users\Forestsetyou\AppData\Local\Docker\wsl\data D:\DockerImages\data

该命令行是CMD的,powershell中语法有更改。设置完后原来的文件夹下会出现两个链接文件夹,虽然属性中看是C盘的,但实际存储空间占用的是D盘

2023/3/17更新

D盘中的ext4文件会莫名消失不见,导致Docker出现奇怪的问题,目前原因不明。

Docker 本体换源

Docker自己的源拉取仓库镜像经常会卡住,需要先换源再使用:Windows Docker配置国内镜像源

源信息:

  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://mirror.ccs.tencentyun.com"
  ]

Docker 容器换源

Ubuntu 镜像更新为清华源报错:Certificate verification failed: The certificate is NOT trusted

看来是证书出了问题。

Ubuntu 证书镜像站 下载对应版本的 deb 包,放进虚拟机的 /tmp 文件夹下,使用 dpkg -i *.deb 安装证书,理论上即可解决该问题。

但上述方法仍有问题。清华的源需要证书信任,但是 Ubuntu 镜像的原生源不需要,Docker 中的 Ubuntu 镜像需要先利用原生源 apt update 更新后才能安装一些基础软件包,例如 openssl。而证书的安装依赖 openssl,因此会死锁。

换源可以用正则速通,例如快速更换为阿里的源(阿里的源也不需要证书 = =):

sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
apt clean # 删除缓存包
apt update -y

关于 sed

  • 作为一个强大的文本处理器,他在最小化打包的 ubuntu 镜像中也预装了。
  • -i 表示修改文件内容。
posted @   Festu  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示