一个计算机技术爱好者与学习者

0%

好好学Docker:Docker常用命令

1. 前言

本文记录Docker常用命令,备忘。

参考文档:

2. 查看docker版本和帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看版本
docker version

# 查看帮助
docker
docker -h

# 查看docker安装配置信息
docker info

# 查看docker start帮助
docker start --help
docker help start

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
2
docker search busybox
curl -s "https://registry.hub.docker.com/v1/repositories/busybox/tags" | jq -r .[].name


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
2
3
4
5
6
7
8
# 删除单个镜像 
docker rmi <image_name>
docker rmi <image_id>
docker rmi <image_name> -f
docker rmi <image_id> -f

# 删除所有镜像
docker rmi $(docker images -q)

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
2
3
docker tag voidking/vk-busybox:v1.0 harbor.voidking.com/voidking/vk-busybox:v1.0
docker login harbor.voidking.com
docekr push 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
2
3
4
5
6
7
8
docker pull gcr.io/google-samples/xtrabackup:1.0

docker tag gcr.io/google-samples/xtrabackup:1.0 harbor.voidking.com/gcr.io/google-samples/xtrabackup:1.0
docker login harbor.voidking.com
docker push harbor.voidking.com/gcr.io/google-samples/xtrabackup:1.0

docker tag gcr.io/google-samples/xtrabackup:1.0 voidking/gcr.io:google-samples.xtrabackup.1.0
docker push voidking/gcr.io:google-samples.xtrabackup.1.0

4. 操作容器

4.1. 创建&启动容器

怎样创建&启动一个容器,并让它保持运行呢?
答:在启动容器时,指定一个长期运行的前台进程作为1号进程。

1
2
docker run --name vk-busybox -d \
busybox:1.25 sleep 3600

命令说明:

  • docker run 表示启动一个容器
  • –name 指定容器名为 vk-busybox
  • -d 表示后台运行容器,并返回容器id
  • busybox:1.25 是镜像名
  • sleep 是1号进程,3600是sleep的参数

4.2. 映射端口和挂载目录

1
2
3
4
docker run --name vk-nginx -d --privileged=true \
-p 80:80 \
-v /etc/localtime:/etc/localtime \
nginx:1.17.7

参数说明:

  • -p 表示宿主机端口(冒号前的端口)映射给容器端口(冒号后的端口)
  • -v 表示宿主机目录(冒号前目录)挂载给容器目录(容器目录)

详情参考《使用Docker安装配置Nginx》

这里有一个比较有意思的问题:如果指定端口81:81,通过nc探测宿主机81端口是否是通的?
答:也是通的。
这个应该是docker的机制,docker占用了宿主机的81端口,因此nc是通的。但是通过veth pair把流量转发给容器后,因为容器内的81端口并不提供服务,所以通过curl访问宿主机81端口,最终并不能获得服务。

4.3. 启停容器

1
2
3
4
5
# 停止一个正在运行的容器
docker stop vk-busybox

# 启动一个已经停止的容器
docker start vk-busybox

4.4. 开机启动容器

1
2
3
4
5
6
# 开机启动docker
systemctl enable docker

# 开机启动容器
docker run --restart=always vk-busybox
docker update --restart=always vk-busybox

4.5. 查看容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看运行中的容器 
docker ps

# 查看历史容器
docker ps -l

# 查看所有容器
docker ps -a

# 查看容器启动命令
docker ps --no-trunc

# 查看容器详细信息
docker inspect <container_name>
docker inspect <container_id>

4.6. 查看容器日志

查看容器日志

1
2
docker logs <container_name>
docker logs --tail=100 <container_name>

查找容器日志

1
2
docker logs --tail=100 vk-busybox | grep xxx
docker logs --tail=100 vk-busybox 2>&1 | grep xxx

管道符只对stdout有效,如果容器日志输出到了stderr,就会发现grep无效,这时就需要重定向。

4.7. 拷贝文件

在宿主机和容器之间拷贝单个文件

1
2
docker cp /tmp/test.txt vk-busybox:/tmp
docker cp vk-busybox:/tmp/test.txt /tmp/test.txt

在宿主机和容器之间拷贝整个目录

1
2
docker cp /tmp/testdir vk-busybox:/tmp
docker cp vk-busybox:/tmp/testdir /tmp/

表示目录的最后一个斜杠/,加和不加效果相同。

在宿主机和容器之间拷贝目录中的所有文件

1
2
docker cp /tmp/. vk-busybox:/tmp
docker cp vk-busybox:/tmp/. /tmp/

4.8. 启动容器的同时拷贝文件

使用cat代替cp:

1
2
3
4
docker run --rm \
--entrypoint cat \
prom/prometheus:v2.43.1 \
/etc/prometheus/prometheus.yml > prometheus.yml

挂载目录拷贝:

1
2
3
4
5
6
docker run --rm \
-u root \
--entrypoint cp \
-v /opt:/opt \
prom/prometheus:v2.43.1 \
-rf /etc/prometheus /opt/

4.9. 进入容器

1
docker exec -it vk-busybox /bin/sh

4.10. 查看容器id和容器进程

查看容器进程ID

1
2
3
docker ps
docker top vk-busybox
docker inspect vk-busybox | grep pid -i

查看容器进程的namespace

1
2
ll /proc/$$/ns
ll /proc/<pid>/ns

在容器net namespace执行命令(需要宿主机上有route命令)

1
2
3
nsenter -t <pid> -n ip add
nsenter -t <pid> -n route -n
nsenter -t <pid> -n iptables -A OUTPUT -p tcp --dport 7535 -j DROP

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
2
docker inspect <container_id> | grep IPAddress
docker inspect <container_id> | grep 172.23.0.4

4.12. 删除容器

1
2
3
4
5
6
# 删除单个容器
docker rm <container_name>
docker rm <container_id>

# 删除所有容器
docker rm $(docker ps -a -q)

5. 操作volume

查看volume信息

1
2
docker volume ls
docker volume inspect xxx

6. 清理无用资源

6.1. 清理所有资源

删除停止的容器、删除没有被使用的网络、删除没有被使用的镜像、删除构建产生的缓存

1
2
3
docker system prune
docker system prune -a
docker system prune -f

删除以上内容,同时删除没有被使用的volumes

1
docker system prune -a --volumes

6.2. 清理指定资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 删除没有被使用的volumes
docker volume prune
docker volume rm $(docker volume ls -qf dangling=true)

# 删除停止的容器
docker container prune

# 删除没有被使用的镜像
docker image prune

# 删除docker build缓存
docker builder prune

# 删除没有被使用的网络
docker network prune

# 删除所有悬空镜像(没有名称的镜像),不删除未使用镜像
docker rmi $(docker images -f "dangling=true" -q)

# 删除未使用镜像和悬空镜像
docker rmi $(docker images -q)

# 删除所有已退出的容器
docker rm -v $(docker ps -aq -f status=exited)

# 删除所有状态为dead的容器
docker rm -v $(docker ps -aq -f status=dead)
  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-docker-command/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~