Docker常用命令

官方文档地址:
https://docs.docker.com/reference/

https://docs.docker.com/engine/reference/commandline/docker/

 Docker 镜像源

一 docker常用命令

Docker容器的一些命令按功能分类大致如下

  • Docker环境信息 info、version
  • 镜像仓库命令 login、logout、pull、push、search
  • 镜像管理 build、images、import、load、rmi、save、tag、commit
  • 容器生命周期管理 create、exec、kill、pause、restart、rm、run、start、stop、unpause
  • 容器运维操作 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
  • 容器资源管理 volume、network
  • 系统信息日志 events、history、logs
    • 1.events打印容器的实时系统事件
    • 2.history 打印出指定镜像的历史版本信息
    • 3.logs打印容器中进程的运行日志

 

docker --help #查看docker命令
docker info #docker 详细信息,镜像和容器
docker version #查看docker版本
帮助文档地址:https://docs.docker.com/reference/

 

1. 启动 docker

systemctl start docker

2. 关闭 docker

systemctl stop docker

3. 重启 docker

systemctl restart docker

4. docker设置随服务启动而自启动

systemctl enable docker

5. 查看docker 运行状态

systemctl status docker

 

 6. 查看docker 版本信息

docker version
docker info

 

 7. docker 帮助命令

忘记了某些命令便可使用此进行查看与回顾

docker --help

比如 咱忘记了 拉取命令 不知道可以带哪些参数 咱可以这样使用

docker pull --help

二 docker 镜像命令

1. 本地镜像

docker images # 查看docker镜像;
# 具体列解释含义:
REPOSITORY  #镜像仓库源                
TAG         #镜像的标签                 
IMAGE ID    #镜像id            
CREATED     #创建时间             
SIZE        #大小

同一个仓库源可以有多个TAG,表示这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果不指定一个镜像的版本标签,例如只使用tomcat,docker将默认使用tomcat:latest镜像

docker images -a            #列出本地所有的镜像
docker images -q            #只显示镜像ID
docker images --digests     #显示镜像的摘要信息
docker images --no-trunc    #显示完整的镜像信息

 

2. 搜索镜像

从Docker Hub中搜索镜像

docker search [OPTIONS] 镜像名

选项
--automated:弃用,只列出自动构建类型的镜像
--filter , -f:基于给定条件过滤输出
--format:使用模板格式化显示输出
--limit:Max number of search results ,默认值25
--no-trunc:禁止截断输出
--stars , -s:弃用,只显示收藏数不小于几颗星的镜像,移到--filter中使用

 

格式化输出

  •   .Description   镜像描述

  •   .StarCount    star数量    

  •   .IsOfficial    “OK” 表示官方镜像

  •   .IsAutomated    “OK” 表示自动构建  

 

 

3 拉取镜像

不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本

docker pull 镜像名   #从Docker Hub上下载xxx镜像,默认是最新版本。等价于:docker pull xxx:latest
docker pull 镜像名:tag   # 选择指定版本下载

 如果需要确认是否有需要下载的版本,可以在https://hub.docker.com/上查找

 docker 文件分层与数据卷挂载  

4 运行镜像

docker run 镜像名
docker run 镜像名:Tag
docker pull 镜像名
docker run 镜像名

 

5 删除镜像

注意: 删除镜像的前提是, 当前删除镜像没有被任何容器使用才可以删除

#单个镜像删除,相当于:docker rmi java:latest
docker rmi java
#强制删除(删除正在运行的镜像,注:以后台方式运行的不能被强制删除)
docker rmi -f java
#多个镜像删除,不同镜像间以空格间隔
docker rmi -f java tomcat nginx
#删除本地全部镜像
docker rmi -f $(docker images -q)

 

6 强制删除镜像

docker image rm 镜像名称/镜像ID

7 保存镜像

将我们的镜像保存为tar压缩文件这样方便镜像转移和保存, 然后可以在任何一台安装了docker的服务器上加载这个镜像。

注意打包的时候要加上REPOSITORY:TAG,不然再load时,REPOSITORY:TAG会显示为None。

命令:

docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字  REPOSITORY:TAG

8 加载镜像

docker load -i 镜像保存文件位置

 

 

 10 生成镜像

生成镜像需要使用Dockerfile文件,然后使用下面的命令就可以根据Dockerfile生成镜像:

docker build -t 镜像名称:tag .

 

三 容器命令

docker 容器 就好比 咱java中的new出来对象(docker run 镜像 产生一个该镜像具体容器实例),docker 容器的启动需要 镜像的支持。

1 docker ps (查看容器)

# 查看正在运行的容器
docker ps
# 查看所有容 包括停止的容器
docker ps -a
# -q参数,只显示container id
docker ps -q
# 查看容器详细信息
docker inspect demo1

 

容器怎么来呢?可以通过run 镜像来构建自己的容器实例

3 docker run(启动容器)

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

如:

docker run -it -d --gpus all --name UnitCls --shm-size="10g" --restart="on-failure" 
  -v /home/knowledge/UnitCls:/workspace/UnitCls
  -p 8088:99
  pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel
  /bin/bash

 

