Docker-常用命令

Jul 8, 2025

镜像命令

docker images 查看本地镜像

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

# 可选项
-a,--all   #列出所有镜像
-q,--quiet #只显示镜像的id

docker search 搜索镜像

# 可选项,通过搜索过滤
--filter=STARS=3000 #搜索出的镜像就是stars超过3000的

docker pull 下载镜像

# 下载镜像 docker pull 镜像名[:tag]
yuhao@Linux:~$ docker pull redis
Using default tag: latest           # 如果不写tag就是latest
latest: Pulling from library/redis
61320b01ae5e: Pull complete         # 分层下载 docker images的核心 联合文件系统
f8f9e5369fdd: Pull complete
b8f8315b617a: Pull complete
eb61abf5b105: Pull complete
03bc4ee78aa8: Pull complete
4f4fb700ef54: Pull complete
93cd3c5153ab: Pull complete
Digest: sha256:b3ad79880c88e302deb5e0fed6cee3e90c0031eb90cd936b01ef2f83ff5b3ff2 Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest     # 真实下载地址

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

# 指定下载如下
docker pull redis:7.4.3-bookworm
7.4.3-bookworm: Pulling from library/redis
61320b01ae5e: Already exists      # 分层下载 可以使用之前下载的缓存
f8f9e5369fdd: Already exists
5cf79f4aceb3: Pull complete
698c8d1b3fd1: Pull complete
601d7fdb78f5: Pull complete
98e4482f5fee: Pull complete
4f4fb700ef54: Pull complete
0eeb2b86c9b7: Pull complete
Digest: sha256:236e397c1d5ab7a94adaf1a51eec3ca8333b05fafcd6d423c6c7cc5987e519a0 Status: Downloaded newer image for redis:7.4.3-bookworm docker.io/library/redis:7.4.3-bookworm

docker rmi 删除镜像

Options:
    -f, --force Force removal of the image  # 强制删除
        --no-prune Do not delete untagged parents

docker rmi -f 镜像id                 # 删除指定的容器
docker rmi -f 镜像id 镜像id 镜像id    # 删除多个容器
docker rmi -f $(docker images -aq)  # 删除全部的容器
# 也可以不使用强制删除参数
# 例如
docker rmi 90b270fb6df3
docker rmi $(docker images -aq)

容器命令

前提 有镜像文件才可以创建一个容器 以下为 centos 镜像测试学习案例 docker pull centos

新建容器启动

docker run [可选参数] image

# 参数说明
--name="Name"       容器名字 tomcat0l.tomcat02,用来区分容器
-d                  后台方式运行
-it                 使用交互方式运行,进入容器查看内容

-P                  指定容器的端口 -p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口

-P                  随机指定端口

# 测试启动并进入容器
yuhao@Linux:~$ docker run -it centos /bin/bash
[root@2cdf22185264 /]# ls      # 目前已经处于容器内部
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

退出容器
[root@2cdf22185264 /]# exit
yuhao@Linux:/$ ls
bin cdrom etc lib lib64 lost+found mnt proc run snap swapfile tmp var boot dev home lib32 libx32 media opt root sbin srv sys usr

列出所有运行的容器

# docker ps 命令  ps指 processes
     # 列出当前正在运行的docker
-a   # 列出当前正在运行的docker + 历史运行的docker
-n=? # 显示最近创建的docker
-q   # 只显示容器的id

退出容器

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

删除容器

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

启动和停止容器

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

常用其他命令

后台启动

# 命令 docker run -d 镜像名
docker run -d centos
# 出现问题
# docker ps 发现 centos 停止了

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

查看日志

docker logs

Options:
    --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)

例子

docker run -d centos /bin/sh -c "while true;do echo test;sleep 1; done"

docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c3824b616d9 centos "/bin/sh -c 'while t…" 4 seconds ago Up 3 seconds compassionate_liskov

# 显示日志
-tf           # 显示日志
--tail $数量  # 要显示的日志条数

docker logs -tf --tail 10 2c3824b616d9

查看容器中进程信息

docker top 容器ID

UID  PID   PPID  C STIME TTY   TIME      CMD
root 36485 36463 0 21:12  ?   00:00:00   /bin/sh -c while true;do echo test;sleep 1; done
root 36802 36485 0 21:16  ?   00:00:00   /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像源数据

docker inspect 容器ID

