容器相关命令

创建容器

使用 ​​docker create [option]​​ 命令创建一个容器,例如

$ docker create -it ubuntu:18.04

d25d8252253ad10f5c26dbc0b0bdf74b5135eb2eea539d196656d81a9061c0d2

# docker ps -a 查看容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d25d8252253a ubuntu:18.04 "bash" 24 seconds ago Created compassionate_black


新建的容器,status = Create,处于停止状态,可以使用 ​​docker start​​ 命令启动它。

create 命令常用的可选的参数有

  • -a:是否绑定到标准输入、输出和错误
  • -d:是否在后台运行容器,默认为否
  • -i:保持标准输入打开,默认为false
  • -P:是容器内部端口随机映射到主机的某端口
  • -p:指定映射到本地端口,例如,-p 11234-11240:1234-1240
  • -t:是否分配一个伪终端,默认为false
  • -v:挂载主机上的文件卷到容器内
  • --name:为容器指定名称

启动容器

使用 ​​docker start container-id/container-name​​ 命令启动一个刚刚创建的容器 ,例如

$ docker start d25d8252253a

d25d8252253a

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d25d8252253a ubuntu:18.04 "bash" 13 minutes ago Up 54 seconds compassionate_black


启动容器后,可以使用 ​​docker ps​​ 命令查看到容器 d25d8252253a 状态已经变成了启动

新建并启动容器

命令 ​​docker run​​ 命令等同于先执行 ​​docker create​​ 再执行 ​​docker start​​。例如,使用下面的命令输出 Hello World!,之后容器会自动停止。

$ docker run ubuntu /bin/echo 'Hello World!'
Hello World!

$ docker ps -a
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5f5b35152ed ubuntu:18.04 "/bin/echo 'Hello Wo…" 10 seconds ago Exited (0) 9 seconds ago stoic_elion
d25d8252253a ubuntu:18.04 "bash" 18 minutes ago Up 5 minutes compassionate_black


可以看到刚刚执行 echo 命令的容器,状态已经变成了 Exited

使用 ​​docker run​​ 命令,是按照以下的执行流程

  1. 如果镜像不存在,会先从共有仓库下载镜像
  2. 分配一个文件系统给容器,并在只读镜像层外挂载一层可读写层
  3. 从宿主主机的配置的网桥接口中桥接一个虚拟接口到容器中
  4. 从网桥的地址池中分配一个ip给容器
  5. 执行用户指定的应用程序
  6. 执行完毕容器自动停止

下面的命令,启动一个 bash 终端,允许用户进行交互

$ docker run -it ubuntu:18.04 /bin/bash
root@6b4389195232:/#

# -t:分配一个伪终端
# -i:保持标准输入打开
# 可以输入 Ctrl+d 或输入 exit 命令来退出程序


查看容器输出

使用 ​​docker logs​​ 命令获取容器输出,例如

$ docker logs e5f5b35152ed
Hello World!

$ docker logs 6b4389195232
root@6b4389195232:/# man docker-run
bash: man: command not found
root@6b4389195232:/# exit
exit
root@6b4389195232:/# pwd
/
root@6b4389195232:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@6b4389195232:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
13 pts/0 00:00:00 ps
root@6b4389195232:/# exit


支持以下选项

  • --details:打印详细信息
  • -f:保持持续输出
  • --since string:输出某个时间开始的日志,例如 --since 2021-01-01
  • --tail string:输出最近的若干日志,例如 --tail 2
  • -t:显示时间戳信息
  • --until string:输出某个时间之前的日志

停止容器

暂停容器

例如,启动一个容器,将其暂停

$ docker run --name test --rm -it ubuntu bash 
root@6d65107c8001:/#

# 打开一个新终端
$ docker pause test
test

# docker ps 查看
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d65107c8001 ubuntu:18.04 "bash" 28 seconds ago Up 27 seconds (Paused) test


可以看到容器是启动并且暂停状态,且第一个终端无法处于无法输入的状态

# 使用该命令恢复暂停的容器
$ docker unpause test


恢复后,终端1恢复到可以输入的正常状态

终止容器

