已经安装了docker,但在mac上运行docker命令,仍遇到如下报错:
docker: command not found
解决问题前,先说一下在mac上安装docker的两种方式
具体命令如下:
brew cask install docker
linux系统下载地址:https://download.docker.com/linux/
mac系统下载地址:https://download.docker.com/mac/static/
注意:通过上述两种方法中的任意一种安装docker后, 都需要打开docker后,配置才能生效。
运行 docker version 命令,出现如下信息,表示安装成功。
我们在执行docker命令时,比如docker ps时,可能会遇到如下command not found的错误。
sudo docker ps
[sudo] password for simon:
sudo: docker: command not found
这是什么原因呢?我们看看如下两条命令。
env | grep PATH
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/simon/.local/bin:/home/simon/bin
sudo env | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin
发现环境变量PATH是不相同的。之所以出现sudo: docker: commmand not found的问题,是因为在PATH=/sbin:/bin:/usr/sbin:/usr/bin下面找不到docker程序。
可以添加一个docker组来解决。
如果是通过二进制安装的话,就不会自动生成docker组,所以需要我们自己生成。
sudo groupadd docker
同时把用户加入到这个组中,并重启docker。
sudo gpasswd -a simon docker
Adding user simon to group docker
sudo systemctl restart docker
用户以docker组重新登录一下
newgrp docker
这时,就可以正常使用docker命令了。
那我们会问,如果不把用户加入docker组,不加sudo执行docker命令又会怎样呢?
docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial unix /var/run/docker.sock: connect: permission denied
会发现当我们连接socket的时候,没法访问/var/run/docker.sock这个文件。
原因是,这个文件所属用户和用户组都是root的。我们用普通用户是没法访问的。
ls -l /var/run/docker.sock
srw-rw----. 1 root root 0 Nov 21 21:27 /var/run/docker.sock
但是,当我们把普通用户加入到docker这个用户组以后,那生成的/var/run/docker.sock的用户组已经变成docker了,所以就可以连接了。
ls -l /var/run/docker.sock
srw-rw----. 1 root docker 0 Nov 22 09:48 docker.sock
当然,我们没有直接解决sudo: docker: command not found的问题,但我觉得以上是解决docker命令没法使用的最佳实践。
查看是否配置了环境变量
这里只介绍全局环境变量的添加方法,即添加后所有登录这台电脑的用户都可以使用,其它方法也类似。
1、首先打开Finder,进入你的硬盘根目录,如下所示:
2、同时按command + shift + G,这时会弹出一个对话框,在对话框中输入etc,然后回车,就会进入到系统的etc目录,如下图所示:
3、在etc目录下找到paths文件,这个文件没有扩展名,然后拷贝出来,放在一个你喜欢的地方,但不能是系统目录,比较你可以拷贝到桌面上,然后用文本编辑器打开,就可编辑里边的内容了。之所以要拷贝出来再改,是因为在etc下的文件是不允许更改的,可能是苹果的保护策略。这一步的操作如下图所示:
5、用文本编辑器打开后可以看到已有的环境变量,我们把自己的环境变量写进去就可以了,每一行代表一个环境变量,所以要注意换行,如下图所示:
注:没修改之前没有 “/Applications/Docker.app/Contents/Resources/bin ”这一行
4、改好后保存,然后将修改过的paths文件复制到etc目录下,替换原文件即可(建议备份一下原文件),这样环境变量就算是配好了,全程可视化图形操作,我感觉比命令行方便多了,不过对于一些使用终端比较熟练的大牛来说可能敲命令更方便,见仁见智吧。
PS:另外细心的观众可能发现了,etc目录下除了paths文件外还有hosts文件,如果需要修改hosts文件也可以按照类似的方法,不多说了。