- Id: 2c3824b616d9f9bde621c17dd49bdd83a7d04e9d4726ee918c9c635e6c81571c
  Created: '2025-05-29T13:12:27.983824577Z'
  Path: /bin/sh
  Args:
    - -c
    - while true;do echo test;sleep 1; done

  State:
    Status: running
    Running: true
    Paused: false
    Restarting: false
    OOMKilled: false
    Dead: false
    Pid: 36485
    ExitCode: 0
    Error: ''
    StartedAt: '2025-05-29T13:12:28.041393278Z'
    FinishedAt: '0001-01-01T00:00:00Z'

  Image: 'sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6'
  ResolvConfPath: /var/lib/docker/containers/2c3824b616d9f9bde621c17dd49bdd83a7d04e9d4726ee918c9c635e6c81571c/resolv.conf
  HostnamePath: /var/lib/docker/containers/2c3824b616d9f9bde621c17dd49bdd83a7d04e9d4726ee918c9c635e6c81571c/hostname
  HostsPath: /var/lib/docker/containers/2c3824b616d9f9bde621c17dd49bdd83a7d04e9d4726ee918c9c635e6c81571c/hosts
  LogPath: /var/lib/docker/containers/2c3824b616d9f9bde621c17dd49bdd83a7d04e9d4726ee918c9c635e6c81571c/2c3824b616d9f9bde621c17dd49bdd83a7d04e9d4726ee918c9c635e6c81571c-json.log
  Name: /compassionate_liskov
  RestartCount: 0
  Driver: overlay2
  Platform: linux
  MountLabel: ''
  ProcessLabel: ''
  AppArmorProfile: docker-default
  ExecIDs: null
  HostConfig:
    Binds: null
    ContainerIDFile: ''
    LogConfig:
      Type: json-file
      Config: {}

    NetworkMode: bridge
    PortBindings: {}
    RestartPolicy:
      Name: no
      MaximumRetryCount: 0

    AutoRemove: false
    VolumeDriver: ''
    VolumesFrom: null
    ConsoleSize:
      - 43
      - 141

    CapAdd: null
    CapDrop: null
    CgroupnsMode: private
    Dns: []
    DnsOptions: []
    DnsSearch: []
    ExtraHosts: null
    GroupAdd: null
    IpcMode: private
    Cgroup: ''
    Links: null
    OomScoreAdj: 0
    PidMode: ''
    Privileged: false
    PublishAllPorts: false
    ReadonlyRootfs: false
    SecurityOpt: null
    UTSMode: ''
    UsernsMode: ''
    ShmSize: 67108864
    Runtime: runc
    Isolation: ''
    CpuShares: 0
    Memory: 0
    NanoCpus: 0
    CgroupParent: ''
    BlkioWeight: 0
    BlkioWeightDevice: []
    BlkioDeviceReadBps: []
    BlkioDeviceWriteBps: []
    BlkioDeviceReadIOps: []
    BlkioDeviceWriteIOps: []
    CpuPeriod: 0
    CpuQuota: 0
    CpuRealtimePeriod: 0
    CpuRealtimeRuntime: 0
    CpusetCpus: ''
    CpusetMems: ''
    Devices: []
    DeviceCgroupRules: null
    DeviceRequests: null
    MemoryReservation: 0
    MemorySwap: 0
    MemorySwappiness: null
    OomKillDisable: null
    PidsLimit: null
    Ulimits: []
    CpuCount: 0
    CpuPercent: 0
    IOMaximumIOps: 0
    IOMaximumBandwidth: 0
    MaskedPaths:
      - /proc/asound
      - /proc/acpi
      - /proc/interrupts
      - /proc/kcore
      - /proc/keys
      - /proc/latency_stats
      - /proc/timer_list
      - /proc/timer_stats
      - /proc/sched_debug
      - /proc/scsi
      - /sys/firmware
      - /sys/devices/virtual/powercap

    ReadonlyPaths:
      - /proc/bus
      - /proc/fs
      - /proc/irq
      - /proc/sys
      - /proc/sysrq-trigger

  GraphDriver:
    Data:
      ID: 2c3824b616d9f9bde621c17dd49bdd83a7d04e9d4726ee918c9c635e6c81571c
      LowerDir: '/var/lib/docker/overlay2/f1d5003c90ccb9f121a03be02ca108f1e147835c5c8fa7a9756de43d94dca43f-init/diff:/var/lib/docker/overlay2/472a3902444bfceec351175dfad644f970924694122ba1e71d8515e07e61b120/diff'
      MergedDir: /var/lib/docker/overlay2/f1d5003c90ccb9f121a03be02ca108f1e147835c5c8fa7a9756de43d94dca43f/merged
      UpperDir: /var/lib/docker/overlay2/f1d5003c90ccb9f121a03be02ca108f1e147835c5c8fa7a9756de43d94dca43f/diff
      WorkDir: /var/lib/docker/overlay2/f1d5003c90ccb9f121a03be02ca108f1e147835c5c8fa7a9756de43d94dca43f/work

    Name: overlay2

  Mounts: []
  Config:
    Hostname: 2c3824b616d9
    Domainname: ''
    User: ''
    AttachStdin: false
    AttachStdout: false
    AttachStderr: false
    Tty: false
    OpenStdin: false
    StdinOnce: false
    Env:
      - 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

    Cmd:
      - /bin/sh
      - -c
      - while true;do echo test;sleep 1; done

    Image: centos
    Volumes: null
    WorkingDir: ''
    Entrypoint: null
    OnBuild: null
    Labels:
      org.label-schema.build-date: '20210915'
      org.label-schema.license: GPLv2
      org.label-schema.name: CentOS Base Image
      org.label-schema.schema-version: '1.0'
      org.label-schema.vendor: CentOS

  NetworkSettings:
    Bridge: ''
    SandboxID: 414ac89b025372e0e21fb50494e1f00110b9022cdf7826e2d0b72c92499edb7b
    SandboxKey: /var/run/docker/netns/414ac89b0253
    Ports: {}
    HairpinMode: false
    LinkLocalIPv6Address: ''
    LinkLocalIPv6PrefixLen: 0
    SecondaryIPAddresses: null
    SecondaryIPv6Addresses: null
    EndpointID: 1e527de4cd5432c9f2b625060f25cdb423e427b32c2cf662c05fc7f0b853efdb
    Gateway: 172.17.0.1
    GlobalIPv6Address: ''
    GlobalIPv6PrefixLen: 0
    IPAddress: 172.17.0.2
    IPPrefixLen: 16
    IPv6Gateway: ''
    MacAddress: 'ce:ea:20:d5:08:bd'
    Networks:
      bridge:
        IPAMConfig: null
        Links: null
        Aliases: null
        MacAddress: 'ce:ea:20:d5:08:bd'
        DriverOpts: null
        GwPriority: 0
        NetworkID: a398265601bc73eba3b4845a0d3884e5a0a6320bcae0747f72aeef317ca9c086
        EndpointID: 1e527de4cd5432c9f2b625060f25cdb423e427b32c2cf662c05fc7f0b853efdb
        Gateway: 172.17.0.1
        IPAddress: 172.17.0.2
        IPPrefixLen: 16
        IPv6Gateway: ''
        GlobalIPv6Address: ''
        GlobalIPv6PrefixLen: 0
        DNSNames: null

