Docker使用小结(一)Docker镜像以及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
存出和载人镜像
- 存出镜像
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/xxx/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/xxx/Documents# docker start 78c72848cb2a #启动容器78c72848cb2a
78c72848cb2a
root@slave1:/home/xxx/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/xxx/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
参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,推荐使用官方的attach
或exec
命令。
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)从Docker
的1.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 top
和stats
子命令。
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技术入门与实战