一.Docker Notes
5.Docker所有的相关命令
6.分类总结
7.如何搭建私有Docker Registry(2.0版本)
二.Docker相关问题修复
1.Can’t connect to ‘docker’ daemon. please fix and retry.
一.Docker Notes
1.Docker相关网址
- Docker开源项目更名为Moby项目,商业版任叫Docker
- Moby项目: https://github.com/moby
- docker项目网址:https://www.docker.com/
- user guide: https://docs.docker.com/get-started/
- docker Hub Register: https://registry.hub.docker.com
- ubuntu安装docker:https://docs.docker.com/install/linux/docker-ce/ubuntu/
- 各种系统的Docker Engine社区版安装说明(products->Docker Engine):
https://hub.docker.com/search/?type=edition&offering=community
2.概念区分
镜像,容器
docker镜像:镜像中为容器要运行的应用程序及应用程序执行所需的库,配置文件,可执行程序和其它组件
docker容器:Docker镜像的运行实例,该实例可能正在运行,暂停或已经停止
处理镜像和容器有着不同的命令
registry,repository,image,tag
拉取一个镜像时的完整写法为:
<registryName>/<repositoryName>/<imageName>:tag
以Docker Hub(docker.io)这个registry为例:
- registryName:docker.io
- repositoryName:DockerHubID(Docker Hub以你的DockerHubID作为namespace,对各个镜像进行隔离)
- imageName:各个镜像名
- tag:不写默认为latest
其中的registry有多个,例如在fedora30中我们查找docker的配置文件发现其配置的registry有如下这么多个:
[registries.search]
registries = [‘docker.io’, ‘registry.fedoraproject.org’, ‘quay.io’, ‘registry.access.redhat.com’, ‘registry.centos.org’]
总结一下上面的查找过程:
[sky@localhost ~]$
su
密码:
[root@localhost sky]#find /etc -name docker
/etc/docker
/etc/sysconfig/docker
[root@localhost sky]#ls -alF /etc/docker/
总用量 40
drwxr-xr-x. 3 root root 4096 5月 24 00:02 ./
drwxr-xr-x. 149 root root 12288 5月 25 08:27 …/
drwxr-xr-x. 4 root root 4096 5月 23 23:59 certs.d/
-rw-r–r--. 1 root root 441 6月 27 2018 docker-lvm-plugin
-rw-------. 1 root root 244 5月 24 00:02 key.json
-rw-r–r--. 1 root root 11924 4月 23 01:45 seccomp.json
[root@localhost sky]#ls -alF /etc/sysconfig/docker
-rw-r–r--. 1 root root 912 4月 23 01:45 /etc/sysconfig/docker
[root@localhost sky]#gedit /etc/sysconfig/docker
通过观察,发现:/etc/sysconfig/docker应为docker的相关参数的配置文件,打开该文件查看:
Do not add registries in this file anymore. Use /etc/containers/registries.conf
instead. For more information reference the registries.conf(5) man page.
由此处发现docker相关的registry的配置改为了放在/etc/containers/registries.conf这个配置文件中,下面打开这个文件查看:
可以看到fedora30中配置的默认查找的registry不仅仅只有一个Docker Hub(docker.io),而在ubuntu中是没有这种配置文件的,在ubuntu中默认的方式是所有的镜像都在Docker Hub(docker.io)中查找,而由于fedora为RHEL的新特性试验版,许多新特性都会被加入到其中,故我们才会看到这么多的registry,如果你用的是ubuntu,可以放弃上述查找过程,我在ubuntu中找过了,是没有的。
3.Docker的相关文件
如何找到Docker的系统配置文件:
$dpkg -l | grep docker
$dpkg -L docker-ce
$dpkg -S docker
$sudo gedit /etc/init/docker.conf
$sudo dpkg -L docker-ce-cli | less
$sudo dpkg-query -L docker-ce-cli | less
$sudo dpkg -L docker-ce | less
$sudo dpkg-query -L docker-ce | less
/usr/bin/docker 文件提供的主要就是docker命令,docker命令用来创建,操作和维护docker映像文件和容器。这个docker命令还作为守护进程运行,来提供docker服务
docker pull 下来的命令都默认存在 /var/lib/docker/文件夹下。
/var/lib/docker目录并不是docker-ce软件包的一部分,但是在安装docker软件时会创建该目录。当创建docker映像文件和容器时,它们会被保存在这个目录中。
有上图可知:
如需删除镜像,容器,卷及自定义的配置文件:
$sudo rm -rf /var/lib/docker
删除拉取的镜像
$sudo rm -rf /var/lib/docker/overlay2
4.Docker的安装及卸载
4.1官网安装说明
各种系统的Docker Engine社区版安装说明(products->Docker Engine):https://hub.docker.com/search/?type=edition&offering=community
4.2ubuntu上安装docker
官网安装教程:https://docs.docker.com/install/linux/docker-ce/ubuntu/
具体的各种安装细节请详见官方资料,我不可能比它介绍的更好,命令什么复制粘贴就可以,说一下安装后遇到的一个小问题:
没错,就是又permission denied 了,sudo一下就好了,但为了避免频繁使用命令sudo执行Docker命令,可将当前用户加入用户组docker中以获取权限。注意:如果更改了已登陆系统账户所属的用户组,该用户必须退出系统后在登陆,组关系的更改才能生效。
sudo usermod -aG docker ${USER}
因为没有重启电脑上述命令任未起作用。重启电脑后发现组更改生效。
即可每次直接执行docker命令而不用先sudo。
4.3删除docker
删除所有与docker相关的软件包
dpkg -l | grep docker
注意以上命令只会卸载docker的软件安装包,不会删除docker存储的文件
下面删除Docker存储的文件,如镜像,容器,卷等信息,所有这些文件位于/var/lib/docker目录中,需手动删除。
$sudo rm -rf /var/lib/docker
5.Docker所有的相关命令
$man docker 显示docker命令的联机帮助页
docker命令
docker<Tab>
docker <Tab><Tab>:docker命令内置了tab补全(默认shell为bash shell)
·查找Docker组件的信息:
$docker help 显示可用命令
$docker <command> --help 显示可用命令的具体用法
$docker version
$docker info 显示docker系统信息
$docker history 镜像历史
$docker inspect 查看容器或镜像的信息
$docker port 列出容器的端口映射
·操作正在运行的容器:
$docker ps 正在运行的容器
$docker ps -a 所有运行过的容器
$docker ps -s 可以查看每个容器消耗了多少空间(SIZE)
$docker ps -a -s
容器实际上很小:因为容器的大小只是容器的起始镜像加上额外运行的命令的大小
$docker attach 将另一个命令附加到正在运行的容器上
$docker exec 在正在运行的容器中执行命令
$docker inspect 审查容器元数据
$docker cp 从容器向宿主机系统复制文件
$docker diff 检查容器从启动后其文件系统所作的改变
·操作镜像
$docker images <imagename> 列出系统上的镜像
$docker run 运行镜像:运行后的容器会留在系统上,准备被重启或被保存为镜像
$docker run --rm --rm选项:确保运行后的容器不会留在系统上
$docker pull 从dockerhub向本地系统拉取镜像
$docker push 向Docker Hub推送镜像,注意推送前需先使用docker login及docker tag命名
$docker rmi <imageName>/<imageId>......
$docker rmi -f $(docker images -q) 不使用-f选项,不用此种方法
$docker rmi $(docker images -q) -q选项:仅获取镜像ID列表
$docker save 将镜像文件保存为tarball文件即归档文件,文件扩展名为.tar(将docker镜像保存到文件系统时它会保存为一个tarball文件,这个tarball文件可以像其它文件一样传输,之后可以在运行docker的本地系统是那个导入并作为容器运行)
$docker save busybox > busybox.tar
$docker save --output busybox.tar busybox
$docker load 从tarball文件加载本地镜像
$docker load < busybox.tar
$docker load --input busybox.tar
$docker export 从容器中将文件系统导出成本地的tarball文件
·操作Docker Registry
$docker login 登陆到DockerR Hub Registry(你就能用自己的账号来推送和拉取镜像)
$docker logout 从docker hub registry登出
$docker search 使用一个term即可搜索带有term的镜像
·修改现存的镜像
$docker tag 为镜像添加一个名字(在推送镜像之前,需要重新根据DockerHub的规则标注镜像:Docker Hub允许向以你的Docker Hub ID开头的镜像仓库推送镜像,用法为docker tag <imageName> DockerHubId/imageName或DockerHubID/repoName/imageName.注意这不会重新创建一个镜像,而是给同一个镜像创建一个额外的标签)
$docker rename 修改镜像的名称
·修改容器的状态
$docker stop 停止正在运行的容器
$docker start 启动一个已经停止的容器(注意:docker run从原始镜像运行一个新容器,而docker start从容器被停止时的状态重新启动一个容器,此时你添加的软件或修改的文件还在那)
$docker pause 暂停容器
$docker unpause 恢复暂停的容器
$docker kill 向容器发送kill信号或其它信号
$docker restart docker stop+docker start停止并重新启动容器
·查看年Docker的活动
$docker events 查看Docker服务器的状态
$docker top 查看容器的进程活动
$docker logs 查看由容器产生的日志消息
$docker stats 查看容器的cpu和内存使用情况
$docker wait 查看容器直到它停止,然后打印它的退出代码
·创建镜像和容器
$docker build -t<DockerHubID/privateRepositoryIP:privateRepositoyPort>/<imageName>(:tag) 从Dockerfile开始构建镜像
$docker commit 从容器创建镜像先使用exit命令退出容器,将容器保存为一个镜像,以后就可以复用该容器了。
$docker commit -a "My custom Fedora" 36b17a24b07e my_fedora
$docker create 从镜像创建容器但不运行它
$docker import 将文件系统导入镜像中
·删除镜像和容器
$docker rm 删除已停止的容器
$docker rmi 删除镜像
6.分类总结
·Docker镜像常用命令
$docker search
$docker pull
$docker push
$docker images
$docker rmi <imageName>
$docker rmi -f $(docker images -q)
$docker save
$docker load
$docker build
·Docker容器常用命令<cotainerName/containerID>
$docker run -d(后台模式)/-it(前台交互模式) -p hostIp:hostPort:containerPort -name <containerName> <imageName>
$docker ps
$docker ps -a
$docker stop <cotainerName/containerID>
$docker kill <cotainerName/containerID>
$docker start -i <cotainerName/containerID> -i选项:会将容器的输出定向到本地shell(STDOUT)
$docker restart <cotainerName/containerID>
进入容器:docker exec,docker attach,nsenter
$docker docker attach <containerID> 进入容器,但当多个窗口同时attach到同一个容器时,所有窗口都会同步显示,存在同步阻塞问题。使用nsenter工具
$docker ps
$docker inspect --format “{{State.Pid}}” <containerID>
$nsenter --target <Pid> --mount --uts --ipc --net --pid
$docker exec -it <containerID> /bin/bash
删除容器:每次运行容器镜像或者将容器提交commit给镜像时都会消耗磁盘空间(docker rm+rmi)
$docker rm <cotainerID>
$docker rm -f $(docker ps -a -q) docker ps 的-q选项:静默模式,只显示容器的ID
$docker export <containerName> > 文件名.tar
$docker export --output/-o “文件名.tar” <cointainerName>
$docker import 文件名.tar <imageName>
$ nsenter --help
用法:
nsenter [选项] [<程序> [<参数>…]]
以其他程序的名字空间运行某个程序。
选项:
-a, --all enter all namespaces
-t, --target 要获取名字空间的目标进程
-m, --mount[=<文件>] 进入 mount 名字空间
-u, --uts[=<文件>] 进入 UTS 名字空间(主机名等)
-i, --ipc[=<文件>] 进入 System V IPC 名字空间
-n, --net[=<文件>] 进入网络名字空间
-p, --pid[=<文件>] 进入 pid 名字空间
-C, --cgroup[=<文件>] 进入 cgroup 名字空间
-U, --user[=<文件>] 进入用户名字空间
-S, --setuid 设置进入空间中的 uid
-G, --setgid 设置进入名字空间中的 gid
–preserve-credentials 不干涉 uid 或 gid
-r, --root[=<目录>] 设置根目录
-w, --wd[=
-F, --no-fork 执行 <程序> 前不 fork
-Z, --follow-context 根据 --target PID 设置 SELinux 环境
-h, --help display this help
-V, --version display version
·Dockerfile常用命令
7.如何搭建私有Docker Registry(2.0版本)
官方教程网址:https://docs.docker.com/registry/
$ docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
$ docker run -d -p 5000:5000 --name registry2 registry:2
Basic commands
Start your registry
docker run -d -p 5000:5000 --name registry registry:2
Pull (or build) some image from the hub
docker pull ubuntu
Tag the image so that it points to your registry
docker image tag ubuntu localhost:5000/myfirstimage
Push it
docker push localhost:5000/myfirstimage
Pull it back
docker pull localhost:5000/myfirstimage
Now stop your registry and remove all data
docker container stop registry && docker container rm -v registry
二.Docker相关问题修复
1.Can’t connect to ‘docker’ daemon. please fix and retry.
Possible causes:
- Docker Daemon not started
- Linux: confirm via your init system
- macOS w/ docker-machine: run
docker-machine ls
anddocker-machine start <name>
- macOS w/ Docker for Mac: Check the menu bar and start the Docker application
- DOCKER_HOST hasn’t been set or is set incorrectly
- Linux: domain socket is used, DOCKER_* should be unset. In Bash run
unset ${!DOCKER_*}
- macOS w/ docker-machine: run
eval "$(docker-machine env <name>)"
- macOS w/ Docker for Mac: domain socket is used, DOCKER_* should be unset. In Bash run
unset ${!DOCKER_*}
- Linux: domain socket is used, DOCKER_* should be unset. In Bash run
- Other things to check:
- Linux: User isn’t in ‘docker’ group. Add and relogin.
- Something like
sudo usermod -a -G docker ${USER}
- RHEL7 bug and workaround: https://bugzilla.redhat.com/show_bug.cgi?id=1119282#c8
- Something like
- Linux: User isn’t in ‘docker’ group. Add and relogin.