可以使用 ​​docker stop[-t|--time[=10]​​ 来终止一个运行的容器,该命令会首先向容器发送 SIGTERM 信号,等待一段时间后(默认为10秒),再发送 SIGKILL 信号来终止容器,例如

$ docker stop test
test


此外,可以使用 ​​docker kill​​ 直接发送 SIGKILL 信号来强行终止容器,​​docker restart​​ 会先终止容器,再启动容器

进入容器

在启动容器时,使用 -d 选项,会使容器在后台运行,用户无法看到容器内的输入也无法进行操作,这是有两个命令可以进入容器,分别是 attach 和 exec 名命令

  1. attach 命令$ docker attach [option] container 这个命名主要支持三个选项,非别是:
  • --detach-keys=[]:指定退出 attach 模式的快捷键序列,默认是 ctrl + q 和 ctrl + p
  • --no-stdin=true|false:是否关闭标准输入,默认是false
  • --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true
  1. attach 有一个特点,当多个窗口使用 attach 进入同一个容器时,所有的窗口都会同步显示,当一个创建因为命令阻塞了,所有的窗口都会无法操作
  2. exec 命令$ docker exec [option] container 比较重要的选项有
  • -d:在容器后台执行命令
  • --detack-keys="":指定容器切回后台的按键
  • -e,--env=[]:指定环境变了列表
  • -i:打开标准输入接收用户输入的命令,默认为 false
  • --privileged=true|false:是否给执行命令以最高权限,默认false
  • -t:分配伪终端
  • -t,--user:执行命令的用户名
  1. 例如,进入刚刚创建的容器
    $ docker run --name test -itd ubuntu:18.04 1647d13558f7d8b7a03f7abbc27414e6f7befa5a6c64a3257210f6755fdcadc6 $ docker exec -it test bash root@1647d13558f7:/#

删除容器

使用 ​​docker [container] rm [option]​​ 命令来删除容器

支持的选项有

  • -f:强制删除运行中的容器,会先发送 SIGKILL 信号给容器,再进行删除
  • -l:删除容器的连接,但保留容器
  • -v:删除容器挂载的数据卷

例如

$ docker create --name ubuntu-1 -it ubuntu:18.04
daf29b04546cbc2ce21b397c8ebbdec92458a6b40361fe1e3c6cc457a76cb5f8

$ docker rm ubuntu-1
ubuntu-1


导入和导出容器

导出容器

导出容器,是把一个已经创建的容器导出到一个文件中,命令为

$ docker export -o outputfile container


例如

$ create --name ubuntu-1 -it ubuntu:18.04
6294e0db7bf07f0a7e08f098bb44109e5635ec7e959b8340eb822f6236b2a66f

$ export -o ubuntu-1.tar ubuntu-1
$ ls -lh
-rw------- 1 linchangkun staff 56M 10 21 00:36 ubuntu-1.tar


导入容器

将导出的容器,可以复制到其他的机器上,导入后会变为镜像,命令为

$ docker import file REPOSITORY[:TAG]


例如

$ docker import ubuntu-1.tar test/u:0.1
sha256:9036cbb933c7dfa3e8e96ec1c5d54b55a9374930089a15198471903e506a6208

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/u 0.1 9036cbb933c7 3 minutes ago 56.6MB


导出容器再导入成为镜像,会丢失元信息和历史

查看容器

  1. 查看容器详情
    使用 docker inspect container 查看容器详情,会以 json 格式返回容器id、创建时间、路径、状态等信息
    $ docker inspect ubuntu-1 [ { "Id": "6294e0db7bf07f0a7e08f098bb44109e5635ec7e959b8340eb822f6236b2a66f", "Created": "2021-10-20T16:35:38.685585044Z", "Path": "bash", "Args": [], "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, ......
  2. 查看容器内进程
    使用 docker top container 查看容器内进程
    $ docker top ubuntu-1 UID PID PPID C STIME TTY TIME CMD root 3612 3587 0 07:46 ? 00:00:00 bash root 3650 3612 0 07:46 ? 00:00:00 top
  3. 查看统计信息
    使用 docker stats container 可以查看统计信息,会显示cpu、内存、存储、网络等使用情况的统计信息
    $ docker stats ubuntu-1 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 6294e0db7bf0 ubuntu-1 0.00% 1.27MiB / 1.942GiB 0.06% 1.16kB / 0B 0B / 0B 2

其他容器命令

复制文件

使用 ​​docker cp​​ 可以在容器和物理机之间复制文件

$ ll
total 354488
-rw-r--r-- 1 linchangkun staff 0B 10 24 15:54 2.txt

# 复制本地文件到容器
$ docker cp ./2.txt ubuntu-1:/

# 进入容器查看
$ docker start -i ubuntu-1
root@6294e0db7bf0:/# ls
2 bin dev hello lib mnt proc run srv tmp var
2.txt boot etc home media opt root sbin sys usr

# 复制容器内文件到本地
$ docker cp ubuntu-1:/3.txt .
$ ls -l
total 354488
-rw-r--r-- 1 linchangkun staff 0 10 24 15:54 2.txt
-rw-r--r-- 1 linchangkun staff 0 10 24 15:57 3.txt


支持的选项有

  • -L:跟随软连接。默认当原路径是软连接时,默认只复制链接信息,该选项会复制包含链接内容

查看容器变更

使用 ​​docker diff container​​ 查看容器内文件变更

$ docker diff ubuntu-1
A /3.txt
A /hello
A /2.txt
A /2
C /root
A /root/.bash_history


查看端口映射

使用 ​​docker port container​​ 命名可以查看容器端口映射

$ docker run --name ubuntu-2 -it -p 80:80 ubuntu:18.04

$ docker port ubuntu-2
80/tcp -> 0.0.0.0:80


更新容器配置

使用 ​​docker update container​​ 命令可以更新容器资源限制配置,比如,cpu核心数、允许使用内存大小、io速度等等