Docker常用命令

1.镜像相关命令

1.(在官方仓库中)查询某镜像:docker search <镜像名>

Docker Hub 是 Docker 官方提供的中央仓库的门户网站,类似于,Maven 世界中的 www.mvnrepository.com 。

想知道在 Docker Hub 中包含了哪些镜像,除了可以访问 Docker Hub 的官网进行搜索外,还可以直接通过 Docker 命令 docker search 进行搜索。例如:

# 查询结果包含官方和非官方镜像信息
docker search mysql

# -f is-official=true 表示仅显示官方镜像信息
docker search -f is-official=true mysql

显示出来的搜索结果中包含了镜像的如下信息:

字段名 说明
NAME 镜像的名称
DESCRIPTION 镜像的简单描述
STARTS 镜像在的点赞数
OFFICIAL 镜像是否为 Docker 官方提供(建议使用官方提供的镜像)
AUTOMATED 镜像是否使用了自动构建

2. 列举已下载的所有镜像:docker images

通过 docker images 指令可以查看本地镜像列表中已有的镜像:

它所返回的镜像列表信息包含了一下 5 个字段:

字段名 说明
REPOSITORY 镜像的名称。会一并显示它的 Namespace
TAG 镜像的标签
IMAGE ID 镜像的 ID。一个长 64 位的十六进制字符串(SHA256 算法的运算结果)
CREATE 镜像的创建时间
SIZE 镜像所占用的硬盘空间(包括被共享的镜像层的大小)

当本地镜像较多时,还可以使用通配符过滤出符合条件的镜像。例如:

sudo docker images ph*

 3.拉取、下载镜像:docker pull <镜像三要素>

通过 docker pull 指令可以拉取仓库镜像到本地(默认都是拉取 Docker Hub 仓库镜像)。例如:

docker pull nginx
# 等价于
docker pull library/nginx:latest

Docker 会利用镜像的分层机制,将镜像分为多个包进行下载,我们可以在终端输出中看到每层的下载状态。

  • 按照镜像的命名规则(Namespace/Repository:Tag ),上例中的 nginx 就是一个镜像的 Repository 名。
  • 没有指明 Namespace,就表示 Docker 官方管理的镜像。
  • 没有指明 Tag,Docker 默认会使用 latest 标签,表示最新版本。
  • 通常情况下,还是倾向于提供更确定的镜像信息,以减少镜像版本带来的不确定性。

4.删除镜像:docker rmi <镜像名 or 镜像ID>

当本地存放过多不需要的镜像时,可以通过 docker rmi 指令将其删除。在删除镜像时,需要指定镜像名称或镜像 ID 。例如

docker rmi -f mysql:8.0
# 或
docker rmi -f c20987f18b13

默认情况下,如果至少还存在一个容器使用该镜像,那么该镜像无法删除

-f 选项表示停止容器,并强制删除该镜像。不过并不推荐强制删除。

如果一个镜像中含有某些与其它镜像共享的镜像层,这些被共享的镜像层仍会被保留下来,

只有未被其它镜像使用的层会被删除。

5.构建镜像:docker build

除了可以通过 docker pull 指令从仓库拉取镜像之外,还可以通过 docker build 指令构建 Docker 镜像。

有两种方式进行镜像构建:

  1. 进入 Dockerfile 文件所在目录后,可以使用 docker build 指令进行镜像构建。

    cd ~/workspace/dockerspace/
    docker build -t hellodocker .
    

    上述的 . 表示通过当前目录下的 Dockerfile 文件进行镜像构建。

  2. 在其他任意目录进行镜像构建

    docker build -t hellodocker ~/workspace/dockerspace/
    

    通过同一个 Dockerfile 构建出来的镜像 ID 会相同。

2. 容器相关命令

1.创建并启动容器:docker run ... --name <容器名> <镜像名>

Docker 镜像主要用于创建容器,可以使用 docker run 指令创建并启动容器。例如:

docker run -d -p 5000:80 --name test hello-world

选项说明:

选项 说明
-d 表示容器启动后在后台运行
-p 5000:80 表示将主机的 5000 端口和容器的 80 端口『对接』。
即,宿主机从 5000 端口收到的数据,由系统送到 docker 的 80 端口。
--name test 表示所创建的容器的名字为 test 。
hello-world 表示以 hello-world 镜像为基础创建容器。

需要注意的是:

  • docker run 命令包含了两个动作:创建容器 和 启动容器 。

  • 镜像和容器是一对多的关系:同一个镜像可以用来制作多个容器。

Docker 容器有以下 2 种运行态:

  1. 前台交互式

    • 容器运行在前台,容器运行时直接连接到容器中运行的程序上。

    • 这种场景下,我们通常会通过附加的参数打开容器的伪终端和输入流,从而实现与容器中程序的交互。

    • 当通过命令退出和关闭链接时,容器即停止运行。

    • sudo docker run -i -t ubuntu /bin/bash

      • -i 表示开启了 input(输入)功能
      • -t 表示开启了一个连接容器里边的 terminal(终端)
      • -it 常一起使用
  2. 后台守护式

  • 容器运行在后台,运行的过程中不会占用当前输入指定的终端,也不会连接到容器内的程序上。

  • 这种运行后台容器必须通过指令来关闭(docker stop)。

  • sudo docker run -d nginx

