容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。我们可以把镜像看作一个应用安装包,而容器就是应用所需要的运行环境。

1.创建与启动容器

1.1创建容器

  1. #创建容器命令。NAME是容器启动的镜像名称,创建的容器处于停止状态,你需要通过docker start 容器 来启动容器。
  2. docker create [options] NAME[:TAG]
  3. #例子:-it中的i表示保存标准输入打开,t表示分配一个伪终端,而java:8就是创建容器要运行的镜像啦
  4. docker create -it java:8
  5. #查看容器。启动容器需要指定容器,而docker ps 命令可以正在运行的容器,docker ps -a命令可以查看所有容器
  6. docker ps -a
  7. #启动容器。假设上面查得容器ID是19f5f33b23f8
  8. docker start 19f5f33b23f8

create options选项如:https://docs.docker.com/engine/reference/commandline/container_create/

1.2启动容器

启动命令:

docker container start [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS选项:

命令 描述
—attach 连接STDOUT / STDERR和转发信号
—checkpoint 实验(守护程序)从此检查点还原
—checkpoint-dir 实验(守护程序)使用自定义检查点存储目录
—detach-keys 覆盖分离容器的键序列
—interactive , -i 附加容器的STDIN

start命令例子:

#首先使用docker ps -a 命令把要启动的容器查询出来,例如容器id、容器名称
docker ps -a
#根据容器id启动容器(方式1,推荐)
docker start 容器id
#根据容器名称启动容器(方式2)
docker start 容器name
#使用docker ps 命令查看启动的容器
docker ps

1.3 新建并启动容器

另外docker run命令不仅可以创建容器也可以启动容器,docker run等价于docker create命令和docker start命令的集合,先执行docker create命令创建容器,再使用docker start命令启动容器。docker start命令的配置项 。run命令创建并启动容器时,docker在后台运行的标准操作包括:
(1).检查本地是否存在指定的镜像,不存在就从公有仓库(docker hub)下载
(2).利用镜像创建一个容器,并启动该容器
(3).分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
(4).从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
(5).从网桥的地址池配置一个IP地址给容器
(6).执行用户指定的应用程序
(7).执行完毕后容器被自动终止

#run命令例子,-it中的i表示保存标准输入打开,t表示分配一个伪终端,-d 表示在后台运行容器并打印容器ID,如果不加-d那么使用run命令执行容器完毕后会停止容器,java:8就是镜像地址啦,更多配置项还得去看docker官网
docker run -it -d java:8
#查看启动的容器列表
docker ps

1.4查看容器输出(获取容器日志)

命令:docker container logs [OPTIONS] CONTAINER

OPTIONS选项:

命令 默认值 描述
—details 显示提供给日志的其他详细信息
—follow , -f 跟踪日志输出
—since 显示自时间戳记(例如2013-01-02T13:23:37)或相对时间(例如42m,持续42分钟)以来的日志
—tail all 从日志末尾开始显示的行数
—timestamps , -t 显示时间戳
—until API 1.35以上在时间戳(例如2013-01-02T13:23:37)或相对(例如42m持续42分钟)之前显示日志
例子:

docker logs e9d287283e57

2.停止容器

2.1暂停容器

可以使用docker pause命令来暂停一个或多个运行中的容器

命令:docker container pause CONTAINER [CONTAINER…]

例子:docker pause e9d287283e57,假设容器id是e9d287283e57

2.2终止容器

可以使用docker stop命令来终止一个或多个运行中的容器。此的OPTIONS只有一个,—time , -t表示等待停止的秒数,然后将其杀死(默认10s)。

命令:docker container stop [OPTIONS] CONTAINER [CONTAINER…]

例子1:docker stop e9d287283e57

例子2(2s后终止容器):docker stop -t=2 e9d287283e57

此时还可以通过执行docker container prune命令,会自动清除掉所有处于停止状态的容器。也可以通过docker kill命令直接发送SIGKILL信号来强行终止容器。通过docker ps -qa可以查看所有容器的ID。也可以通过docker restart命令来将处于终止状态的容器重新启动,如果重启的容器正在运行,那么会先将运行的容器终止,然后再重新启动。命令集合如下:

#自动清除掉所有处于停止状态的容器
docker container prune
#强行终止容器
docker kill [CONTAINER...]
#查看所有容器的id
docker ps -qa
#重启容器
docker restart [CONTAINER...]

3.进入容器

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

attach命令:

命令:docker container attach [OPTIONS] CONTAINER

OPTIONS选项:

命令 默认值 描述
—detach-keys 指定退出attach模式的快捷键序列,默认是ctrl-p ctrl -q
—no-stdin 是否关闭标准输入,默认是保持打开
—sig-proxy true 代理所有接收到的信号到进程
例子:docker attach e9d287283e57

缺点:当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

exec命令:

命令:docker container exec [OPTIONS] CONTAINER COMMAND [ARG…]

OPTIONS选项:

命令 默认值 描述
—detach , -d 分离模式:在后台运行命令
—detach-keys 指定将容器切回后台的快捷键
—env , -e API 1.25以上设置环境变量
—interactive , -i 即使未连接STDIN也保持打开状态
—privileged 赋予命令扩展权限
—tty , -t 分配伪TTY
—user , -u 用户名或UID(格式:<名称 or uid> [:<组 or gid>])
—workdir , -w API 1.35以上容器内的工作目录
例子:

#进入bash。输入exit可退出
docker exec -it 容器id /bin/bash

4.删除容器

可以使用docker rm的命令删除处于停止或退出状态的容器。默认情况下docker rm命令只能删除处于处于停止或退出状态的容器,并不能删除处于运行中的容器,加个-f就可以强制删除处于运行中的容器,不过一般都不推荐这样做。

命令:docker container rm [OPTIONS] CONTAINER [CONTAINER…]

OPTIONS选项:

命令 默认值 描述
—force , -f 强制删除正在运行的容器(使用SIGKILL)
—link , -l 删除指定的链接,但保留容器
—volumes , -v 删除容器挂载的数据卷
删除容器例子:docker rm e9d287283e57

强制删除运行中的容器例子(不推荐):docker rm -f e9d287283e57

5.导入和导出容器

5.1导出容器

导出容器值:导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。使用docker export 命令可以导出容器,docker export 就只有一个OPTIONS项,—output , -o表示导出的文件路径。

命令:docker container export [OPTIONS] CONTAINER

例子:docker export -o=”haha.tar” 4c095620ad13,然后你会在根目录发现导出容器后的文件,你可以利用导出后容器文件再导入到其他docker中,而从完成容器的迁移

5.2导入容器

导出容器后的文件又可以使用docker import命令导入变成镜像
命令:docker container import [OPTIONS] 新的容器name

OPTIONS选项:

命令 默认值 描述
-c, —change[] 将Dockerfile指令应用于创建的映像
-m, —message string 设置导入镜像的提交消息
例子: docker import haha.tar haha/java:8,将当前目录下的haha.tar导入变成镜像中,haha/java:8就是镜像的名称

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

6.查看容器

6.1查看容器详细信息

命令:docker container inspect [OPTIONS] CONTAINER [CONTAINER…]

OPTIONS选项:

命令 默认值 描述
—format , -f 使用给定的Go模板格式化输出
—size , -s 显示文件总大小

#查看容器详细信息例子
docker inspect 4c095620ad13
#输出结果,返回一段json,详细信息有容器id、创建时间、路径、状态、镜像、配置等信息
[
{
"Id": "4c095620ad13407a1d5526c205eb108b6f8e4a3d279b59a3a67a55a2ee52f4d7",
"Created": "2020-08-07T21:41:03.213480091Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 54145,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-08-07T21:41:03.944621923Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8",
"ResolvConfPath": "/var/lib/docker/containers/4c095620ad13407a1d5526c205eb108b6f8e4a3d279b59a3a67a55a2ee52f4d7/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/4c095620ad13407a1d5526c205eb108b6f8e4a3d279b59a3a67a55a2ee52f4d7/hostname",
"HostsPath": "/var/lib/docker/containers/4c095620ad13407a1d5526c205eb108b6f8e4a3d279b59a3a67a55a2ee52f4d7/hosts",
"LogPath": "/var/lib/docker/containers/4c095620ad13407a1d5526c205eb108b6f8e4a3d279b59a3a67a55a2ee52f4d7/4c095620ad13407a1d5526c205eb108b6f8e4a3d279b59a3a67a55a2ee52f4d7-json.log",
"Name": "/ecstatic_saha",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Capabilities": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/605337354aec36259429173206a8722222c8b3c39871d7eec89f7779835378f3-init/diff:/var/lib/docker/overlay2/fc40dddba8b772f2414f0a8261ed71c1b9943395c7bb4f3051d635f4fcb0adb6/diff:/var/lib/docker/overlay2/7389f526c8464327ce02bcf6e059003403799ccf2a1d0704d120e2cb68438397/diff:/var/lib/docker/overlay2/c5ec74d4ca6eb22740ae3141edc0929335e6e173482d9f546e01ac32df69b36f/diff:/var/lib/docker/overlay2/19daf89abacaf96f92799d68dded17e1f6773c064a389858528534928574df2c/diff:/var/lib/docker/overlay2/bd7a6866a41c12f6753a41fd5798f85479b13b8021f984a0edf6382f5b376df8/diff:/var/lib/docker/overlay2/a6809e37eaf5df9794e32737a83870f5cfb3e5f706018745278b98e3f1493bc9/diff:/var/lib/docker/overlay2/b9ba62147cc46c3eea6310a5e48db9e8f8dd0d294e4d59c8cd1ffebf59502745/diff:/var/lib/docker/overlay2/b2b0deb7b63bd216d2e638e134e5b394f7bd9a6df3fe449911f71581cec77166/diff",
"MergedDir": "/var/lib/docker/overlay2/605337354aec36259429173206a8722222c8b3c39871d7eec89f7779835378f3/merged",
"UpperDir": "/var/lib/docker/overlay2/605337354aec36259429173206a8722222c8b3c39871d7eec89f7779835378f3/diff",
"WorkDir": "/var/lib/docker/overlay2/605337354aec36259429173206a8722222c8b3c39871d7eec89f7779835378f3/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "4c095620ad13",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": true,
"OpenStdin": true,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"LANG=C.UTF-8",
"JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64",
"JAVA_VERSION=8u111",
"JAVA_DEBIAN_VERSION=8u111-b14-2~bpo8+1",
"CA_CERTIFICATES_JAVA_VERSION=20140324"
],
"Cmd": [
"/bin/bash"
],
"Image": "java:8",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "d70732843d229adb07454bf0646753d74c0478312b0971d2cd282702f912df6d",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/d70732843d22",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "689d044ae78d1fd56c4e74fde51a9a4490a8829b4de37111a4a30c32024f7f92",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ffb38a128b1a98a87a17c15ce18e05c25b21ea66b42fc21b537460bc2df3812d",
"EndpointID": "689d044ae78d1fd56c4e74fde51a9a4490a8829b4de37111a4a30c32024f7f92",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]

6.2查看容器内的进程

使用docker container top可以查看容器内进程,top命令会打印进程信息(跟liunx系统中top命令类似),包括PID、用户、时间、命令等信息。

命令:docker container top CONTAINER [ps OPTIONS]

例子:docker top 4c095620ad13

效果图:
0.png

6.3查看统计信息
使用docker stats命令可以查看容器的统计信息,信息内容包括CPU、内存、存储、网络等使用情况的统计信息。

命令:docker container stats [OPTIONS] [CONTAINER…]

OPTIONS选项:

命令 默认值 描述
—all , -a 显示所有容器(默认显示为正在运行)
—format 使用Go模板打印漂亮的图像
—no-stream 禁用流统计信息,仅获取第一个结果
—no-trunc 不截断输出
例子:docker stats 4c095620ad13

效果图:
00.png

7.容器的其他命令

7.1复制文件

docker cp命令支持在容器和主机之间复制文件。

命令:docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

OPTIONS选项:

命令 默认值 描述
—archive , -a 存档模式(复制文件会带有原始的uid / gid信息)
—follow-link , -L 跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
例子:docker cp data 4c095620ad13:/zxp/,这个命令的意思是将本地的data路径复制到4c095620ad13这个容器的/zxp/路径下

#1.在当前目录下创建一个data目录
mkdir data
#2.将本地的data路径复制到4c095620ad13容器的/zxp/路径下,你也可以使用容器名称代替容器id
docker cp data 4c095620ad13:/zxp/
#3.使用exec进入容器看效果之前,要先启动容器
docker start 4c095620ad13
#4.进入容器并开启一个终端,这个终端更我们在liunx使用的终端是一样的,如果你想删除容器中的tmp,那么在终端执行 rm -rf tmp命令即可
docker exec -it 4c095620ad13 /bin/bash
#5.查看容器目录,发现有一个zxp文件
ls
#6.退出终端
exit

例子示意图如下:
000.png

7.2查看变更

命令:docker container diff CONTAINER

例子:docker diff 4c095620ad13

例子示意图如下:
001.png

7.3查看端口映射

命令:docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

例子:docker port 4c095620ad13 or docker port 4c095620ad13 9000,如果指定port那么你得开启此端口

8.列出容器

命令:docker ps [OPTIONS]

例子:

#列出正在运行的容器:
docker ps
#列出所有容器容器:
docker ps -a
#列出最后创建的5个容器(包括所有状态)
docker ps -n=5
#仅列出容器id(仅包含正在运行的容器)
docker -q
#仅列出容器id(包含所有容器)
docker -qa
命令 默认值 描述
—all , -a 显示所有容器(默认显示为正在运行)
—filter , -f 根据提供的条件过滤输出
—format
使用Go模板打印漂亮的容器
—last , -n -1 显示n个最后创建的容器(包括所有状态)
—no-trunc 不要截断输出
—quiet , -q 仅显示数字ID
—size , -s 显示文件总大小

9.容器命令小结

#创建容器常用命令。例如 docker create -it java:8。-it中的i表示保存标准输入打开,t表示分配一个伪终端,而java:8就是创建容器要运行的镜像啦
docker create [options] IMAGE[:TAG]

#列出所有容器
docker ps -a

#列出正在运行的容器
docker ps

#仅列出容器id(包含所有容器)
docker -qa

#启动容器,例子:docker start 19f5f33b23f8 29f5f33b23f8。你也可以根据容器name来启动容器
docker container start [OPTIONS] CONTAINER [CONTAINER...]

#启动所有容器
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

#根据镜像创建并启动容器(-d指定运行后台模式,不加-d容器执行结束后会终止)。例子:docker run -it -d java:8
docker container run [OPTIONS] CONTAINER

#暂停容器。例子:docker pause 19f5f33b23f8 29f5f33b23f8
docker container pause CONTAINER [CONTAINER...]

#暂停所有容器
docker pause $(docker ps -a | awk '{ print $1}' | tail -n +2)

#终止容器。例子:docker stop 19f5f33b23f8
docker container stop CONTAINER [CONTAINER...]

#终止所有容器
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

#强制杀死容器。例如:docker kill 19f5f33b23f8
docker kill CONTAINER [CONTAINER...]

#强制杀死所有容器。
docker kill $(docker ps -a | awk '{ print $1}' | tail -n +2)

#查看容器输出。例子:docker logs 19f5f33b23f8
docker container logs [OPTIONS] CONTAINER

#进入容器。例子1:docker exec -it 19f5f33b23f8。例子2(进入容器并新建终端):docker exec -it 19f5f33b23f8 /bin/bash
docker exec [OPTIONS] CONTAINER

#删除容器。例子1(只能删除处于停止状态的容器):docker rm 19f5f33b23f8 29f5f33b23f8。例子2(强制删除,可以删除处于运行状态的容器):docker rm -f 19f5f33b23f8 29f5f33b23f8
docker container rm [OPTIONS] [CONTAINER...]

#删除所有容器
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

#导出容器。例子:docker export -o="haha.tar" 19f5f33b23f8。此例子表示导出容器到当前目录下的haha.tar文件
docker container export [OPTIONS] CONTAINER

#导入容器(导入后是一个镜像)。例子:docker import haha.tar haha/java:8。此例子表示将当前目录下的haha.tar容器文件导入,生成的镜像名为haha/java:8
docker container import [OPTIONS] IMAGE[:TAG]

#查看容器详细信息。例子:docker inspect 19f5f33b23f8
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

#查看容器中进程信息(包含PID、创建时间、用户等信息)。例子:docker top 19f5f33b23f8
docker container top CONTAINER [ps OPTIONS]

#查看容器中统计信息(包含CPU、内存、磁盘等信息)。例子:docker stats 19f5f33b23f8
docker container stats [OPTIONS] [CONTAINER...]

#将主机的文件复制到容器中。例子:docker cp data 19f5f33b23f8:/tmp/。此例子表示将当前目录下的data文件复制到19f5f33b23f8容器的/tmp/目录
docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

#查看容器变更。例子:docker diff 19f5f33b23f8
docker container diff CONTAINER

#查看容器端口映射。例子:docker port 19f5f33b23f8。例子2(确保你查看的端口是公开的):docker  port 19f5f33b23f8 9000
docker container port CONTAINER [PRIVATE_PORT[/PROTO]]