|
Docker容器docker容器是另一个核心概念,容器是镜像的一个运行实例。不同的是镜像是静态的只读文件,容器带有运行时需要的可写层,并且容器中的应用进程处于运行状态。
虚拟机是模拟运行一整套操作系统,docker只运行一个应用和它的运行环境。
创建容器新建容器,docker [container] create命令新建的容器处于停止状态[root@docker01 ~]# docker create -it ubuntu:18.04550c14d7db29b3fbcdff0819546403779f8ce717fa2a5012909b057c2f8b1806[root@docker01
~]# docker ps -aCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES550c14d7db29ubuntu:18.04"/bin/bash"34 seconds agoCreatedkind_rosalind启动容器,docker [container] start命令来启动一个已经创建的容器[root@docker01 ~]# docker start 5555[root@docker01 ~]#
docker psCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES550c14d7db29ubuntu:18.04"/bin/bash"2 minutes agoUp 5 secondskind_rosalind新建并启动容器,除了创建容器后通过start命令启动,也可以直接新建并启动。docker [container] run[root@docker01 ~]# docker run
ubuntu:18.04 /bin/echo 'hello'hello当执行完/bin/echo 'hello'后,容器会自动终止。
当使用docker run来创建启动容器时会包含:
1、检查本地是否存在指定镜像,没有就从公有仓库下;
2、利用镜像创建一个容易,并启动;
3、分配一个文件系统给容器,并给只读的镜像外挂一个可读写层;
4、从宿主机的网桥接口桥接一个虚拟机口到容器中;
5、网桥地址池分配一个ip地址给容器;
6、执行用户应用;
7、容器自动终止
启动一个bash终端,允许用户进行交互
[root@docker01 ~]# docker run -it ubuntu:18.04 /bin/bashroot@4d99166324fb:/#
pwd/root@4d99166324fb:/# lsbindev home
lib64 mnt proc runsrv tmp varboot etc
libmedia opt root sbin sys usr-t:为docker分配一个为终端(pseudo-tty)并绑定到容器的标准输入上
-i:让容器的标准输入保持打开
后台运行,更多的时候需要容docker容器在后台以守护态(Daemonized)形式运行[root@docker01 ~]# docker run -d ubuntu:18.04
/bin/bash -c "while true;do echo 'hello';sleep
1;done"[root@docker01 ~]# docker psCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMESa5d805944192ubuntu:18.04"/bin/sh -c 'while
t…"4 seconds agoUp 3 secondsfrosty_joliot查看容器输出,docker [container] logs[root@docker01 ~]# docker logs
a5d805944192hellohellohello...停止容器暂停容器,docker [container] pause CONTAINER [CONTAINER...]
在一个终端执行[root@docker01 ~]# docker run --name test --rm -it
ubuntu bashroot@98eedc501dec:/# 另一个终端执行,暂停
[root@docker01 ~]# docker pause testtest[root@docker01 ~]# docker psCONTAINER
IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES98eedc501decubuntu"bash"2 minutes agoUp 2 minutes
(Paused)test恢复
[root@docker01 ~]# docker unpause testtest终止容器[root@docker01 ~]# docker stop testtest重起容器[root@docker01 ~]# docker restart testtest进入容器如果需要进入容器进行操作,推荐使用官方的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 #是否代理收到的系统信号给应用程序,默认打开;
[root@docker01 ~]# docker run -itd
ubuntu:18.04b82dba0090bcb85fafdeef03e67f9973426965f2792efae73de1c07eb0b44bc2[root@docker01
~]# docker psCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMESb82dba0090bcubuntu:18.04"/bin/bash"52 seconds agoUp 50 secondsfervent_maxwell[root@docker01 ~]#
docker attach fervent_maxwellroot@b82dba0090bc:/# 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
[root@docker01 ~]# docker exec -it f2554976971b /bin/bashroot@f2554976971b:/#
w08:02:18 up 2 days, 18:58, 0 users, load average: 0.03, 0.03, 0.05USERTTYFROMLOGIN@IDLEJCPUPCPU
WHATroot@f2554976971b:/# ps -efUIDPID
PPID C STIME TTYTIME CMDroot10 0 08:01 pts/000:00:00
/bin/bashroot100 0 08:02 pts/100:00:00 /bin/bashroot2010 0 08:02 pts/100:00:00 ps -ef此时会打开一个新的bash终端,不影响容器内其他应用的前提下,用户与容器进行交互。
删除容器可是使用docker [container] rm命令来删除处于终止或退出状态的容器。docker [container] rm [-f|--force] [-l|--link]
[-v|--volumes] CONTIAINER
-f #是否强制终止并删除一个运行中的容器
-l #删除容器的链接,但保留容器
-v #删除容器挂载的数据卷
查看处于停止状态的容器,并删除
[root@docker01 ~]# docker ps -aCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMESf2554976971bubuntu:18.04"/bin/bash"46 hours agoUp 46 hoursfocused_joliotb82dba0090bcubuntu:18.04"/bin/bash"47 hours agoExited (0) 46
hours agofervent_maxwell[root@docker01 ~]# docker rm b82dba0090bcb82dba0090bc导出容器用于将容器从一个系统迁移到另外一个系统,这时可以使用docker的导入和导出功能。
1、导出容器是指,导出一个已经创建的容器到一个文件,不管此时容器是否处于运行状态。docker [container] export
[-o|--output[=""]] CONTAINER
-o #指定导出的tar文件名,也可以直接通过重定向来实现
[root@docker01 docker]# docker ps -aCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMESf2554976971bubuntu:18.04"/bin/bash"47 hours agoUp 47 hoursfocused_joliota5d805944192ubuntu:18.04"/bin/sh
-c 'while t…"2 days
agoExited (137) 2 days agofrosty_joliot[root@docker01
docker]# docker export a5d805944192 > test_ubuntu2.tar[root@docker01
docker]# docker export -o test_ubuntu.tar a5d805944192[root@docker01 docker]#
lstest_ubuntu2.tar test_ubuntu.tar导入容器导出的文件可以使用docker [container] import 命令导入变成镜像。docker import [-c|--change[=[]]]
[-m|--message[=MESSAGE]] file|URL| -[REPOSITORY[:TAG]]
-c #再倒入的同时执行对容器进行修改的Dockerfile指令
[root@docker01 docker]# docker import test_ubuntu.tar
test111/ubuntu:v1.0sha256:6c5cd99408ca4648c4d3e5560280e75633e3fbcfdba2778d1b69e4353fb27cc9[root@docker01
docker]# docker imagesREPOSITORYTAGIMAGE IDCREATEDSIZEtest111/ubuntuv1.06c5cd99408ca13 seconds
ago64.2M注:docker load和docker import区别在于容器快照(docker import)将丢弃所有的的历史记录和元数据信息,仅保存容器当时的快照状态。镜像存储文件(docker load)将保存完整记录,体积更大。
查看容器1、查看容器详情,docker container inspect [OPTIONS] ONTAINER
[root@docker01 docker]# docker ps -aCONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMESf2554976971bubuntu:18.04"/bin/bash"47 hours agoUp 47 hoursfocused_joliot[root@docker01
docker]# docker container inspect frosty_joliot[{"Id": "a5d8059441922d3157d2af1d0ab0a724acf13fbe8bb60ddb92fa2536620c2f84","Created":
"2020-03-05T05:50:37.692124654Z"," ath":
"/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、用户、时间、命令等。必须是运行状态的容器才能查看
[root@docker01 docker]# docker top focused_joliotUIDPIDPPIDCSTIMETTYTIMECMDroot12365123480Mar05pts/000:00:00/bin/bashroot12431123480Mar05pts/100:00:00/bin/bash3、查看统计信息,docker [container] status [OPTIONS] [CONTAINER],会显示CPU、内存、存储、网络等使用情况的统计信息。
-a,--all#输出所有容器统计信息,默认仅在运行中
-format string #格式化输出信息
-no-stream#不持续输出,默认会自动更新持续实时结果
-no-trunc#不截断输出信息
[root@docker01 docker]# docker stats focused_joliotCONTAINER IDNAMECPU %MEM USAGE /
LIMITMEM %NET I/OBLOCK I/OPIDSf2554976971bfocused_joliot0.00%824KiB / 15.51GiB0.01%648B / 0B0B / 0B2其他容器命令1、复制文件
container cp支持在容器和主机之间复制文件,docker [container] cp [OPTIONS] CONTAINER:SRC_PATH
DEST_PATH|-
-a,-archive#打包模式,复制文件会带有原始的UID/GID信息
-L,-follow-link#跟随软链接,当原路径为软链接时,默认只复制链接信息,使用该选项会复制链接的目标内容。
将本都路径oglab/python复制到容器的/tmp路径下
[root@docker01 oglab]# docker cp Python-3.8.2 focused_joliot:/tmp2、查看变更
[root@docker01 oglab]# docker container diff focused_joliotA
/tmp/Python-3.8.2/Lib/test/test_asyncio/test_streams.pyA
/tmp/Python-3.8.2/Lib/test/test_asyncio/test_transports.pyA
/tmp/Python-3.8.2/Lib/test/test_asyncio/__init__.pyA
/tmp/Python-3.8.2/Lib/test/test_asyncio/echo.pyA
/tmp/Python-3.8.2/Lib/test/test_asyncio/test_queues.pyA
/tmp/Python-3.8.2/Lib/test/test_distutils.pyA
/tmp/Python-3.8.2/Lib/test/test_posixpath.pyA /tmp/Python-3.8.2/Lib/test/test_subclassinit.pyA
/tmp/Python-3.8.2/Lib/test/xmltestdata...3、查看端口映射,container port命令可以查看容器的端口映射情况,docker container port CONTAINER [PRIVATE_PORT[/PROTO]]
[root@docker01 oglab]# docker container port focused_joliot4、更新配置,container update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。docker [container] update [OPTIONS] CONTAINER
限制总配额为1秒,容器所占用的时间为10%,单位微妙
[root@docker01 oglab]# docker update --cpu-quota 1000000
f2554976971bf2554976971b[root@docker01 oglab]# docker update --cpu-period
1000000 f2554976971bf2554976971b |
|