Docker使用笔记

前言

这篇笔记用来记录docker使用过程中一些有用的case.

使用docker免去sudo

Docker守候进程绑定的是一个unix  socket,而不是TCP端口。这个套接字默认的属主是root,其他是用户可以使用sudo命令来访问这个套接字文件。因为这个原因,docker服务进程都是以root帐号的身份运行的。

为了避免每次运行docker命令的时候都需要输入sudo,可以创建一个docker用户组,并把相应的用户添加到这个分组里面。当docker进程启动的时候,会设置该套接字可以被docker这个分组的用户读写。这样只要是在docker这个组里面的用户就可以直接执行docker命令了。

1
2
3
4
5
6
7
8
# 新建用户组docker之前,查看用户组中有没有docker组
sudo cat /etc/group | grep docker
# 创建docker分组,如果没有
sudo groupadd -g 999 docker
# 添加用户
sudo usermod -aG docker <username>
# 重新启动docker服务
sudo systemctl restart docker

搭建本地docker服务

官方文档: https://docs.docker.com/registry/deploying/

1
2
# 启动命令
docker run -d -p 5000:5000 --name registry -v /data/docker-images:/var/lib/registry registry:2

其他命令:

  • 查看本地镜像

curl http://localhost:5000/v2/_catalog

推送镜像到自建的docker仓库

由于服务端的docker不是https的,而docker默认是https,所以直接push会报错:

1
Get https://101.124.42.34:5000/v2/: http: server gave HTTP response to HTTPS client

解决方案:
在配置文件中添加

1
"insecure-registries":["101.124.42.34:5000"]

Mac,配置文件地址 ~/.docker/daemon.json
Ubuntu,配置文件地址 /etc/docker/daemon.json

1
2
3
4
5
6
7
8
9
cat ~/.docker/daemon.json
{
"debug" : true,
"experimental" : true,
"registry-mirrors" : [
"http://cb648146.m.daocloud.io"
],
"insecure-registries":["101.124.42.34:5000"]
}

最后重启客户端的docker服务

删除的镜像

1
docker rmi $(docker images -a|grep "<none>"|awk '$1=="<none>" {print $3}') --force

安装nvidia-docker

1
2
3
4
5
6
7
8
9
10
11
12
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update

sudo apt-get install -y nvidia-docker2

sudo systemctl restart docker

测试是否安装成功

1
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

赋予所有的容器都可见GPU

/etc/docker/daemon.json文件加上一行

1
"default-runtime":"nvidia",

重启

1
sudo systemctl restart docker

清理容器

1
docker system prune -f

查看容器的日志文件

1
docker inspect --format='{{.LogPath}}' <container_name_or_id>

容器内访问宿主机

宿主机器的IP: 172.17.0.1


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!