04-使用docker容器
docker容器是另一个核心概念,容器是镜像的一个运行实例。不同的是镜像是静态的只读文件,容器带有运行时需要的可写层,并且容器中的应用进程处于运行状态。
虚拟机是模拟运行一整套操作系统,docker只运行一个应用和它的运行环境。
创建容器
- 新建容器,docker [container] create命令新建的容器处于停止状态
[ ~]# docker create -it ubuntu:18.04 550c14d7db29b3fbcdff0819546403779f8ce717fa2a5012909b057c2f8b1806 [ ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 550c14d7db29 ubuntu:18.04 "/bin/bash" 34 seconds ago Created kind_rosalind
- 启动容器,docker [container] start命令来启动一个已经创建的容器
[ ~]# docker start 55 55 [ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 550c14d7db29 ubuntu:18.04 "/bin/bash" 2 minutes ago Up 5 seconds kind_rosalind
- 新建并启动容器,除了创建容器后通过start命令启动,也可以直接新建并启动。docker [container] run
[ ~]# docker run ubuntu:18.04 /bin/echo ‘hello‘ hello
当执行完/bin/echo ‘hello‘后,容器会自动终止。
当使用docker run来创建启动容器时会包含:
1、检查本地是否存在指定镜像,没有就从公有仓库下;
2、利用镜像创建一个容易,并启动;
3、分配一个文件系统给容器,并给只读的镜像外挂一个可读写层;
4、从宿主机的网桥接口桥接一个虚拟机口到容器中;
5、网桥地址池分配一个ip地址给容器;
6、执行用户应用;
7、容器自动终止
启动一个bash终端,允许用户进行交互[ ~]# docker run -it ubuntu:18.04 /bin/bash :/# pwd / :/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
-t:为docker分配一个为终端(pseudo-tty)并绑定到容器的标准输入上
-i:让容器的标准输入保持打开 - 后台运行,更多的时候需要容docker容器在后台以守护态(Daemonized)形式运行
[ ~]# docker run -d ubuntu:18.04 /bin/bash -c "while true;do echo ‘hello‘;sleep 1;done" [ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a5d805944192 ubuntu:18.04 "/bin/sh -c ‘while t…" 4 seconds ago Up 3 seconds frosty_joliot
- 查看容器输出,docker [container] logs
[ ~]# docker logs a5d805944192 hello hello hello ...
停止容器
- 暂停容器,docker [container] pause CONTAINER [CONTAINER...]
在一个终端执行[ ~]# docker run --name test --rm -it ubuntu bash :/#
另一个终端执行,暂停
[ ~]# docker pause test test [ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98eedc501dec ubuntu "bash" 2 minutes ago Up 2 minutes (Paused) test
恢复
[ ~]# docker unpause test test
- 终止容器
[ ~]# docker stop test test
- 重起容器
[ ~]# docker restart test test
进入容器
如果需要进入容器进行操作,推荐使用官方的attach或exec命令。
attach的命令格式为:
docker attach [--detach-key[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
-detach-key[=[]] #指定退出attach模式的快捷键,默认是CTRL+p CTRL+q;
--no-stdin=true|false #是否关闭标准输入,默认是保持打开;
--sig-proxy=treu|false #是否代理收到的系统信号给应用程序,默认打开;[ ~]# docker run -itd ubuntu:18.04 b82dba0090bcb85fafdeef03e67f9973426965f2792efae73de1c07eb0b44bc2 [ ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b82dba0090bc ubuntu:18.04 "/bin/bash" 52 seconds ago Up 50 seconds fervent_maxwell [ ~]# docker attach fervent_maxwell :/#
exec是1.3.0 docker版本后提供的一个更方便的工具,可以在运行中容器内直接执行任何命令。
docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONAINER COMMAND [ARG...]
-d #在容器中后台执行命令
--detach-keys=“ ” #指定容器切回后台的按键
-e #指定环境变量列表
-i #打开标准输入接受用户输入命令,默认为false
--privileged=treu|false #是否给执行命令以最高权限,默认false
-t #分配伪终端,默认false
-u #执行命令的用户名或ID[ ~]# docker exec -it f2554976971b /bin/bash :/# w 08:02:18 up 2 days, 18:58, 0 users, load average: 0.03, 0.03, 0.05 USER TTY FROM IDLE JCPU PCPU WHAT :/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:01 pts/0 00:00:00 /bin/bash root 10 0 0 08:02 pts/1 00:00:00 /bin/bash root 20 10 0 08:02 pts/1 00:00:00 ps -ef
此时会打开一个新的bash终端,不影响容器内其他应用的前提下,用户与容器进行交互。
删除容器
可是使用docker [container] rm命令来删除处于终止或退出状态的容器。docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTIAINER
-f #是否强制终止并删除一个运行中的容器
-l #删除容器的链接,但保留容器
-v #删除容器挂载的数据卷
查看处于停止状态的容器,并删除[ ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f2554976971b ubuntu:18.04 "/bin/bash" 46 hours ago Up 46 hours focused_joliot b82dba0090bc ubuntu:18.04 "/bin/bash" 47 hours ago Exited (0) 46 hours ago fervent_maxwell [ ~]# docker rm b82dba0090bc b82dba0090bc
导出容器
用于将容器从一个系统迁移到另外一个系统,这时可以使用docker的导入和导出功能。
1、 导出容器是指,导出一个已经创建的容器到一个文件,不管此时容器是否处于运行状态。docker [container] export [-o|--output[=""]] CONTAINER
-o #指定导出的tar文件名,也可以直接通过重定向来实现[ docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f2554976971b ubuntu:18.04 "/bin/bash" 47 hours ago Up 47 hours focused_joliot a5d805944192 ubuntu:18.04 "/bin/sh -c ‘while t…" 2 days ago Exited (137) 2 days ago frosty_joliot [ docker]# docker export a5d805944192 > test_ubuntu2.tar [ docker]# docker export -o test_ubuntu.tar a5d805944192 [ docker]# ls test_ubuntu2.tar test_ubuntu.tar
导入容器
导出的文件可以使用docker [container] import 命令导入变成镜像。docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL| -[REPOSITORY[:TAG]]
-c #再倒入的同时执行对容器进行修改的Dockerfile指令[ docker]# docker import test_ubuntu.tar test111/ubuntu:v1.0 sha256:6c5cd99408ca4648c4d3e5560280e75633e3fbcfdba2778d1b69e4353fb27cc9 [ docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test111/ubuntu v1.0 6c5cd99408ca 13 seconds ago 64.2M
注:docker load和docker import区别在于容器快照(docker import)将丢弃所有的的历史记录和元数据信息,仅保存容器当时的快照状态。镜像存储文件(docker load)将保存完整记录,体积更大。
查看容器
1、查看容器详情,docker container inspect [OPTIONS] ONTAINER
[ docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f2554976971b ubuntu:18.04 "/bin/bash" 47 hours ago Up 47 hours focused_joliot [ docker]# docker container inspect frosty_joliot [ { "Id": "a5d8059441922d3157d2af1d0ab0a724acf13fbe8bb60ddb92fa2536620c2f84", "Created": "2020-03-05T05:50:37.692124654Z", "Path": "/bin/sh", "Args": [ "-c", "while true;do echo hello;sleep 1;done" ], "State": { "Status": "exited",
查看某个容器的具体信息,会以json格式返回包括ID、创建时间、路径、状态、镜像、配置等在内的各项信息。
2、查看容器内的进程,docker [container] top [OPTIONS] CONTAINER,类似于linux的top命令,包括PID、用户、时间、命令等。必须是运行状态的容器才能查看[ docker]# docker top focused_joliot UID PID PPID C STIME TTY TIME CMD root 12365 12348 0 Mar05 pts/0 00:00:00 /bin/bash root 12431 12348 0 Mar05 pts/1 00:00:00 /bin/bash
3、查看统计信息,docker [container] status [OPTIONS] [CONTAINER],会显示CPU、内存、存储、网络等使用情况的统计信息。
-a,--all #输出所有容器统计信息,默认仅在运行中
-format string #格式化输出信息
-no-stream #不持续输出,默认会自动更新持续实时结果
-no-trunc #不截断输出信息
[ docker]# docker stats focused_joliot CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS f2554976971b focused_joliot 0.00% 824KiB / 15.51GiB 0.01% 648B / 0B 0B / 0B 2
其他容器命令
1、复制文件
container cp支持在容器和主机之间复制文件,docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
-a,-archive #打包模式,复制文件会带有原始的UID/GID信息
-L,-follow-link #跟随软链接,当原路径为软链接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
将本都路径oglab/python复制到容器的/tmp路径下
[ oglab]# docker cp Python-3.8.2 focused_joliot:/tmp
2、查看变更
[ oglab]# docker container diff focused_joliot A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_streams.py A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_transports.py A /tmp/Python-3.8.2/Lib/test/test_asyncio/__init__.py A /tmp/Python-3.8.2/Lib/test/test_asyncio/echo.py A /tmp/Python-3.8.2/Lib/test/test_asyncio/test_queues.py A /tmp/Python-3.8.2/Lib/test/test_distutils.py A /tmp/Python-3.8.2/Lib/test/test_posixpath.py A /tmp/Python-3.8.2/Lib/test/test_subclassinit.py A /tmp/Python-3.8.2/Lib/test/xmltestdata ...
3、查看端口映射,container port命令可以查看容器的端口映射情况,docker container port CONTAINER [PRIVATE_PORT[/PROTO]]
[ oglab]# docker container port focused_joliot
4、更新配置,container update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。docker [container] update [OPTIONS] CONTAINER
限制总配额为1秒,容器所占用的时间为10%,单位微妙
[ oglab]# docker update --cpu-quota 1000000 f2554976971b f2554976971b [ oglab]# docker update --cpu-period 1000000 f2554976971b f2554976971b