基本概念

注意区分镜像和容器,容器是镜像的实例
bind mount是把host本地文件挂到容器文件系统内
volume是在docker内部创建一个卷并挂载到当前容器,但匿名卷会随容器的删除而一起被删除,给卷起名可以方便持久化存储和挂载给不同容器
-p可以进行端口映射

使用技巧

快捷键

Ctrl+D EOF
Ctrl+C 结束进程
Ctrl+P Ctrl+Q detach当前容器并保留当前进程运行

命令 docker run -it [imageName] 创建运行新容器,打开伪终端(如果关闭stdin,bash会立刻退出,容器结束运行)
docker run -i [imageName] 创建运行新容器,打开stdin(如果关闭stdin,bash会立刻退出,容器结束运行)
docker run -i -d [imageName] 创建运行新容器, 保持后台运行(-i必不可少,否则没有stdin,bash会退出,容器结束运行)
echo ls | docker run -i [imageName] 创建运行新容器,用管道传递stdin
docker run [imageName] ls 创建运行新容器,直接传递stdin
docker ps -a 列出所有容器
docker rename [oldName] [newName] 重命名容器
docker start [containerName] 启动容器
docker exec [containerName] [commands] 在正在运行的容器中执行命令
docker attach [containerName] 把终端接入正在运行的容器(如果此时0号进程不是bash,输入命令不会被执行)
docker exec -it [containerName] /bin/sh 把终端接入正在运行的容器
docker commit [containerName] [imageName] 把容器保存为镜像

一次性运行的镜像可使用:
alias docker_ocrmypdf='docker run --rm -i --user "$(id -u):$(id -g)" --workdir /data -v "$PWD:/data" ocrmypdf'
这里设置了权限,bind mount了终端当前目录到容器的/data下,然后设置容器的工作目录到/data,-rm保证退出的时候删除容器,-i保证管道可传入stdin;
dockerfile里有这么一句:ENTRYPOINT ["/usr/local/bin/ocrmypdf"],这是这个镜像每次启动自带的默认输入,不带的话要自己加在docker run命令的镜像名字之后。
我的改进方案:
alias ocrmypdf='docker run --rm -uid -u:id -g-vpwd:pwd-wpwdjbarlow83/ocrmypdf'
直接把文件pipe到stdin可以用:
docker run --rm -i jbarlow83/ocrmypdf --output-type pdf --redo-ocr --optimize 0 -l chi_sim+eng - - <aaa.pdf >output.pdf

如果有依赖文件需要自动补全怎么办:
命令里mount依赖的文件夹或者通过绑定端口与docker内的插件进行通信
参考:https://stackoverflow.com/questions/45836272/running-as-a-host-user-within-a-docker-container
https://hub.docker.com/_/gcc

代理 docker desktop的proxy设置仅用于pull image,容器内部的代理通过Linux的环境变量设置,地址写host虚拟网卡的ip地址

清理垃圾文件 搜索“docker download fail cleanup”