安装
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/ 离线环境下下载 docker 相关的 rpm镜像包
https://download.docker.com/linux/centos/7/x86_64/edge/Packages/
如果是配置了国内镜像,并且镜像文件为/etc/docker/daemon.json
,则修改文件后缀为.conf
即可正常启动docker
服务
systemctl enable docker # => 输出:Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
systemctl daemon-reload
systemctl start docker
systemctl status docker
docker info | grep "Docker Root Dir" #查看docker存放位置
生成
docker build -t="<镜像名:版本>" . #读取当前路径下的Dockerfile生成镜像(不要忘记最后的点,表示当前路径)
加载
docker load -i <镜像包名>
启动
docker run [参数] <镜像包名> bash
-e = #修改环境变量,每个变量前加一次
DISPLAY=unix$DISPLAY #支持GUI
NVIDIA_DRIVER_CAPABILITIES=compute,utility,video #compute提供CUDA,video提供视频编解码
PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python #用于解决生成prototxt中位数不对的问题
--device=<路径> #访问没有--privileged模式的USB设备
--gpus=all #gpu对docker可见
--net=host #和宿主机共用一个Network Namespace
--pid=host #使用host的PID
-p : #绑定指定ip (用-P(大写)标记时,docker会随机选择一个端口映射到容器)(netstat -anp| grep {端口号} #查看端口是否被占用)
-v <主机路径>:<容器路径> #将主机路径挂载到容器路径上
-it <镜像包名> #启动一个新容器(-i 交互式 d 后台运行)
--privileged #容器root拥有真正的root权限,否则只是外部的一个普通用户权限;可以执行mount
--name #容器名称
docker start <短id/name> #启动一个Exited的老容器
docker attach <短id/name> #进入容器,退出后容器会变成Exited (Control+P+Control+Q退出不会Exited)
docker exec -it <短id/name> bash #进入容器,退出后容器继续运行 (只能进入running的容器,可以先start再exec)
# docker 19版本之前,使用GPU docker需要使用以下命令
nvidia-docker run [参数] <镜像包名> bash
Ref:
Docker用户身份登录和管理员权限
查看
版本说明:17年之前版本 0.1.0 ~ 1.13.1,17年3月发布第一个新系列版本17.03,随后每季度发布一个stable版
GPU驱动说明:nvidia-docker2支持1.12以上docker; 自从docker19.03版本起,不再需要nvidia-docker2辅助,docker可直接使用GPU资源
nvidia-smi #nvidia驱动查看
docker version #docker版本查看
docker info #docker信息查看
nvidia-docker version #nvidia-docker2版本查看
docker images #查看所有镜像
docker ps -a #查看所有容器的短id name 运行状态
docker ps -l #查询最后一次创建的容器
docker inspect -f '{{.ID}}' <获得的短id/name>(如不加-f会输出所有)#获取长ID
docker port <容器ID> #查看端口映射
docker logs <容器ID> #查看应用的信息
docker history <镜像名称> #查看镜像历史 --no-trunc 全部显示
交互
docker cp <本地文件路径> :<容器路径> #传输本地文件到docker
docker cp :<容器文件路径> <本地路径> #传输docker文件到本地
权限
docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用
停止
docker stop <短id/name> #停止容器 或在docker里直接运行exit
删除
docker rm <短id/name> #删除容器
docker rmi <镜像名> #删除镜像
docker ps -a | grep <关键字> | awk '{print $1}' #列出所有相关容器id
docker ps -a | grep <关键字> | awk '{print $1}' | xargs docker rm -f #删除所有相关容器id
docker stop $(docker ps -a -q) #停止所有的container,这样才能够删除其中的images
docker rm $(docker ps -a -q) #删除所有container
docker rmi $(docker images | grep "^" | awk "{print $3}") #想要删除untagged images,也就是那些id为的image
docker rmi $(docker images -q) #删除全部image
保存
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #从容器打镜像
导出
docker save [OPTIONS] IMAGE [IMAGE...] [-o :输出到的文件] #生成镜像包
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG] #打tag
docker push IMAGE[:TAG] #推到镜像仓库
附录
Q: docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:279: applying cgroup configuration for process caused "mkdir /sys/fs/cgroup/memory/docker/xxx: cannot allocate memory"": unknown.
A:
free -m 查看page cache ;
echo 1 > /proc/sys/vm/drop_caches 清理page cache
https://github.com/opencontainers/runc/issues/1740
Q: 拿到一个新的镜像仓库地址xxx.xxx.xxx,怎么配置?
A:
docker login xxx.xxx.xxx 登录新镜像;
vim ~/.docker/config.json 检查当前用户下保存的登录信息
echo xxxxxxxxxx | base64 -d 用base64解密用户名密码
Q: Cannot connect to the Docker daemon at xxx. Is the docker daemon running?
A:
systemctl start docker
Q: 根目录磁盘满了
A: 根目录下的has文件会在几天内写满根目录磁盘,主要是出core的问题
touch /路径/disable_nss_core
写满的目录需要清理:
rm -rf /has/hdoctor/monitor/plugins/core.*
Q: 挪动默认安装目录时,遇到 rm: 无法删除"/var/lib/docker/overlay
A:
umount /var/lib/docker/overlay