Docker操作命令小结

1 Docker镜像

Docker 镜像的一系列重要命令操作,包括获取、查看、搜索、删除、创建、存出和载入、上传等。

安装Docker

apt install docker.io    

获取镜像 ubuntu:16.04

#docker pull ubuntu:16.04

Docker帮助

#docker --help

查看Docker信息 包括:容器、镜像、配置的详细信息

docker info

下载镜像到本地后即可随时使用该镜像

使用该镜像创建一个容器 在其中运行bash 应用 执行"Hello World"命令,并退出容器

docker run -it ubuntu:16.04 bash
echo "Hello World"
exit 

镜像信息

#docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               5e13f8dd4c1a        6 weeks ago         120MB

获取该镜像的详细信息 包括制作者 适应架构 各层的数字摘要

docker inspect ubuntu:16.04

查看镜像历史信息

docker history ubuntu:16.04

删除和清理镜像

docker rmi myubuntu:lastest  #删除myubuntu:lastest镜像
docker rmi busybox:latest  #删除只有一个标签的镜像
docker ps -a #查看本机上存在的所有容器
docker rmi -f ubuntu:16.04 #-f参数 强行删除镜像
docker rm a21c0840213e #删除容器a21c0840213e
docker rmi 8f1bd21bd25c #用ID删除镜像
docker image prune -f #自动清理临时的遗留镜像文件层

创建镜像——三种方法:基于已有镜像的容器创建 基于本地模板导入 基于Dockerfile创建
(1 )基于已有容器创建:主要是使用docker [container] commt命令
命令格式为docker [container] commit[OPTIONS] CONTAINER [REPOSITORY [:TAG]], 主要选项包括:

D -a, --au吐or="": 作者信息;
D -c, - -change=(] : 提交的时候执行Dockerfile指令, 包括CMDIENTRYPOINT 但
NVIEXPOSEILABELIONBUILDIUSERIVOLUMEIWORKDIR等;
D -m, - -message= 11 11: 提交消息;
D -p, --pause式rue: 提交时暂停容器运行。

演示如何使用该命令创建一个新镜像。启动一个镜像, 并在其中进行修改操作

root@slave1:/home/xxx/Documents# docker run -it ubuntu:16.04 /bin/bash
root@d65bd23fee24:/# touch test   #创建test文件
root@d65bd23fee24:/# exit         #退出  容器ID:d65bd23fee24

docker run -it ubuntu:18.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit

记住容器的ID 为a925cb40b3f0。

此时该容器与原ubuntu:18.04 镜像相比, 已经发生了改变, 可以使用docker [container] commt命令来提交为一个新的镜像。提交时可以使用ID 或名称来指定容器:

docker [container] commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0
test:0.1
9e9c814023bcffc3e67e892a235afe6lb02f66a947d2747f724bd317dda02f27

顺利的话, 会返回新创建镜像的ID 信息, 例如9e9c814023bcffc3e67e892a235afe6lb02f66a947d2747f724bd317dda02f27

此时查看本地镜像列表, 会发现新创建的镜像已经存在了:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test 0.1 9e9c814023bc 4 seconds ago 188 MB

(2) 基于本地模板导入

下载了ubuntu-18.04 的模板压缩包,之后使用以下命令导人即可:

$cat ubuntu-18.04-x86_64-minimal.tar.gz I docker import - ubuntu:lB.04

然后查看新导人的镜像,已经在本地存在了:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 18.04 05ac7c0b9383 17 seconds ago 215.5 MB

(3) 基于Dockerfile 创建
Dockerfi le 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。下面给出Dockerfile 的一个简单示例,基于debian:stretch-slim镜像安装Python 3环境,构成一个新的python:3镜像:

FROM debian:stretch-slim
LABEL version ;” 1 . 。” maintainer =” docker user <docker_user@github >”
.............................

创建镜像的过程可以使用docker [image] build命令,编译成功后本地将多出一个python : 3镜像:

$ docker [image] build -t python:3
Successful ly built 4b10f46eacc8
Successfully tagged python:3
$ docker imageslgrep python
python 3 4b10f46eacc8 About a minute ago 95.lMB

存出和载人镜像
1) 存出镜像

docker save -o ubuntu_16.04.tar ubuntu:16.04  #导出本地的ubuntu:16.04镜像为文件ubuntu:16.04.tar 用户可以通过复制ubuntu:16.04.tar文件将该镜像分享给他人

