1.7 容器的进入
使用docker 原生方法进入容器,可以使用 docker attach 和 docker exec 命令进入。或者也可以使用docker run -it 在创建容器时就进入容器。
使用 exit 容器停止退出
使用 ctrl +p ctrl +q 容器不停止退出
1.7.1 使用 docker attch 的方法
docker attch 可以进入一个已经运行容器。然后输入命令执行动作.
格式:
docker attch 容器ID或名称
输入exit 进行退出。这个会退出docker attch 进程,通常容器也会退出,处于终止状态
输入 ctrl +p 和 ctrl +q 或者 按住ctrl 键 然后依次输入 p 键 q 键 可以退出 attach 进程而不停止容器
#使用docker attch 容器ID/名称 进入运行的容器 [root@host103 ~]# docker attach mycentos #输入exit 退出后,容器也终止了 [root@5a51e6a3c5bf /]# exit exit
1.7.2 使用 docker exec的方法
格式:
docker exec [选项] 容器id/名称 bash或/bin/bash等 [ -c ] “命令序列”
关于 docker exec 选项:
可以看出只用-i 时,由于没有分配伪终端,看起来像pipe执行一样。但是执行结果、命令
返回值都可以正确获取。
使用-it时,则和我们平常操作console界面类似。而且也不会像attach方式因为退出,导致
整个容器退出。
如果只使用-t参数,则可以看到一个console窗口,但是执行命令会发现由于没有获得stdin
的输出,无法看到命令执行情况
在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。
程序在后台运行。如果不使用-d参数,由于命令需要长时间执行,docker exec会卡住,一直等命令执行完成
才返回。
关于docker exec 后面的命令:
我们通常会使用 docker exec -it bash 进入容器并开启一个bash环境的伪终端。也可以将bash 换成其他一条命令,让容器执行完后,将结果输出到屏幕
后面可以跟上 -c 选项 “命令序列",命令序列可以是多个命令,使用分号隔开,可以一次性执行多条命令
[root@localhost ~]# docker exec -it 92829fa3c584 bash [root@92829fa3c584 /]# ls anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var #退出容器 [root@92829fa3c584 /]# exit exit #退出后不影响容器运行
1.7.3 使用docker run -it 方法
[root@localhost opt]# docker run -it centos:7 bash [root@ff96c27aa00c /]# ls anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@ff96c27aa00c /]# [root@ff96c27aa00c /]# exit exit [root@localhost opt]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ff96c27aa00c centos:7 "bash" 43 seconds ago Exited (0) 4 seconds ago recursing_mcnulty #退出后容器也退出了
docker run -it会创建前台进程,但是会在输入exit后终止进程。
docker attach会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程
docker exec -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行
1.8 容器日志docker log
格式:
docker logs 容器ID
#启动容器并映射端口 [root@localhost ~]# docker run -id -P stevelugyq/nginx a14514ee688dcf6495abb0ff2405bcc4887896446e1e2790e40298c3af7abdeb [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a14514ee688d stevelugyq/nginx "/docker-entrypoint.…" 17 seconds ago Up 16 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp charming_noyce #通过docker logs 容器ID访问该容器的日志 [root@localhost ~]# docker logs a14514ee688d ....... 192.168.109.1 - - [23/Jun/2022:15:23:11 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36" "-" 2022/06/23 15:23:12 [error] 31#31: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.109.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.109.133:49153", referrer: "http://192.168.109.133:49153/" 192.168.109.1 - - [23/Jun/2022:15:23:12 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.109.133:49153/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36" "-"
1.9 容器文件复制到主机docker cp
[root@localhost ~]# touch 1.txt #将1.txt文件导入到容器a14514ee688d下的tmp目录 [root@localhost ~]# docker cp ./1.txt a14514ee688d:/tmp #进入a14514ee688d容器 [root@localhost ~]# docker exec -it a14514ee688d bash #进入到tmp目录查看 root@a14514ee688d:/# cd tmp/ root@a14514ee688d:/tmp# ls 1.txt #在容器中写一个文件 root@a14514ee688d:/tmp# echo "i am stevelu" > 2.txt root@a14514ee688d:/tmp# ls 1.txt 2.txt root@a14514ee688d:/tmp# #将容器中的2.txt导出 root@a14514ee688d:/tmp# exit exit [root@localhost ~]# docker cp a14514ee688d:/tmp/2.txt /opt/ [root@localhost ~]# cd /opt/ [root@localhost opt]# ls 2.txt containerd nginx.tar rh [root@localhost opt]# cat 2.txt i am stevelu
1.10 容器的导入导出docker export
用户可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker export命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
1.10.1 导出格式:docker export 容器ID/名称 > 文件名
#导出容器 [root@localhost ~]# docker export a14514ee688d > mycentos.tar [root@localhost ~]# ls 1.txt anaconda-ks.cfg initial-setup-ks.cfg mycentos.tar original-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面 [root@localhost ~]# scp mycentos.tar 192.168.109.134
1.10.2 导入格式:cat 文件名 | docker import - 镜像名称:标签
导入后会生成镜像,但不会创建容器,再通过该镜像创建容器
[root@localhost ~]# cat mycentos.tar |docker import - centos:stevelu sha256:b7e05242819397b7d020a461ae03621be1b06eb801bc4f30b6d13e5866ae4739 #此时查看镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos stevelu b7e052428193 10 seconds ago 140MB #创建容器 [root@localhost ~]# docker run id centos:stevelu bash
1.11 查看docker消耗的资源状态
#启动容器 [root@localhost ~]# docker start eloquent_sinoussi eloquent_sinoussi [root@localhost ~]# docker start cool_chandrasekhar cool_chandrasekhar #查看资源消耗 [root@localhost ~]# docker stats
总结
1. Docker容器管理命令有哪些,分别是什么作用?
命令 |
说明 |
docker create -i [–name=容器名称] 镜像名 | 创建容器 |
docker create -it [–name=容器名称] 镜像名 <命令> | 创建容器并导入命令 |
docker start <容器ID/名称> | 启动容器 |
docker stop <容器ID/名称> | 停止容器 |
docker kill <容器ID/名称> | 立即强制停止容器 |
docker rm [-f] <容器ID/名称> | 删除容器 (-f 强制删除正在运行的容器) |
docker ps -a | 查询所有容器运行状态 不加-a是运行容器状态 |
docker rm $(docker ps -aq) | 删除所有容器 |
docker rmi $(docker images -q) | 删除所有镜像 |
docker run [–name] -id | 启动容器(一次性执行) |
docker exec -it 容器ID/名称 bash | 进入容器 |
docker attch | 进入容器 |
docker run -it | 启动时进入容器 |
docker export | 容器导出/导入 |
docker cp | 容器文件复制到主机 |
docker logs | 容器pid=1的进程日志 |
docker export 容器ID/名称 > 文件名 | 导出文件 |
cat 文件名 docker import - 镜像名称:标签 | 导入文件 |
docker stats |
查看docker消耗的资源状态 |
2.批量删除容器有哪些命令?
命令 |
说明 |
docker stop -> docker rm | 删除已经停止的容器 |
docker rm -f | 强制删除正在运行的容器 |
docker ps -a | awk ‘NR>=2{print "docker stop "$1}’ | bash | 批量停止容器 |
docker ps -a | awk ‘NR>=2{print $1}’ | xargs docker stop | 批量停止容器 |
docker ps -a | awk ‘NR>=2{print "docker rm "$1}’ | bash | 批量删除所有容器 |
docker ps -a | awk ‘NR>=2{print $1)’ | xargs docker rm | 批量删除所有容器 |
docker images | awk ‘NR>=2{print "docker rmi "$3}’ | bash | 批量删除镜像 |
docker images | grep none | awk ‘{print $3}’| xargs docker rmi | 删除none镜像 |
docker rm $(docker ps -a -q) | 批量清理后台停止的容器 |