当前正在运行的容器:
docker container ps
当前所有的容器, 包括已经停止的容器
docker container ps -a
docker image 后面可以跟上一些参数进行镜像的管理
docker image --help
列出当前系统上的镜像
docker image ls
删除一个image
docker image rm [后面跟上image的name]
比如
docker image rm docker/getting-started
镜像 vs 容器
镜像:是一个只读文件,包含文件系统,源码,库文件,依赖,工具等 一些运行application(应用程序)所需要的文件
可以理解成一个模板
docker image 具有分层的概念 。。。
容器:一个运行中的docker image
实质上是复制image并在image最上层加上一层read_write层, 称之为container layer (容器层)
container layer 层是可读可写,写需求 log, 修改image文件等, 创建container时添加
基于同一个image可以创建多个container
image 的获取
1. 自己制作
2. docker hub 拉取
创建一个容器
docker container run nginx
unable to find image‘nginx:latest’ locally 找不到这个镜像,会从docker hub上去拉取镜像
…
列出当前正在运行的container
docker container ls
停止一个容器
docker container stop [name|id] 后面可以跟上容器的名字或者id, id可以只写前几位
当前所创建的正在运行或者已经退出的所有容器
docker container ps -a
docker container ls -a
ls 和 ps 的区别
ls: list container
ps:最早期的写法,沿用至今
创建一个container
现在: docker container run nginx
早期: docker run nginx
查看container在后台的执行
1. docker container ls
2. docert ps
docker ps -a
docker container ps -a
stop:
docker container stop [id|name]
docker stop [id|name]
删除一个容器:
docker container rm [id]
docker rm [id]
container的基本操作,大部分都可以吧container省略掉,直接使用后面的操作, 建议使用完整的命令,这样比较清晰的知道是在对谁操作。
停止容器后面可以跟多个id,表示删除多个容器
docker container stop [id1,id2,id3,id4...]
列出所有container的id, 只列id
docker container ps -aq
批量停止:可以将列出的id 传递给stop
docker container stop $(docker container ps -aq)
批量删除:可以将列出的id 传递给rm
docker container rm $(docker container ps -aq)
停止删除所有的容器:可以将列出的id 传递给rm
docker container rm -f $(docker container ls -aq)
不能删除一个正在运行的程序
可以强制删除
eg:
docker container rm id -f
容器的两种模式:
1.attached
-p 80:80 将容器内部的80端口映射到外部
docker container run -p 80:80 nginx
在前台运行程序
当我们访问web服务器的时候打印的log可以在终端看到
windows:
chrl + c 的时候 ctrl+c 的信号并不会传递到nginx容器, 当前容器不会被杀掉
linux & mac:
chrl + c 的时候 信号会传递到container, 当前容器会退出
通过这种模式在前台执行叫做attached的模式
attached: 会把容器输入输出的结果attached到本地的输入输出上去, 本地的输入输出也会直接反映到nginx的容器内部
windows 的 attached 模式并不是完整的attached, 他只是把log等命令打印出来了而已
2.detached
detached: 让容器在后台执行
-d: 代表 detached 模式
docker run -d -p 80:80 nginx
这次并没有任何nginx日志的输出,只返回了container的id值
转回attached模式, 参数跟上container的名字 或者 id 就可以attacher到对应的container里面了, 现在就可以打印log了
docker attach [containername | id]
因为此时是attached模式 所以此时ctrl+c 会把此命令传递到容器内
detached模式查看log:
后面传递id 查看对应id的log
docker container logs [id]
动态的跟踪log
docker container logs -f [id]
一般情况下不推荐使用attached模式
容器的交互式模式:
docker container run -d ubuntu 后面跟上需要执行的命令
-it: 交互式的模式
sh: 交互式的命令行
docker container run -it ubuntu sh
此时会进入一个shell, 这个shell就是当前所创建容器的shell , 处在一个交互式的模式
如果此时exit退出, 那么创建的ubuntu 容器也就退出了, 因为command结束了
在detached模式下运行的容器进入交互式模式:
docker exec -it [name|id] sh
此时exit退出, 只是退出当前shell , 不会退出容器
eg:
docker container run -it busybox sh
容器和虚拟机的区别:
容器不是迷你的虚拟机
容器其实就是进程
容器中的进程被隔离和限制了对cpu内存等资源的访问
当进程停止后,容器就退出了
eg:
docker container run -d nginx
docker container ps
结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9799834daf7 nginx "/docker-entrypoint.…" 11 seconds ago Up 9 seconds 80/tcp
对于nginx来讲,他就是运行了COMMAND项,也就是运行了一个/docker-entrypoint的脚本
显示容器运行了哪些进程
docker container top [id|name]
结果:
UID PID PPID C STIME TTY TIME CMD
root 26676 26657 0 11:33 ? 00:00:00 nginx: master process nginx -g daemon off;
101 26725 26676 0 11:33 ? 00:00:00 nginx: worker process
可以看出worker的父进程是master
在linux中查看进程 ps aux | grep nginx
可以看出 nginx内部创建的两个进程实际上就是linux创建的两个进程
pstree -halps 26725 可以看出依赖关系
systemd,1 --system --deserialize 22
└─containerd-shim,26657 -namespace moby -id b9799834daf70f7aa2c9ffdf5c10e22931f08daba4a9a30036cc93157e3b1c23 -address /run/containerd/containerd.sock
└─nginx,26676
└─nginx,26725
containerd-shim 是创建container 的进程
容器内部看到的进程id实际上与linux的进程id是不一样的, 虽然这里查看是一样的,这个涉及到容器的命名空间的隔离映射, 后面填坑!!!
eg:
docker container rm -f b97
docker container run -it busybox sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 sh
7 root 0:00 ps
在shell中可以看出 PID 是1 , 在外部查看 docker container top [name|pid] 可以看出结果不同
创建一个容器的时候 系统背后发生了什么?
eg:
docker container -d --publish 80:80 --name webhost nginx
- 在本地查找是否有nginx这个image镜像,但是没有发现
- 如果1未查找到则 去远程的image registry查找ngixn镜像(默认的registry是docker hub)
- 下载最新版本的nginx镜像(nginx:lastest默认)
- 基于nginx镜像来创建一个新的容器,并且准备运行
- docker engine 分配给这个容器一个虚拟ip地址
- 在宿主机上打开80端口并把容器的80端口转发到宿主机上
- 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)