2)载人镜像

root@slave1:/home/zyy/Documents# docker load -i ubuntu_16.04.tar       #从文件ubuntu_16.04.tar导入镜像到本地镜像列表
Loaded image: ubuntu:16.04 

这将导人镜像及其相关的元数据信息(包括标签等) 。导人成功后,可以使用docker images命令进行查看, 与原镜像一致。

上传镜像
用户在Docker Hub 网站注册后可以上传自制的镜像。
例如,用户user 上传本地的test :latest 镜像,可以先添加新的标签user/test:latest , 然后用docker [image ] push 命令上传镜像:

$ docker tag test:latest user/test : latest
$ docker push user/test:latest

第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地~ / . docker目录下。

2 Docker容器

新建容器

docker create -it ubuntu:latest  #docker [container] create命令创建容器

root@slave1:/home/xxx/Documents# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                         PORTS               NAMES
78c72848cb2a        ubuntu:latest       "/bin/bash"         About a minute ago   Created                                            xenodochial_mcclintock
c73a4dc5a0fa        ubuntu:16.04        "/bin/bash"         About an hour ago    Exited (0) About an hour ago                       kind_davinci
d65bd23fee24        ubuntu:16.04        "/bin/bash"         About an hour ago    Exited (0) About an hour ago                       loving_liskov
c08c1cd0d93e        ubuntu:16.04        "bash"              2 hours ago          Exited (0) 2 hours ago                             trusting_mendeleev

使用docker [container] create命令新建的容器处于停止状态,可以使用docker [container] start命令来启动它。

root@slave1:/home/xxx/Documents# docker ps  #查看运行中的容器 此时没有容器在运行
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
root@slave1:/home/zyy/Documents# docker start 78c72848cb2a  #启动容器78c72848cb2a
78c72848cb2a
root@slave1:/home/zyy/Documents# docker ps  #查看运行中的容器 此时78c72848cb2a 在运行
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
78c72848cb2a        ubuntu:latest       "/bin/bash"         9 minutes ago       Up 6 seconds                            xenodochial_mcclintock

新建并启动容器
除了创建容器后通过start命令来启动也可以直接新建并启动容器。所需要的命令主要为docker [container]run,等价于先执行docker [container] create 命令,再执行docker [container] start命令

root@slave1:/home/xxx/Documents# docker run ubuntu /bin/echo 'Hello world'
Hello world

这跟在本地直接执行/bin/echo 'hello world'相比几乎感觉不出任何区别。

在交互模式下,用户可以通过所创建的终端来输人命令:

root@slave1:/home/xxx/Documents# docker run -it ubuntu:16.04 /bin/bash
root@2f90a7b71f47:/# pwd
/
root@2f90a7b71f47:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@2f90a7b71f47:/# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    11 pts/0    00:00:00 ps
root@2f90a7b71f47:/# exit
exit

在容器内用ps 命令查看进程,可以看到,只运行了bash 应用,并没有运行其他无关的进程。用户可以按Ctrl+d或输入exit命令来退出容器。

守护态运行
更多的时候,需要让Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d 参数来实现

root@slave1:/home/xxx/Documents# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
b35394dcea6f13826f5c5f54a83920b47f36ae0b80656fa8ac2d369c04823fe7
root@slave1:/home/xxx/Documents# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   7 seconds ago       Up 6 seconds                            lucid_beaver

查看容器输出
要获得容器的输出信息,可以通过docker [container] logs命令。

停止容器
1) 暂停容器
可以使用docker [container] pause CONTAINER [CONTAINER ... ]命令来暂停一个运行中的容器。

root@slave1:/home/xxx/Documents# docker pause 78c72848cb2a    #暂停容器78c72848cb2a
78c72848cb2a
root@slave1:/home/xxx/Documents# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS               NAMES
b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   6 minutes ago       Up 6 minutes                                 lucid_beaver
78c72848cb2a        ubuntu:latest       "/bin/bash"              38 minutes ago      Up 28 minutes (Paused)                       xenodochial_mcclintock

2)终止容器
可以使用docker [container] stop 来终止一个运行中的容器。该命令的格式为docker [container] stop [-t I - -time [=10]] [CONTA工NER ... ]
该命令会首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10 秒),再发送SIGK工LL 信号来终止容器:

root@slave1:/home/xxx/Documents# docker stop 78c72848cb2a
78c72848cb2a
root@slave1:/home/xxx/Documents# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   8 minutes ago       Up 8 minutes                            lucid_beaver

