Loading

docker container/容器相关命令

容器相关命令

创建容器

使用 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

    attach 有一个特点,当多个窗口使用 attach 进入同一个容器时,所有的窗口都会同步显示,当一个创建因为命令阻塞了,所有的窗口都会无法操作

  2. exec 命令

    $ docker exec [option] container
    

    比较重要的选项有

    • -d:在容器后台执行命令
    • --detack-keys="":指定容器切回后台的按键
    • -e,--env=[]:指定环境变了列表
    • -i:打开标准输入接收用户输入的命令,默认为 false
    • --privileged=true|false:是否给执行命令以最高权限,默认false
    • -t:分配伪终端
    • -t,--user:执行命令的用户名

    例如,进入刚刚创建的容器

    $ 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速度等等

posted @ 2021-10-24 16:07  zerolinck  阅读(465)  评论(0编辑  收藏  举报