docker

安装

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

你可能感兴趣的:(docker)