此时执行docker container prune 命令,会自动清除掉所有处于停止状态的容器。此外,还可以通过docker [container ] kill直接发送SIGKILL 信号来强行终止容器。

root@slave1:/home/xxx/Documents# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
b35394dcea6f13826f5c5f54a83920b47f36ae0b80656fa8ac2d369c04823fe7
2f90a7b71f470d5782c62fc93cdb8c1552fa6e5e4e77d014ea9a4397364ae0ac
c4956c2d6d28164e34454637d477f274fbac4be3d1b5eca70722b3ff68c5e23e
78c72848cb2a8fe6258ceb37c6b6e9c2f8fbb025e70e4ac9358c979995ba5667
c73a4dc5a0fa8939e6bec8eae6d4a7347dc675228592db7a11a546b314476ead
d65bd23fee241d9ef63945e10aaf4763fccea1af29415c94b16565adc7a35795
c08c1cd0d93eff53af2575b18c41ea3a5f20aa60b092406aca77b009c263e392

Total reclaimed space: 71B

Docker容器中指定的应用终结时,容器也会自动终止。例如,对于上一章节中只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。
可以用docker ps -qa命令看到所有容器的ID 。

root@slave1:/home/xxx/Documents# docker ps -qa 
b35394dcea6f
2f90a7b71f47
c4956c2d6d28
78c72848cb2a
c73a4dc5a0fa
d65bd23fee24
c08c1cd0d93e

查看容器 发现此时没有不存在容器:

root@slave1:/home/xxx/Documents# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
root@slave1:/home/zyy/Documents# docker ps -qa

处于终止状态的容器,可以通过docker [container] start命令来重新启动:

root@slave1:/home/xxx/Documents# docker start b35394dcea6f
b35394dcea6f
root@slave1:/home/xxx/Documents# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   13 minutes ago      Up 13 minutes                           lucid_beaver

docker [container] restart命令会将一个运行态的容器先终止,然后再重新启动:

root@slave1:/home/xxx/Documents# docker start b35394dcea6f
b35394dcea6f
root@slave1:/home/xxx/Documents# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b35394dcea6f        ubuntu              "/bin/sh -c 'while t…"   14 minutes ago      Up 10 seconds                           lucid_beaver

进入容器
1)attach命令
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,推荐使用官方的attachexec命令。

root@slave1:/home/xxx/Documents# docker run -itd ubuntu
b04603884b85b122f4ff32d935b4f18fabd0ba8a79d1954dc73da01d9fb7ca0a
root@slave1:/home/xxx/Documents# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b04603884b85        ubuntu              "/bin/bash"         4 seconds ago       Up 3 seconds                            compassionate_cartwright
root@slave1:/home/xxx/Documents# docker attach compassionate_cartwright
root@b04603884b85:/#

然而使用attach 命令有时候并不方便。当多个窗口同时attach 到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

2)从Docker1.3.0 版本起, Docker 提供了一个更加方便的工具exec命令,可以在运行中容器内直接执行任意命令。
该命令的基本格式为:

docker [container] exec [-di -detach] [ detach-keys[;[]]] [-il--interactive]
[ - -pii vileged][-t|-- tty] [ u I user (;USER]] CONTAINER COMMAND [ARG . . . ]

比较重要的参数有:
口- d, --detach : 在容器中后台执行命令;
口-- detach-keys ="":指定将容器切回后台的按键;
口- e, - - env= [):指定环境变量列表;
口- i, --int eractive=true I false :打开标准输入接受用户输入命令, 默认值为
false;
口-- privileged=trueifalse : 是否给执行命令以高权限,默认值为false;
口- t, --tty=trueifalse : 分配伪终端,默认值为false;
口- u, --user ="":执行命令的用户名或ID 。
进入到刚创建的容器中,并启动一个bash:

root@slave1:/home/xxx/Documents# docker start b04603884b85b04603884b85
root@slave1:/home/xxx/Documents# docker exec -it b04603884b85 /bin/bashroot@b04603884b85:/#

可以看到会打开一个新的bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec 命令对容器执行操作是最为推荐的方式。

在容器中查看容器中的用户和进程信息:

root@b04603884b85:/# w
09:27:27 up  7:41,  0 users,  load average: 0.54, 0.52, 0.54
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root@b04603884b85:/# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 09:24 pts/0    00:00:00 /bin/bash
root         12      0  0 09:24 pts/1    00:00:00 /bin/bash
root         22     12  0 09:27 pts/1    00:00:00 ps -ef