进入当前正在运行的容器

# 我们通常使用容器都是使用后台方式运行 需要进入容器 修改一些配置

# 命令
docker exec -it 容器ID /bin/bash

# 方法二
docker attach 容器ID
……输出在执行的代码

区别
docker exec   # 进入后重启启动一个终端 可以在里面正常操作
docker attach # 进入容器正在执行的终端 不会启动新的终端

容器内文件复制到主机

docker cp 容器ID

# 例如
docker cp 2c3824b616d9:/home/test.txt /home/yuhao/

将容器2c3824b616d9的/home/test.txt文件复制到主机的/home/yuhao/目录下

拷贝是一个手动过程 后期使用 -v 卷的技术实现持续化同步目录

总结

命令结构

测试实验

nginx

test-1

docker run -d -p 1987:80 --name nginx01 nginx

注意 --name 参数在镜像名称之前
不能写成如下情况
XXX docker run nginx -d --name nginx01 -p 1987:80

curl localhost:80  成功

tomcat

test-2

docker run -d -p 1988:8080 --name tomcat01 tomcat
因为镜像源提供的tomcat镜像极其的微小所以访问首页的时候是404,需要复制一些默认文件
docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps/

测试
curl localhost:8080  成功

elasticsearch与kibana

test-3

docker network create elastic-net
创建单独子网

docker run -d --name elasticsearch --network elastic-net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" docker.elastic.co/elasticsearch/elasticsearch:7.6.2

限制内存
`-Xms512m` 表示 JVM 启动时至少分配 512 兆字节的堆内存
`-Xmx512m` 表示 JVM 最多可以使用 512 兆字节的堆内存

docker run -d --name kibana --network elastic-net -p 5601:5601 -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" docker.elastic.co/kibana/kibana:7.6.2

查看地址用docker inspect {dockername}

可视化

portainer

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

--restart=always

  • 如果容器因为任何原因停止(例如,应用程序崩溃,或者手动停止),Docker 会尝试重启它

-v /var/run/docker.sock:/var/run/docker.sock

  • 通过将宿主机的 docker.sock 挂载到容器内部相同的路径,Portainer 容器内的应用程序就能够通过这个 socket 文件与宿主机的 Docker 守护进程进行通信,从而实现对宿主机上 Docker 引擎的 管理和控制(例如,创建、启动、停止、删除容器、镜像、网络等)

--privileged=true

  • 当一个容器以特权模式运行时,它几乎拥有了与宿主机相同的权限。它绕过了大多数内核安全机制,可以访问所有设备文件、修改内核参数、加载内核模块等。
  • 在 Portainer 的场景中,--privileged=true 提供了更深层次的权限,有时是为了确保 Portainer 能够执行一些需要更高权限的操作,例如在某些宿主机上管理存储卷或网络驱动

访问8088


>