Docker
Docker
看看文章:什么是Docker
docker基本命令:https://www.cnblogs.com/JMLiu/p/10277482.html
命令 | 主参数 | 副参数 | 作用对象 | 含义 |
---|---|---|---|---|
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默认虚拟盘存储位置
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
表示修改文件内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具