删除容器
查看处于终止状态的容器,并删除:

root@slave1:/home/xxx/Documents# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
b04603884b85        ubuntu              "/bin/bash"         About an hour ago   Exited (0) 7 seconds ago                       compassionate_cartwright
root@slave1:/home/xxx/Documents# docker rm b04603884b85
b04603884b85

默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。

root@slave1:/home/xxx/Documents# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b04603884b85        ubuntu              "/bin/bash"         About an hour ago   Up About an hour                        compassionate_cartwright
root@slave1:/home/xxx/Documents# docker rm b04603884b85
Error response from daemon: You cannot remove a running container b04603884b85b122f4ff32d935b4f18fabd0ba8a79d1954dc73da01d9fb7ca0a. Stop the container before attempting removal or force remove

直接删除一个运行中的容器,可以添加 -f参数。Docker 会先发送SIGKILL 信号给容器,终止其中的应用,之后强行删除。

导入导出容器
1)导出容器
需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker 的导人和导出功能,这也是Docker 自身提供的一个重要特性。
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker [container] export命令,该命令格式为:
docker [container) export [-ol - -output [=””) ) CONTAINER

可以通过-o选项来指定导出的tar 文件名,也可以直接通过重定向来实现。首先,查看所有的容器

root@slave1:/home/xxx/Documents# docker run -d ubuntu:16.04
56f6b04a4177e1817372cdba64eb4f458e5cceefe0e7f4507343ba15e810805d
root@slave1:/home/xxx/Documents# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
56f6b04a4177        ubuntu:16.04        "/bin/bash"         10 seconds ago      Exited (0) 8 seconds ago                       boring_kapitsa
root@slave1:/home/xxx/Documents# docker export -o test_for_run.tar 56f6b04a4177   #导出56f6b04a4177容器到文件test_for_run.tar

之后,可将导出的tar 文件传输到其他机器上,然后再通过导人命令导入到系统中,实现容器的迁移。

2)导入容器
导出的文件又可以使用docker [container] import命令导人变成镜像,该命令
格式为:docker import [-cl--change[=[]]] [-ml -- message[=MESSAGE]] filelURLI[REPOSITORY [:TAG]]
用户可以通过-c, -change =[]选项在导人的同时执行对容器进行修改的Dockerfile指令将导出的test_for_run.tar 文件导人到系统中:
docker import test_for_run.tar - test/ubuntu:vl.O

实际上,既可以使用docker load 命令来导入镜像存储文件到本地镜像库,也可以使用docker [container] import命令来导入一个容器快照到本地镜像库。这两者的区别在于: 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息。
查看容器
Docker容器的inspect topstats子命令。
1)查看容器详情
查看容器详情可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER . .. ]子命令。

root@slave1:/home/xxx/Documents# docker ps -a

2)查看容器内进程
查看容器内进程可以使用docker [container] top [OPTIONS] CONTAINER [CONTAINER . .. ] 子命令。

root@slave1:/home/xxx/Documents# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
b46ec45174d1758dd4c12600fb93448b4f683d5b519a84b38c0c58ad5245873b
root@slave1:/home/xxx/Documents# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES
b46ec45174d1        ubuntu              "/bin/sh -c 'while t…"   4 seconds ago
root@slave1:/home/xxx/Documents# docker top b46ec45174d1   #查看容器内进程
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                15546               15508               1                   20:41               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done
root                15619               15546               0                   20:41               ?                   00:00:00            sleep 1

3)查看统计信息
查看统计信息可以使用docker [container] stats [OPTIONS] [CONTAINER ... ]子命令,会显示CPU 、内存、存储、网络等使用情况的统计信息。
支持选项包括:
口- a, -all :输出所有容器统计信息,默认仅在运行中;
口- format string :格式化输出信息;
口- no-stream :不持续输出,默认会自动更新持续实时结果;
口- no-trunc :不截断输出信息。
查看当前运行中容器的系统资源使用统计:

#docker stats b46ec45174d1

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
b46ec45174d1        lucid_wilson        0.15%               1.926MiB / 3.839GiB   0.05%               3.38kB / 0B         0B / 0B             2

参考:Docker技术入门与实战

猜你喜欢

转载自www.cnblogs.com/eugene0/p/11494371.html