2. 列出已创建容器:docker ps

生成容器后,可以通过 docker ps 指令查看当前运行的所有容器:

# 仅显示 Up 状态的容器
docker ps

# 显示所有状态容器
docker ps -a

# 显示最后( last )创建的那个容器:
sudo docker ps -l

# 显示最近创建的 N 个容器:
sudo docker ps -n 2
字段名 说明
CONTAINER ID 容器的唯一性标识
IMAGE 容器所使用的镜像
COMMAND 容器启动时运行的命令(即,容器中的主程序)
CREATED 容器的创建时间
STATUS 容器的运行状态。Up 表示运行中,Exited 标识已停止
PORTS 容器内部包括的端口映射到的主机端口
NAMES 容器的名称

3.停止容器:docker stop <容器名 or 容器ID>

当不需要容器运行时,可以使用 docker stop 指令停止指定的容器。

使用 docker stop 指令停止容器时会略有延迟,成功后返回该容器的 ID 。

注意,容器被 stop 之后,它并未被删除。容器依然存在,你可以使用 docker ps -a 看到它,并且,未来你还可以使用 docker start <容器名 or 容器ID> 再次启动它。

不过,由于创建容器的代价极小,所以一般的惯例并非 stop - start 容器,而是在不用时直接将它删掉,未来需要使用时再创建。

另外,我们还可以通过 docker kill 指令立即杀死运行容器进程。

docker kill <容器名字 or 容器ID>

4.启动容器:docker start <容器名 or 容器ID>

容器停止( stop )后,如果需要重新访问该容器中的程序,需要通过 docker start 重新启动该容器。

需要注意的是:

  1. start 一个容器的前提是改容器已存在,且处于 Stop 状态。

  2. 如果一个容器曾经并未成功运行( 例如,docker run mysql 忘记了 -e ),那么,即便它存在,你也无法 start 它(因为,逻辑上它无法启动)。

  3. 由于创建容器的代价极小,所以一般的惯例并非 stop - start 容器,而是在不用时直接将它删掉,未来需要使用时再创建。

另外,除了 docker start 指令可以启动已停止的容器外,还可以使用 docker restart 指令重启容器。

docker restart <容器 or 容器ID> 

5.删除容器:docker rm -f <容器名 or 容器ID>

当不需要使用容器时,则可以使用 docker rm 指令删除已停止的容器。

默认情况下,docker rm 只能删除已停止的容器。如需要删除正在运行的容器,则需要添加 -f 参数强制删除。

因为 Docker 特有的镜像机制,在创建容器过程中并没有大量的 IO 操作,所以创建过程是秒级的。因此,我们更倾向于『随用随建,随停随删』。在停止程序所在容器时,将容器一并删除。

6.批量删除已停止的所有容器:docker rm -f $(docker ps -aq)

docker rm 指令可以传入多个容器的 ID 或名字进行批量删除,甚至可以套用 docker ps 命令全部删除。

在这里,我们借助 docker ps -aq 指令去求得所有容器的 ID 。以 docker ps -aq 命令的执行结果,作为 docker rm -f 命令的参数。

docker rm -f $(docker ps -aq)

7.进入容器:docker exec -it <容器名 or 容器ID> /bin/bash

我们可以通过 docker exec 命令进入容器:

docker exec -it <容器名 or 容器ID> /bin/bash

关注下命令提示符,你会发现你现在就在容器中。

执行 exit 命令可以退出容器。

3. 其他命令

1.目录挂载:docker run -v ...

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样容器中的某个目录和真机中的某个目录是同一个目录,容器和真机就可以以此为桥梁相互影响。

例如,我们可以创建一个运行 mysql 的容器,将容器中存放数据文件的目录映射到真机中的某个目录。这样,哪怕是该容器被删除了,曾经存储的数据仍然还在。

语法:

docker run ... -v 宿主机目录:容器目录

例如:

docker run                    \
  -d                          \
  -v /data/docker/mysql/data:/var/lib/mysql      \
  -p 3306:3306                \
  -e MYSQL_ROOT_PASSWORD=123  \
  --name mysql-example        \
  mysql:8.0

2.查看容器运行日志:docker logs -f <容器名 or 容器ID>

docker logs -f  <容器名称>

# 仅看最后的 100 行日志
docker logs -f --tail=100 <容器名称>

3.容器详情信息: docker inspect <容器名称 or 容器ID>

我们可以通过以下命令查看容器运行的各种数据:

docker inspect <容器名称 or 容器ID>

当然,从中查找容器的 IP 地址很不方便,因此,可以对此再细化一下:

docker inspect --format='{{.NetworkSettings.IPAddress}}' 

4.删除不用的资源:docker prune

prune 命令用来删除不再使用的 docker 对象。

删除所有未被 tag 标记和未被容器使用的镜像:

docker image prune

删除所有未被容器使用的镜像:

docker image prune -a

删除所有停止运行的容器:

docker container prune

删除所有未被挂载的卷:

docker volume prune

删除所有网络:

docker network prune

删除 docker 所有资源:

docker system prune

你可能感兴趣的:(docker,容器,运维)