备注:其实跟 docker create 一样的语法格式,只不过可以运行容器甚至进入容器内部
COMMAND :需要在容器内执行的命令。

主要的options 说明:

Docker 实战操作之运行命令docker run详解(三) - 知乎 (zhihu.com)

参数 说明 示例
-i  以交互模式运行容器,通常与-t同时使用;  
-t 启动容器后,为容器分配一个命令行,通常与-i同时使用;  
-v 目录映射,容器目录挂载到宿主机目录,格式:<host目录>:<容器目录>;  
-d 守护进程, 后台运行该容器;  
-p 指定端口映射, 格式: 主机(宿主) 端口: 容器端口;  
-P 随机端口映射, 容器内部端口随机映射到主机的端口;  
-u 以什么用户身份创建容器;  
-name 容器名称;  
-m,--memory bytes 设置容器使用内存最大值;  
-h,--hostname string 指定容器的host name;  
--dns 指定容器dns服务器;  
-e username="xxx": 设置环境变量;  
--restart

Docker重启后, 容器是否自动重启;

no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。

 
--privileged 容器内是否使用真正的root权限;  

-a, --attach=[]

 如果在执行 run 命令时没有指定 -a,那么 docker 默认会挂载所有标准数据流,

包括输入输出和错误。你可以特别指定挂载哪个标准流。

-a stdin -a stdout
 --add-host=[]  添加 host-ip 到容器的 /etc/hosts 文件  --add-host db:10.0.0.17
--cidfile=
 将 container ID 保存到 cid_file, 保存的格式为长 UUID
--cidfile=cid_file 
 
 --cpu-shares

 默认情况下,使用 -c 或者 --cpu-shares 参数值为0,可以赋予当前活动

container 1024个 cpu 共享周期。这个0值可以针对活动的 container 进行

修改来调整不同的 cpu 循环周期。 比如,我们使用 -c 或者 --cpu-shares=0

启动了 C0,C1,C2 三个c ontainer,使用 -c/–cpu-shares=512 启动了C3.

这时,C0,C1,C2 可以 100%的使用 CPU 资源(1024),但 C3 只能使用

50%的 CPU 资源(512)。如果这个 host 的 OS 是时序调度类型的,每个 CPU

时间片是 100 微秒,那么C0,C1,C2将完全使用掉这 100 微秒,而 C3 只能使用 50 微秒

 

--cpu-period

--cpu-quota

 cpu-period 和 cpu-quota 的单位为微秒(μs)。

cpu-period的最小值为1000微秒,最大值为1秒(10^6 μs),

默认值为 0.1 秒(100000 μs)。cpu-quota 的值默认为 -1,

表示不做控制。

 

 --cpuset-cpus,

--cpuset-mems

 对多核 CPU 的服务器,docker 还可以控制容器运行限定使用哪些 cpu

内核和内存节点,即使用 –cpuset-cpus 和 –cpuset-mems参数。

--cpuset-cpus 0-2
 --disable-content-trust  跳过镜像验证  
 --env-file  读取设置环境变量的文件  
--expose=[]  告诉 Docker 服务端容器暴露的端口号,供互联系统使用  --expose=22
 --group-add=[]     
 -w, --workdir    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4 容器端口映射

注意:查看容器时,容器占用的端口号仅仅是在容器中内部本身的端口,与宿主机的端口并无联系,我们通过宿主机Ip:6379访问此,那自然是找不到的哟!

补充:

每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器))

 

 

 这是Docker 一大特点,每个容器之间环境都是隔离的!!!

 

 

默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…

如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个正式的概念叫做 容器端口映射

有了端口映射,我们就可以将宿主机端口与 容器端口绑定起来,比如 我们建立宿主机的6379端口与容器redis6379端口绑定起来,那么再访问宿主机Ip:6379 就可以访问到对应容器了!

停止容器

# 先停止咱之前运行的 redis 容器 
docker stop 容器名/容器ID

 

4.1 端口映射

-p 宿主机端口:容器端口

如:

docker run -itd --name redis002 -p 8888:6379 redis:5.0.5 /bin/bash

-p 8888:6379 解析 将容器内部的 6379端口与docker 宿主机(docker装在哪太服务器 那台服务器 就是其主机)8888 端口进行映射 那通过外部访问宿主机8888端口 即可访问到 docker 容器 6379 端口了。

4.2 端口占用

虽说每个容器之间,环境都是隔离的,但是宿主机每个端口都是一个,8888端口被redis002容器绑定了,那么其他所有的容器都不可以使用8888这个端口了!!!

 

5 进入容器

进入容器的方式一般有三种:

  1. 使用ssh登陆进容器
  2. 使用nsenter、nsinit等第三方工具
  3. 使用docker本身提供的工具

方法1需要在容器中启动sshd,存在开销和攻击面增大的问题。同时也违反了Docker所倡导的一个容器一个进程的原则。
方法2需要额外学习使用第三方工具。
所以大多数情况最好还是使用Docker原生方法,Docker目前主要提供了docker exec 和 docker attach两个命令。

这里主要介绍通过原生命令进入。

exec方式(推荐):

