本文最后更新于:2024年11月7日 下午

本文简要介绍Docker,记录Docker常用命令使用方法。

Docker 简介

**Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。**Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

Docker 使用流程

  • 安装docker
  • 创建Image
  • 从Image创建Container
  • 在Container中工作
  • 将在Container中做的修改提交给Image
  • 销毁Container

安装docker

  • 可以直接使用 apt 安装
1
2
3
apt update
apt install docker
apt install docker.io
  • 安装成功后如果需要方便地运行 docker 命令,需要把对应用户添加到 docker 组内
1
usermod -a -G docker user

之后重新登录即可使用 docker 命令

安装 Docker-Compose

1
curl -SL https://github.com/docker/compose/releases/download/v2.30.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

下载下来直接放到 bin 里就行。

镜像命令

拉取 image

1
docker image pull [docker-url]

获取docker images 列表

1
2
3
docker images

docker image ls

重命名镜像

如果在 commit 容器到镜像时,没有填写 TAG 则会生成仓库\tag 为 None的镜像

1
2
3
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> b55ab710941a 21 minutes ago 15.9GB
  • 重命名镜像语法
1
docker tag [镜像ID] [镜像名称]

例如 $ docker tag b55 vvd

此时镜像名称为

1
2
3
4
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vvd latest b55ab710941a 27 minutes ago 15.9GB
nvidia/cuda 11.0-base 2ec708416bb8 2 years ago 122MB
  • 修改镜像名称语法
1
docker tag [镜像ID] [新镜像名称]:[旧镜像名称]

如果我不想容器名称为 latest

运行 $ docker tag b55 vvd:cu113-torch111

则此时容器名称:

1
2
3
4
5
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vvd cu113-torch111 b55ab710941a 28 minutes ago 15.9GB
vvd latest b55ab710941a 28 minutes ago 15.9GB
nvidia/cuda 11.0-base 2ec708416bb8 2 years ago 122MB

删除镜像 / 删除 tag

1
docker rmi [image]

1
docker image rm [image]

支持的子命令如下:

  1. -f, -force: 强制删除镜像,即便有容器引用该镜像;

  2. -no-prune: 不要删除未带标签的父镜像;

在刚刚的例子中如果删掉 vvd: latest 镜像则仅仅删除了他的名称,实体镜像还在,因为还有一个引用指向他

1
2
3
4
5
6
$ docker rmi vvd:latest
Untagged: vvd:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vvd cu113-torch111 b55ab710941a 37 minutes ago 15.9GB
nvidia/cuda 11.0-base 2ec708416bb8 2 years ago 122MB

查看镜像\容器占用磁盘大小

1
docker system df -v

容器命令

建立容器(nvidia docker)

1
NV_GPU=[gpu_num] nvidia-docker run -it --name [container_name] --shm-size=[shm_size] --rm -v [current_dir]:[container_dir] -p [current_port]:[container_port] [image_name]:[image_tag]  [command]  
  • 可选参数含义
参数 含义
NV_GPU container中可见的GPU,如果不设置可见所有GPU,Nvidia docker 专用
-it 将容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器
--name 容器名称,如果不设置会随机分配一个名字
--shm-size 容器共享内存大小设置。如果不设置默认大小64M,对于需要使用共享内存的情况往往是不够用的,如果设置为10g,这样配置: --ssh-size="10g"
--rm 容器关闭后自动删除,如果不设置容器不会自动删除
-v 驱动器映射,将本机的目录映射到容器的指定文件夹中;需要说明的是,在主机文件夹中的挂载目录在容器中是可见的;需要再说明的是容器启动时主机挂载的目录容器是见不到的;最后说明,容器关闭再打开就可以看到主机挂载的所有文件夹了。
-p 暴漏容器的端口到本机的端口上,例如用于ssh连接容器时需要将容器的22端口暴露到主机的端口上(比如3721),则可以设置 -p 3721:22
[image_name, image_tag] 这是docker镜像的名称与标记,如果使用本机镜像可以在docker images列表中查询到
command 启动容器后内部执行的第一个命令,一般为 /bin/bash
-d 后台运行
--restart=<value> 容器是否自动启动
<value> 可选:
no - 容器退出时,不重启容器
on-failure - 只有在非0状态退出时才从新启动容器
always - 无论退出状态是如何,都重启容器,可以依此设置容器开启自动启动;
–privileged 容器是否具有root权限,值默认为false,此时容器内虽然是root用户,但事实上仅为宿主机的普通用户权限,无法使用 mount 等命令,如果需要在容器中挂载如 nfs、samba 等磁盘,需要在建立容器时将该值设置为 true, 该值无法使用 docker update 更新
–privileged=true

更新容器选项

  • 如果创建容器时选项没有添加完,可以通过update命令设置
1
docker update --restart=always container_name

查询容器

  • 查询container列表
1
docker container ls --all

–all: 加上该参数会显示没有在运行的容器,不加的话仅显示运行中的容器

也可以运行

1
2
3
docker ps --all
# or
docker ps -a

输出所有容器 id

1
docker ps -aq
  • 查询容器的端口映射
1
docker port container_name
  • 查询容器配置详细信息
1
docker inspect container_name

容器控制

  • 停止指定的容器运行
1
2
docker container kill [containerID]
docker stop [containerID]

docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。docker container stop命令相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。

  • 启动停止的容器
1
docker start [container_name/containerID]
  • 重启运行的容器
1
docker restart [container_name/containerID]
  • 停止容器
1
docker stop [container_name/containerID]

可以结合 docker ps -aq 停止所有容器

1
docker stop $(docker ps -aq)
  • 删除指定的容器文件(仅在停止运行时可用)
1
2
3
docker container rm [container_name/containerID]
# or
docker rm [container_name/containerID]

可以结合 docker ps -aq 删除所有容器

1
docker rm $(docker ps -aq)
  • 查看容器输出
1
docker container logs [container_name/containerID]
  • 启动容器的一个终端
1
docker exec -it [containerID] /bin/bash

此种方法启动的终端,即使退出也不会关闭容器

相反 - 如果直接通过端口映射连接 docker 建立的ssh链接,窗口退出后该终端的工作也会一同停止

  • 进入容器的主终端
1
docker attach [containerID]

连接到容器的主终端,该终端退出后容器关闭。

如果不希望退出后关闭,可以加入选项 --sig-proxy=false

  • 退出终端
1
ctrl p + ctrl q

可以在退出终端的同时保持终端继续工作

  • 退出容器
1
exit

在容器中运行此命令

  • 拷贝容器里的文件到本机
1
docker container cp [containerID]:[/path/to/file]
  • 提交容器修改到镜像
1
docker commit -a [name] -m [comments] -p  [containerID[:TAG]]

-a: 提交的镜像作者

-m: 提交时的说明文字

-p: 在 commit 时,将容器暂停

参考资料



文章链接:
https://www.zywvvd.com/notes/tools/docker/docker-usage/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

docker - 常用命令使用教程
https://www.zywvvd.com/notes/tools/docker/docker-usage/
作者
Yiwei Zhang
发布于
2020年5月6日
许可协议