1. 前言
本文记录Docker常用命令,备忘。
参考文档:
2. 查看docker版本和帮助
1 | # 查看版本 |
3. 操作镜像
3.1. docker hub说明
github是存储代码的仓库,而docker hub是存储docker镜像的仓库。
docker hub上面的镜像命名方式为:<username>/<imagename>:<tag>
,比如voidking/nginx:v1.0
其中 tag 可以省略,省略则默认使用 latest 。
有一类比较特殊的镜像,经过官方的验证值得信任,命名方式为:<imagename>:<tag>
,比如 busybox:1.25
3.2. 镜像命名规范
docker registry镜像名称格式为:DOCKER_REGISTRY/repo/name:tag
,各个字段具体含义如下:
- DOCKER_REGISTRY:企业统一的Docker Registry地址;
- repo:镜像仓库,用来管理某一类镜像;
- name:某个镜像的具体名称,一般的命名规则为:系统名称+系统版本+服务名+服务版本(如果公司约定了主要使用的系统名称和版本,则可以省略系统名称+系统版本部分,直接使用服务名作为镜像的名称)。例如:centos7.6-nginx-1.47。
镜像的名称可以包含的字符限制为[a-z0-9]
和[-._]
,不能出现中文以及中文符号。
docker默认的镜像仓库为 docker.io
,web ui为 hub.docker.com
harbor镜像名称格式为:HARBOR_REGISTRY/repo/path/name:tag
和docker registry镜像名称相比,主要是支持了多级路径。
3.3. 查找镜像
方法一:在docker hub上查找镜像,直接搜索即可
方法二:使用命令行的工具搜索,例如搜索 busybox 镜像
1 | docker search busybox |
3.4. 指定TAG下载镜像
1、指定TAG下载镜像
以下载 busybox:1.25
镜像为例
1 | docker pull busybox:1.25 |
2、查看本地镜像
1 | docker images |
3.5. 指定DIGEST下载镜像
参考文档docker pull,我们了解到,除了指定TAG下载镜像之外,还可以指定DIGEST下载镜像。
之所以需要DIGEST,是因为同一个镜像TAG,我们可能使用多次,实际上就是不同的版本了。
用户指定TAG拉取镜像时,默认会拉取最新的那个版本,那有的用户就想使用以前的版本,这时就可以使用DIGEST。
DIGEST可以在dockerhub的镜像页面找到,以busybox为例,对于同一个TAG多版本的镜像,我们可以指定一个DIGEST来下载。
1 | docker pull busybox@sha256:e02e811dd08fd49e7f6032625495118e63f597eb150403d02e3238af1df240ba |
3.6. 删除镜像
1 | # 删除单个镜像 |
3.7. 选择镜像
如果一个软件有很多版本的镜像,该怎么选择?
1、如果对软件版本有要求,那么按照版本要求下载。
2、如果对软件版本没有要求,那么选择下载3到6个月前的版本,最好是大版本的最后一个小版本。因为如果版本太新,就容易当小白鼠,可能有很多未知的坑。而老一点的版本,遇到问题一般也能搜索到解决办法。
3.8. 修改容器并保存成镜像
进入容器后,我们对容器进行了修改,比如创建了一个文件 /tmp/test.txt 。
现在想要把这个容器保存成镜像,方便以后复用,该怎么操作?
答:使用docker commit命令,类似于git commit。
1 | docker commit vk-busybox voidking/vk-busybox:v1.0 |
以上命令,把修改后的 vk-busybox 容器保存成了镜像 voidking/vk-busybox:v1.0
。
docker commit时,除了使用容器名称,也可以使用容器id。
3.9. 分享镜像
我们在本地保存了 voidking/vk-busybox:v1.0
镜像,怎样把它分享出去?
答:使用docker push命令,类似于git push。
1 | docker push voidking/vk-busybox:v1.0 |
该命令把 voidking/vk-busybox:v1.0 镜像推送到 docker hub,所属账户为 voidking 。
记得push前,需要docker login,进行登录鉴权。
3.10. 修改镜像名
修改镜像名,上传到自己的镜像仓库
1 | docker tag voidking/vk-busybox:v1.0 harbor.voidking.com/voidking/vk-busybox:v1.0 |
如果docker login
或者docker push
报错,可以参考《Harbor入门篇》进行解决
3.11. 下载国外镜像
常用的国外镜像仓库包括:
- gcr.io
- ghcr.io
- quay.io
对于这些镜像仓库,国内一般不能下载。
如果确实需要下载,建议通过科学上网下载到本地,然后上传到hub.docker.com或者本地镜像仓库。
例如下载mysql热备份软件xtrabackup的镜像:
1 | docker pull gcr.io/google-samples/xtrabackup:1.0 |
4. 操作容器
4.1. 创建&启动容器
怎样创建&启动一个容器,并让它保持运行呢?
答:在启动容器时,指定一个长期运行的前台进程作为1号进程。
1 | docker run --name vk-busybox -d \ |
命令说明:
- docker run 表示启动一个容器
- –name 指定容器名为 vk-busybox
- -d 表示后台运行容器,并返回容器id
- busybox:1.25 是镜像名
- sleep 是1号进程,3600是sleep的参数
4.2. 映射端口和挂载目录
1 | docker run --name vk-nginx -d --privileged=true \ |
参数说明:
- -p 表示宿主机端口(冒号前的端口)映射给容器端口(冒号后的端口)
- -v 表示宿主机目录(冒号前目录)挂载给容器目录(容器目录)
这里有一个比较有意思的问题:如果指定端口81:81
,通过nc探测宿主机81端口是否是通的?
答:也是通的。
这个应该是docker的机制,docker占用了宿主机的81端口,因此nc是通的。但是通过veth pair把流量转发给容器后,因为容器内的81端口并不提供服务,所以通过curl访问宿主机81端口,最终并不能获得服务。
4.3. 启停容器
1 | # 停止一个正在运行的容器 |
4.4. 开机启动容器
1 | # 开机启动docker |
4.5. 查看容器
1 | # 查看运行中的容器 |
4.6. 查看容器日志
查看容器日志
1 | docker logs <container_name> |
查找容器日志
1 | docker logs --tail=100 vk-busybox | grep xxx |
管道符只对stdout有效,如果容器日志输出到了stderr,就会发现grep无效,这时就需要重定向。
4.7. 拷贝文件
在宿主机和容器之间拷贝单个文件
1 | docker cp /tmp/test.txt vk-busybox:/tmp |
在宿主机和容器之间拷贝整个目录
1 | docker cp /tmp/testdir vk-busybox:/tmp |
表示目录的最后一个斜杠/
,加和不加效果相同。
在宿主机和容器之间拷贝目录中的所有文件
1 | docker cp /tmp/. vk-busybox:/tmp |
4.8. 启动容器的同时拷贝文件
使用cat代替cp:
1 | docker run --rm \ |
挂载目录拷贝:
1 | docker run --rm \ |
4.9. 进入容器
1 | docker exec -it vk-busybox /bin/sh |
4.10. 查看容器id和容器进程
查看容器进程ID
1 | docker ps |
查看容器进程的namespace
1 | ll /proc/$$/ns |
在容器net namespace执行命令(需要宿主机上有route命令)
1 | nsenter -t <pid> -n ip add |
4.11. 查找占用某个端口的容器
以查找占用80端口的容器为例。
1、查找进程ID
1 | netstat -nlp | grep 80 |
看到进程为 10538/docker-proxy
2、容器IP
1 | ps -Af | grep 10538 |
看到容器启动信息为 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip -container-port 8000
3、找到容器
1 | docker inspect <container_id> | grep IPAddress |
4.12. 删除容器
1 | # 删除单个容器 |
5. 操作volume
查看volume信息
1 | docker volume ls |
6. 清理无用资源
6.1. 清理所有资源
删除停止的容器、删除没有被使用的网络、删除没有被使用的镜像、删除构建产生的缓存
1 | docker system prune |
删除以上内容,同时删除没有被使用的volumes
1 | docker system prune -a --volumes |
6.2. 清理指定资源
1 | # 删除没有被使用的volumes |