前提需要容器处于运行状态,且PID 1也处于运行中。命令运行后进入容器的工作目录。进入容器后,开启一个新的终端在里面操作。

docker exec -it 容器名/容器ID /bin/bash

attach方式:

进入容器后,在原有的终端中继续操作。注意:退出时可能存在关闭终端的风险。

docker attach 容器名/容器ID

6 退出容器

退出当前容器的方式包括:

6.1 直接退出

#-----直接退出  未添加 -d(持久化运行容器) 时 执行此参数 容器会被关闭  
exit

6.1 优雅退出

# 优雅提出 --- 无论是否添加-d 参数 执行此命令容器都不会被关闭
Ctrl + p + q

 

7 停止容器

docker stop 容器ID/容器名

8 重启容器

docker restart 容器ID/容器名

9 启动容器

docker start 容器ID/容器名

10 kill容器

杀掉一个正在运行的容器, -s 向容器发送一个信号。

docker kill -s KILL 容器ID/容器名

11 容器文件拷贝

注意:无论容器是否开启,都可进行文件拷贝。

#docker cp 容器ID/名称:文件路径  要拷贝到外部的路径   |     要拷贝到外部的路径  容器ID/名称:文件路径
#从容器内 拷出
docker cp 容器ID/名称: 容器内路径  容器外路径
#从外部 拷贝文件到容器内
docker  cp 容器外路径 容器ID/名称: 容器内路径

查看拷贝是否完成

docker exec 容器名 ls -a 查看的容器绝对路径

 

12 查看容器日志

# 查看redis容器日志,默认参数
docker logs tomcat
# 查看redis容器日志,参数:-f  跟踪日志输出;-t   显示时间戳;--tail  仅列出最新N条容器日志, 默认all;
docker logs -f -t --tail=20 redis
# 查看容器redis从2021年08月10日后的最新10条日志。
docker logs --since="2021-08-10" --tail=10 redis

 

 

13 容器开机启动

启动容器时,使用docker run命令时 添加参数--restart=always 便表示,该容器随docker服务启动而自动启动

docker run -itd --name redis002 -p 8888:6379 --restart=always  redis:5.0.5 /bin/bash

如果容器启动时未设置开机启动,要修改为开机启动,则:

docker  update --restart=always 容器Id 或者 容器名
或
docker container update --restart=always 容器Id 或者 容器名

 

14 数据挂载

简单来讲,就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化;如果此时,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!

-v 宿主机文件存储位置:容器内文件位置

-v命令可以多次使用,即一个容器可以同时挂载多个文件

-v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置 -v 宿主机文件存储位置:容器内文件位置

如:

# 运行一个docker redis 容器 进行 端口映射 两个数据卷挂载 设置开机自启动
docker run -d -p 6379:6379 --name redis505 --restart=always  -v /var/lib/redis/data/:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf  redis:5.0.5 --requirepass "password"

 

15 更换容器名

docker rename 容器ID/容器名 新容器名

 

16 容器进程

#top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
#列出容器中运行进程
docker top 容器名/ID
#查看所有运行容器的进程信息
for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

 

17 删除容器

#删除指定容器
docker rm -f 容器名/容器ID
#删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f 容器名/容器ID 容器名/容器ID 容器名/容器ID
#删除全部容器
docker rm -f $(docker ps -aq)

 删除未启动成功的容器:

docker rm $(docker ps -a|grep Created|awk '{print $1}')
或者
docker rm $(docker ps -qf status=created)

删除退出状态的容器:

docker rm $(docker ps -a|grep Exited|awk '{print $1}')
或者
docker rm $(docker ps -qf status=exited)

删除所有未运行的容器:

docker rm $(docker ps -a -q) #正在运行的删除不了,所有未运行的都被删除了
或者
docker container prune #Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器

四 客制化镜像

运行容器可能在镜像的基础上做了一些修改,如何保存起来,封装成一个新的镜像?

这时可以commit命令构建一个新的镜像:

 

docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag

 

五 Docker运维命令

1 空间不足

docker报错:

docker: write /var/lib/docker/tmp/GetImageBlob325372670: no space left on device

这个错误是docker在写入的时候报错无机器无空间

2 查看docker工作目录

sudo docker info | grep "Docker Root Dir"

3 查看docker磁盘占用总体情况

du -hs /var/lib/docker/ 

4 查看Docker的磁盘使用具体情况

docker system df

5 删除 无用的容器和 镜像

#  删除异常停止的容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'` 
 
#  删除名称或标签为none的镜像
docker rmi -f  `docker images -a | grep '<none>' | awk '{print $3}'`

6 清除所有无容器使用的镜像(慎用)

注意,此命令只要是镜像无容器使用(容器正常运行)都会被删除,包括容器临时停止

docker system prune -a

7 查找大文件

find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr

8 查找指定docker使用目录下大于指定大小文件

find / -type f -size +100M -print0 | xargs -0 du -h | sort -nr |grep '/var/lib/docker/overlay2/*'

ex:我这里是查找 /var/lib/docker/overlay2/* 开头的且大于100m的文件

 

posted @ 2022-06-09 11:47  IllidanStormrage  阅读(845)  评论(0编辑  收藏  举报