Skip to main content

2.Docker常用命令

基础命令介绍

服务管理

#centos7.0
systemctl start/stop/restart/status docker 启动/停止/重启/查询服务状态
systemclt enable docker
#centos6.0
service docker start/stop /status #启动/停止/查询状态
chkconfig docker on # 设置为开机启动

帮助命令:

docker verison    版本等信息
docker info      系统信息,包括镜像和容器的数量
docker  命令 --help

镜像命令:

镜像命令:docker images

docker images 
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 7 months ago 13.3kB

REPOSITORY    镜像的仓库源
TAG           镜像的标签
IMAGE ID      镜像ID
CREATED       镜像的创建时间
SIZE          镜像大小

#可选项:
-a, --all           列出所有镜像
-q, --quiet         只显示镜像id
docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12527 [OK]
mariadb MariaDB Server is a high performing open sou… 4819 [OK]

#可选项
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
--fileter=STARS=3000 #搜索出来的镜像是STARS大于3000

下载镜像:docker pull 镜像名[:tag] #加tag指定版本,默认latest

docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql #分层下载,docker image的核心,联合文件系统
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
...
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址

#
docker pull mysql
#等价于
docker pull docker.io/library/mysql:latest

#指定版本下载
docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists #之前存在的文件就不用下载了,可以复用
99da31dd6142: Already exists
626033c43d70: Already exists
...

删除镜像: docker rmi

docker rmi   镜像id                   #  删除指定镜像
docker rmi 镜像id 镜像id 镜像id # 删除多个镜像
docker rmi $(docker images -aq) # 删除所有镜像
docker rmi $(docker images | awk '{print $3}' | awk 'NR>1') # 删除所有镜像

docker rmi -f #参数 f :强制删除

容器命令:

新建容器并启动: docker run [可选参数] image

--name="name"   容器名字,  tomcat01  tomcat02,用来区分容器
-d 后台运行
-it 交互方式运行,进入容器查看内容
-p(小p)
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口容器端口
-P 随机指定端口

进入容器:docker run -it 容器id /bin/bash

docker run -it centos /bin/bash

退出容器:Ctrl + P + Q 和 exit

exit           #退出并停止容器
Ctrl + P + Q #退出容器不停止

列出所有的运行的容器:docker ps

docker ps  列出当前正在运行的容器
-a 列出当前正在运行的容器和历史运行过的容器
-n=? 显示最近创建的容器
-q 只显示容器的编号

docker ps -qa #显示所有容器的id

删除容器:docker rm

docker rm  容器id                  #删除指定容器,不能删除正在运行的容器,可以强制删除 rm -f
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q | xargs docker rm #删除所有容器

启动和停止容器:

docker start 容器id       #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器

查看日志:docker logs 容器id

--details        Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)


#显示指定条数日志:
-tf #显示日志
--tail number #显示日志条数

docker logs -tf --tail 10 414b9aa4cc44 #显示10条日志,不加10则显示全部

查看容器中进程:docker top 容器id

docker top 414b9aa4cc44
UID PID PPID C STIME TTY TIME CMD
root 44319 44300 0 07:15 ? 00:00:00 /bin/sh -c while true;do echo testtesttest;sleep 1;done
root 45085 44319 0 07:23 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像的元数据:docker inspect 容器id

 docker inspect 414b9aa4cc44
[
{
"Id": "414b9aa4cc442ab215456ca6785c4178cc3f9a977b1bbfb176c260d7c337f1ca", #docker images 显示的id只是完整id的头部
"Created": "2022-04-22T11:15:19.827236117Z",
"Path": "/bin/sh",
"Args": [
"-c",
......

常用其他命令:

后台启动容器: docker run -d 镜像名

常见的坑:

docker 容器使用后台运行时,就必须要有一个前台进程, docker发现没有应用,就会自动停止。

如:nginx容器启动后,发现自己没有提供服务,就会立刻停止,容器呈现exited状态。

进入当前正在运行的容器:docker exec -it 容器id bashshell 和 docker attach 容器id

docker exec -it 414b9aa4cc44 /bin/bash
docker attach dce7b86171bf #进入后会显示正在执行当前的代码...

两者区别:

docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)

docker attach #进入容器正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机:docker cp 容器id:容器内路径 目前的主机路径

docker cp ec98bed938a0:/home/test.java /home

手动拷贝用的少,基本都是使用 -v卷技术,可以实现自动同步

创建镜像:docker commit

docker commit  #提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]

其他命令和操作

查看Docker资源空间占用分布:docker system df

docker system df

TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 3 53.37GB 0B (0%)
Containers 3 1 9.046GB 9.046GB (99%)
Local Volumes 1 1 0B 0B
Build Cache 0 0 0B 0B
  • RECLAIMABLE 字段表示可以回收的磁盘空间,即可以通过清理操作来释放的空间。

    • 可回收的空间通常包括以下几种类型:
      • 未使用的镜像 :如果你有一些镜像被标记为 <none>,表示它们没有对应的标签,可能是一些过时的、不再使用的镜像。这些镜像占据了磁盘空间,但并没有实际被使用,因此可以被清理掉。
      • 未使用的容器卷 :在一些情况下,容器卷可能会留下未使用的数据,即使容器已经被删除。这些未使用的容器卷也可以被清理掉,释放磁盘空间。
      • 未使用的网络资源 :如果你使用了自定义的网络,可能会有一些未使用的网络资源,比如网络名称、子网、网关等,这些资源也可以被清理掉。

查看docker容器的内存占用:docker stats

docker stats

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
be50a5348de8 gitlab_runner 0.02% 34.25MiB / 7.496GiB 0.45% 275MB / 401MB 50.9MB / 1.86MB 10
61a2d9e864fb gitlab_server 11.45% 4.564GiB / 7.496GiB 60.88% 1.09GB / 354MB 1.27GB / 18.5GB 283

查看单个容器资源占用

docker stats cb7450420e9b

使用 docker run命令并添加日志选项的简单示例:

docker run --log-opt max-size=500m --log-opt max-file=3 -d nginx

这个例子是在运行一个NGINX容器的同时,配置日志的最大大小为500MB,同时保留最多3个日志文件。

  • --log-opt max-size=500m:设置每个日志文件的最大大小为500MB。
  • --log-opt max-file=3:设置最多保留3个日志文件。
#通过配置容器docker-compose的max-size选项来实现
logging:
driver: "json-file"
options:
max-size: "500m" # 日志文件大小
max-file: "6" # 日志的数量

强制停止一个正在运行的容器: docker kill

docker kill 命令不会等待容器执行优雅的停止操作,即不会等待进程执行清理操作,而是立即终止容器的进程,。这个命令通常用于强制终止无响应或者需要立即停止的容器。

语法:docker kill [OPTIONS] CONTAINER [CONTAINER...]

常用的选项包括:

  • -s--signal:指定要发送的信号。默认是 SIGKILL。

示例:

docker kill my_container

kill 掉容器内的特定进程

# 找到容器的 ID 或名称
docker ps

# 进入容器并查找需要 kill 的进程的 PID
docker exec -it my_container bash

# 查找需要 kill 的进程的 PID
ps aux | grep <进程关键词>

#最后,使用 docker exec 在容器内发送信号或者执行 kill 命令终止特定的进程
docker exec my_container kill -9 123
#或者通过SIGTERM信号关闭
docker exec my_container kill -s SIGTERM 123