赞
踩
通俗地讲,容器
是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有 初建、运行、停止、暂停 和 删除 五种状态。
虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。
容器的生活案例
镜像与容器就相当于同样是开发商提供的毛坯房,但是两家人装修出来的完全不一样。
或者我们都学习了 Java 或者 C++之类的面向对象的语言,可以理解为镜像为基础类,容器是实例化出来的一个个对象,没有用户需要的不一样,里面的内容也就不一样了。
镜像是静态的文件,并不能提供服务,就像我拿了个 Linux 或者 Windows 的光盘一样,只有安装到主机里面运行起来才能对外提供服务,我们才能使用。
虚拟化和容器化的最主要目的就是资源隔离,随着资源隔离的实现逐渐也带来了更大的收益。
「这段代码在我机器上没问题啊」
这类问题。容器的生命周期是容器可能处于的状态。
各生命周期之间的转换关系如图所示:
docker create
: 创建容器后,不立即启动运行,容器进入初建状态;docker run
: 创建容器,并立即启动运行,进入运行状态;docker start
: 容器转为运行状态;docker stop
: 容器将转入停止状态;docker kill
: 容器在故障(死机)时,执行 kill(断电),容器转入停止状态,这种操作容易丢失数据,除非必要,否则不建议使用;docker restart
: 重启容器,容器转入运行状态;docker pause
: 容器进入暂停状态;docker unpause
: 取消暂停状态,容器进入运行状态;docker rm
: 删除容器,容器转入删除状态。killed by out-of-memory(因内存不足被终止)
:宿主机内存被耗尽,也被称为 OOM:非计划终止 这时需要杀死最吃内存的容器container process exitde(异常终止)
:出现容器被终止后,将进入 Should restart?选择操作:
Docker 在处理 OOM
事件时分为三种情况
--oom-kill-disable
来禁用 OOM-Killer。使用此参数时,仍需要注意,如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器继续分配资源,此时容器将处于 hung 状态。只需要将最坏的情况封闭在一定范围之内,而不至于蔓延出去。每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。运行的容器是因为 Init 进程在运行,如果一个子进程因为某种原因造成了退出,那么其父进程也会同步退出,直至 Init 进程也退出。当 Init 进程退出时,也就代表着此容器被关闭。 ocker 目前没有办法知道此时的进程退出属于正常退出还是异常退出。当出现容器关闭情况时, Docker Daemon 会尝试再次重新将此容器由 Stopped 状态转为 Running状态。只有设置了–restart 参数的容器, Docker Daemon 才会去尝试启动,否则容器会保持停止状态。
Docker“剥夺”了此容器的 CPU 资源。而其他资源,如 Memory 资源、Network 资源等还保留未动。如此一来,失去了 CPU 资源的进程,是不会被主机内核系统所调度的,所以此容器就处于“冰封”状态。
容器命令清单
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container create
关键参数
样例
docker create --name mywebsite1 -p 80:80 nginx:1.24.0
docker create --name mywebsite2 -p 8050:80 nginx:1.24.0
docker logs [OPTIONS] CONTAINER
docker container logs
关键参数
样例
docker logs mywebsite3
docker logs -f mywebsite3
docker logs -f --since="2024-02-05" mywebsite3
docker logs -f -n 5 mywebsite3
docker attach [OPTIONS] CONTAINER
docker container attach
关键参数
样例
docker attach mywebsite3
这里我们可以看到如果此时使用ctrl+c会把容器杀死。
docker attach --sig-proxy=false mywebsite3
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker container exec
关键参数
样例
docker exec -it mywebsite3 bash
docker exec -it mywebsite3 nginx -v
docker exec -it -e mynginx=cjl mywebsite3 bash
docker exec -it -u nginx mywebsite3 nginx -v
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker container start
docker start mywebsite3
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker container stop
docker stop mywebsite3
docker restart [OPTIONS] CONTAINER [CONTAINER...]
docker container restart
docker restart mywebsite3
docker restart -s 9 mywebsite3
docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker container kill
关键参数
注意事项
样例
docker kill mywebsite3
docker top CONTAINER [ps OPTIONS]
docker container top
docker top 642fd46da1b7
docker stats [OPTIONS] [CONTAINER...]
docker container stats
关键参数
返回报文
样例
docker stats
#监控某一个容器
docker stats mywebsite3
#查看所有容器(包括已经停止的)
docker stats -a
docker stats --format json
docker stats --no-stream
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
docker container inspect 642fd46da1b7
docker container inspect -f json mywebsite3
docker container inspect -s mywebsite3
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
docker container port
docker port mywebsite3
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker container cp
docker cp mywebsite3:/usr/share/nginx/html/index.html .
修改文件并重新拷贝到容器中
docker cp ./index.html mywebsite3:/usr/share/nginx/html/
docker diff CONTAINER
docker diff mywebsite3
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit mywebsite3forcommit mywebsite3:v1.0
当我们修改容器中的文件然后再次制作一个镜像时,发现新增加的文件是存在的。
docker commit -a 'cjl' -m 'create by cjl' -p mywebsite3forcommit mywebsite3:v3.0
下面演示最后一个选项:-c
选项
docker commit -a 'cjl' -m 'create by cjl' -c 'CMD ["tail","-f","/etc/hosts"]' -p mywebsite3forcommit mywebsite3:v4.0
docker pause CONTAINER [CONTAINER...]
docker container pause
docker pause mywebsite4
docker unpause CONTAINER [CONTAINER...]
docker container unpause
docker unpause mywebsite5 mywebsite6
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker container rm
docker rm mywebsite7
docker rm -f mywebsite7
docker export [OPTIONS] CONTAINER
docker container export
关键参数
样例
docker export -o mywebsite4.tar mywebsite4
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker image import
docker import mywebsite4.tar mywebsite4:v1.0
这里我们需要注意的是,使用docker import命令导出的镜像会丢失原始镜像中的数据
docker import -c 'CMD ["nginx","-g","daemon off;"]' -m "create by cjl" mywebsite4.tar mywebsite4:v2.0
docker wait CONTAINER [CONTAINER...]
docker container wait
docker wait mywebsite5
docker rename CONTAINER NEW_NAME
docker container rename
docker rename mywebsite6 mywebsite6.1
docker container prune [OPTIONS]
docker container prune
docker update [OPTIONS] CONTAINER [CONTAINER...]
docker container update
docker update -m 500m mywebsite4
上面发生报错是因为docker 默认没有启用memory-swap交换内存,直接设置了内存问题会出问题,也就是说宿主 swap 支持使用多少则容器即可使用多少。因此设置内存的同时必须设置–memory-swap。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。