1.docker 容器创建流程
2.容器运行本质
bash
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
创建容器基本选项:
--name:为容器命名
-i:交互式创建容器
-d:后台创建容器
-t:为容器分配伪终端
Docker 容器存在的意义就是为了运行容器中的应用,对外提供服务,所以启动容器的目的就是启动运行该容器中的应用。容器中的应用运行完毕后,容器就会自动终止。所以如果不想让容器启动后立即终止运行,则就需要使容器应用不能立即结束。通常采用的方式有两种,使应用处于与用户交互的状态或等待状态。
3.docker run
从镜像创建并运行一个新容器
格式:
bash
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
创建一个centos7.9镜像
bash
[root@localhost ~]# docker run -it --name centos7 centos:7.9.2009
[root@4c392a1a06d7 /]#
#前台退出容器 ctrl+p+q
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c392a1a06d7 centos:7.9.2009 "/bin/bash" 11 seconds ago Up 10 seconds centos7
前台退出容器快捷键 ctrl+p+q 容器在后台运行
4.docker exec
在正在运行的容器中执行命令
格式:
bash
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
选项:
bash
--detach,-d:分离模式:在后台执行命令
--detach-keys:覆盖分离容器的键序列
--env -e:设置环境变量
--env-file:读写一个环境变量文件
--interactive,-i:保持STDIN打开,即使没有连接
--privileged:赋予命令扩展权限
--tty,-t:分配一个伪终端
--user,-u;用户名或UID(格式:< name| UID >[:<group|gid>])
--workdir,-w:容器内的工作目录
进入centos7容器中
bash
[root@localhost ~]# docker exec -it -w /tmp centos7 /bin/bash
[root@4c392a1a06d7 tmp]# pwd
/tmp
docker attach
将本地标准输入、输出和错误流附加到正在运行的容器
格式:
bash
docker attach [OPTIONS] CONTAINER
docker exec 与 docker attach的区别?
-
docke exec会新建一个进程来访问容器进程,一般与-it选项联合使用,一般使用exit命令退出i并终止当前进程
-
docker attach不会新建进程,而是进入容器原有的进程,根据情况可以使用exit或者ctrl+p+q来进行退出容器
5.docker ps
列表容器
格式:
bash
docker ps [OPTIONS]
选项:
-a,-all:显示所有容器(默认显示正在运行)
-f:根据提供的条件过滤输出
--latest,-l:显示最新创建的容器(包括所有状态)
--no-trunc:不要截断输出
--quiet,-q:只显示容器id
--size,-s:显示总文件大小
注意:docker ps不支持容器间的文件复制传递
6.docker top
显示容器的运行进程
格式:
bash
docker top CONTAINER [ps OPTIONS]
7.docker 容器管理
启动
bash
docker start [OPTIONS] CONTAINER [CONTAINER...]
停止
bash
docker stop [OPTIONS] CONTAINER [CONTAINER...]
#强制停止
docker kill [OPTIONS] CONTAINER [CONTAINER...]
重启
bash
docker restart [OPTIONS] CONTAINER [CONTAINER...]
暂停
bash
docker pause CONTAINER [CONTAINER...]
取消暂停
bash
docker unpause CONTAINER [CONTAINER...]
8.docker logs
获取容器日志
格式:
bash
docker logs [OPTIONS] CONTAINER
选项:
--details:显示日志提供的额外详细信息
--follow,-f:跟踪日志输出
--since:显示从时间戳开始的日志(例如2013-01-02T13:23:37Z)或相对日志(例如42m的42minutes)
--tail,-n:从日志末尾开始显示的行数
-t:显示日志时间戳
--until:在时间戳之前显示日志(例如2013-01-02T13:23:37Z)或相对显示(例如42m表示42minutes)
查看5秒之前的日志内容的前3行
bash
[root@localhost ~]# docker logs --until 5s -n 3 nginx1
2023/07/12 10:04:58 [notice] 1#1: start worker process 32
2023/07/12 10:04:58 [notice] 1#1: start worker process 33
2023/07/12 10:04:58 [notice] 1#1: start worker process 34
9.docker cp
在容器和本地文件系统之间复制文件/文件夹
格式:
bash
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
选项:
-a:归档模式(复制所有uid/gid信息)
--quiet,-q:在复制过程中抑制进度输出。如果没有终端连接,则自动抑制进度输出
10.docker rm
移除一个或多个容器
格式:
bash
docker rm [OPTIONS] CONTAINER [CONTAINER...]
选项:
--force,-f:强制移除正在运行的容器(使用SIGKILL)
--link,-l:移除指定的链接
--volumes,-v:移除与容器关联的匿名卷
11.docker commit
根据容器的更改创建一个新映像
格式:
bash
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
选项:
--author,-a:作者(如John Hannibal Smith <hannibal@a-team.com>)
--change,-c:在创建的镜像上应用Dockerfile指令
--message,-m:提交消息
--pause,-p:在提交期间暂停容器
创建一个centos7镜像,进行安装net-tools工具,然后进行打包成镜像
bash
[root@localhost ~]# docker run -itd --name centos centos:7.9.2009
1d1725c19cbe9c6e119f055827a316dd351eb4adeae291a878a39418312daed5
[root@localhost ~]# docker exec -it centos /bin/bash
[root@1d1725c19cbe /]# yum -y install net-tools
进行打包
bash
[root@localhost ~]# docker commit -a 'conquerbug@163.com' centos centos7:net-tools
sha256:0db0f584d14de19f7b377fa385ea43e7abcb57223f4a51c690c5b1628e882f70
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 net-tools 0db0f584d14d 6 seconds ago 418MB
然后,再基于当前镜像创建容器即可
12.docker导出/导入
docker export
将容器文件系统导出为tar归档文件
格式:
bash
docker export [OPTIONS] CONTAINER
选项:
--output,-o:写入文件,而不是标准输出
将当前容器进行打包
bash
[root@localhost ~]# docker export -o centos.tar centos
[root@localhost ~]# ls
centos.tar Dockerfile httpd-2.4.57.tar.gz image.tar my.cnf original-ks.cfg
docker import
从压缩包中导入内容以创建文件系统映像
格式:
bash
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
选项:
--change,-c:在创建的镜像上应用Dockerfile指令
--message,-m:为导入的图像设置提交消息
--platform:如果服务器支持多平台,请设置平台
将刚刚打包的容器进行还原
bash
[root@localhost ~]# docker import centos.tar centos:test
sha256:6bc2adb97476b7b797a5a129c68afcba4ce05ab487812727c7049003f2a1049e
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos test 6bc2adb97476 4 seconds ago 394MB
13.docker镜像/容器导出和导入的区别
export与save
-
export作用于容器,save作用于镜像,但它们导出的结果都是为tar文件
-
export一次只能对一个容器进行导出,save一次可以对多个镜像进行导出
-
export只是对当前容器的文件系统快照进行导出,其会丢失原镜像的所有历史记录与元数据信息,save则是保存了原镜像的完整记录。
import与load
-
import导入的是容器包,load加载的是镜像包,但最终都会恢复为镜像
-
import恢复为的镜像已包含当前镜像一层,load恢复的镜像与原镜像的分层是完全相同的。
-
import恢复的镜像就是新构建的镜像,与原镜像的imageID不同,load恢复的镜像与原镜像是同一个镜像,即imageID相同。
-
import可以为导入的镜像指定从<repository>与<tag>,load加载的镜像不能指定<repository>与<tag>,与原镜像的相同
14.docker system
管理码头工人
1.docker system df
查看docker磁盘使用情况
格式:
docker system df [OPTIONS]
查看当前系统的docker磁盘使用情况
bash
[root@localhost ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 9 2 1.504GB 1.435GB (95%)
Containers 2 1 213.9MB 213.9MB (100%)
Local Volumes 3 1 6.174MB 1.501MB (24%)
Build Cache 19 0 465.4MB 465.4MB
选项:
--format:使用自定义模板格式化输出:` table `:使用
bash
docker system events [OPTIONS]
列标题以表格格式打印输出(默认)` table template `:使用给定的Go模板以表格格式打印输出` json `:使用给定的Go模板打印输出。有关使用模板格式化输出的更多信息,请参阅https://docs.docker.com/go/formatting/
--verbose,-v:显示空间使用的详细信息
2.docker system events
从服务器获取实时事件
格式:
bash
docker system events [OPTIONS]
选项:
--filter,-f:根据提供的条件过滤输出
--format:使用给定的Go模板格式化输出
--since:显示自时间戳以来创建的所有事件
--until:流事件直到这个时间戳
打开两个终端
终端1
bash
docker system events
终端2
bash
[root@localhost ~]# docker stop test
test
查看终端1
bash
[root@localhost ~]# docker system events
2023-07-15T17:04:37.334836848+08:00 container kill d1a032d521d4e4a02cc7ea497d6d83ac137d4d03e838f4db01e0fe903b2cc290 (image=progrium/consul, name=great_easley, signal=15)
2023-07-15T17:04:41.428854481+08:00 network disconnect 462ad2de000e7aae527224ae21c66e15aac0e68ed45f96b65528e22e272851fa (container=d1a032d521d4e4a02cc7ea497d6d83ac137d4d03e838f4db01e0fe903b2cc290, name=bridge, type=bridge)
2023-07-15T17:04:41.430294298+08:00 volume unmount 0e452a14a460fdc4cfa0b2644761923359a263fe9abeca5fd1952927231ca0a7 (container=d1a032d521d4e4a02cc7ea497d6d83ac137d4d03e838f4db01e0fe903b2cc290, driver=local)
2023-07-15T17:04:41.430357838+08:00 container stop d1a032d521d4e4a02cc7ea497d6d83ac137d4d03e838f4db01e0fe903b2cc290 (image=progrium/consul, name=great_easley)
3.docker system info
显示系统范围的信息
格式:
bash
docker system info [OPTIONS]
与docker info相同
4.docker system prune
移除未使用的数据
格式:
bash
docker system prune [OPTIONS]
选项:
--all,-a:删除所有未使用的图片,而不仅仅是悬挂的图片
--filter:提供过滤器值(例如label=<key>=<value>)
--force,-f:不提示确认
--volumes:删除卷
删除当前docker服务器所有没有使用的容器和空名空标签的镜像和没有使用的网络
bash
[root@localhost ~]# docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
翻译:
警告!这将删除:
-所有停止的容器
—所有未被至少一个容器使用的网络
-所有悬挂的图像
-所有悬挂的构建缓存
你确定要继续吗?[y / N]
Are you sure you want to continue? [y/N] y
Deleted Containers:
1d1725c19cbe9c6e119f055827a316dd351eb4adeae291a878a39418312daed5
d1a032d521d4e4a02cc7ea497d6d83ac137d4d03e838f4db01e0fe903b2cc290
Deleted Networks:
mynet1
mac_net1
Deleted build cache objects:
kutjwzwfdu28eldqlwo07uax7
0p5xfeo29k8ojauchfzf97kp0
a9puvqnewb05luw84rnanr2lh
y6mdonbx0pvs2trx7xd97738u
kj09ara8y3v3b6f50xtzie6lv
itk7ujtbdy4c2nirz68e2ivck
2a7d9sfcsnvl9owzau11l0jrq
oe2ukyl2cpguwqjm0kddg5tcx
4fom9yi9x5i125uvb96d29ext
tdwcwf0eze1lrvgherr4sxrs5
9hffla6qush85p7jhf89l56ek
Total reclaimed space: 679.3MB
bash
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos test 6bc2adb97476 25 hours ago 394MB
centos7 net-tools 0db0f584d14d 26 hours ago 418MB
busybox latest beae173ccac6 18 months ago 1.24MB
nginx latest 605c77e624dd 18 months ago 141MB
voltest latest 3af6982c965f 18 months ago 141MB
redis latest 7614ae9453d1 19 months ago 113MB
mysql 5.7 c20987f18b13 19 months ago 448MB
centos 7.9.2009 eeb6ee3f44bd 22 months ago 204MB
progrium/consul latest 09ea64205e55 8 years ago 69.4MB
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
462ad2de000e bridge bridge local
c598e7da9321 host host local
36391f761fe6 none null local
15.docker create
创建一个新容器
它与run类似,但是它唯一的区别就是,create只创建容器不运行,但是docker run是创建容器并运行
格式:
bash
docker create [OPTIONS] IMAGE [COMMAND] [ARG...zz