docker(1) 基础命令

本文详细介绍了Docker容器的基础操作,包括镜像管理、创建、运行、停止、删除容器,以及镜像与容器的区别,还讨论了attached和detached模式,以及容器与虚拟机的差异。
摘要由CSDN通过智能技术生成

当前正在运行的容器:

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
  1. 在本地查找是否有nginx这个image镜像,但是没有发现
  2. 如果1未查找到则 去远程的image registry查找ngixn镜像(默认的registry是docker hub)
  3. 下载最新版本的nginx镜像(nginx:lastest默认)
  4. 基于nginx镜像来创建一个新的容器,并且准备运行
  5. docker engine 分配给这个容器一个虚拟ip地址
  6. 在宿主机上打开80端口并把容器的80端口转发到宿主机上
  7. 启动容器,运行指定的命令(这里是一个shell脚本去启动nginx)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值