docker 容器的基本管理
1 容器的管理
1.1 容器的创建
#docker [OPTIONS] COMMAND
docker creat -it centos:latest
#docker creat 命令新建的容器是处于停止状态 后期使用docker start启动
# 实际应用中一般是使用docker run
1.1 新建并启动容器
1.1.1 容器的生命周期
容器其实本质是Host宿主机的进程,操作系统对于进程的管理是基于进程的状态切换的,进程从创建到销毁可能经过的路径图可以称之为“生命周期”。因此也就不难想到,其实对容器的管理也应该有一套状态以及状态转移的条件,这就是Docker容器的生命周期
可以将镜像与容器的关系理解为类和对象/实例的关系。镜像保存在硬盘上,而运行着的容器是一个隔离的进程。
image-20201126195532861.png1.1.2 docker run 创建和启动容器的过程
- 检查本地是否存在指定的镜像,不存在就从公有仓库或者自己配置的私有镜像仓库下载
- 利用镜像创建一个容器,并在只读的镜像层外面挂载一层可读写层
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中
- 从网桥的地址池中配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被自动终止
Docker 容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出
对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。
我们以centos 镜像为例启动第一个容器
docekr run --name testdocker1 centos
查看启动的第testdocker1容器的状态
docker ps -a
image-20201128140017399.png
为什么 testdocker1 一启动就退出了?
dockerfile 在构建centos镜像时通过 CMD ["/bin/bash"] 指定了 通过此镜像启动容器默认运行的命令时是/bin/bash,所以以当容器启动执行/bin/bash,/bin/bash 应用程序一执行完成 退出,容器中没有一直执行的进程,也跟着退出了
/bin/bash 程序配合 -i参数 可以使 /bin/bash 程序一直处于 运行中,以交互式方式一直运行,此时容器也是一直运行着 exit 或者ctrl+c 终止/bin/bash 容器也会退出
docker run -it --name "testdocker" centos /bin/bash
#-i --interactive Keep STDIN open even if not attached
#-i 交互式 一直保持标准输入打开
#-t --tty 新开一个控制台连接
我们以nginx镜像为例再启动一个容器
docker run --name nginxtest1 nginx
#就像Linux系统启动一个前台进程一样,容器里也运行了一个前台程序
启动容器时 是执行的/docker-entrypoint.sh nginx -g 'daemon off;' nginx 默认是以后台模式运行的,后面加'daemon off;' 禁止nginx以后台模式运行,
我们不加'daemon off;' 运行一个nginx容器,看一下是什么情况
docker run --name nginxtest2 nginx /docker-entrypoint.sh nginx -g
#/docker-entrypoint.sh nginx -g 会覆盖Dockerfile中 CMD自定义的默认执行的 /entrypoint.sh nginx -g 'daemon off;'
image-20201128203138980.png
跟之前/bin/bash一样 nginx执行完成后,容器就退出了
制作镜像的Dokcerfile 中 CMD或者ENTRYPOINT 指令 定义了容器启动时容器执行的命令,即启动容器中的第一个进程,上面因为ginx /docker-entrypoint.sh nginx -g
CMD或者ENTRYPOINT 指令 不管是执行什么程序,一定要是一个工作在容器前台的守护进程,容器才可以启动后不会退出
要清楚两个概念
容器的前后台运行
docker run 通过镜像run起来的容器 可以比作是linux系统的一个运行起来的前台程序
docekr run -d --name test nginx
加-d 参数 启动容器 容器会后台运行
容器中的进程前后台运行
容器中至少有一个工作在前台的守护进程
1.1.3 启动一个交互式的容器
docker run -it --rm --name "testdocker" centos /bin/bash
#-i --interactive Keep STDIN open even if not attached 意思就是会把交互界面保留着
#-t --tty 新开一个控制台连接
#进入容器后exit 容器会退出
#--rm 容器停止 容器也会被自动删除
# 此方式 适用于测试,调试,一次性工具
1.1.4 启动一个守护式守护容器启动
docker run -d --rm --name "testdocker" centos /bin/bash
#-d detach 将应用程序剥离前台 进入后台运行
# 这里
#此方式 适用于 应用服务
1.2 容器的关闭,启动
docker container stop testdocker
docker container start testdocker
#-i 启动交互式容器
docker container start -i testdocker
1.3 进入容器的方法
1.3.1 attach
docker container attach testdocker
#使用attach 连接时 当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示,当某个窗口阻塞时候,其他窗口也无法执行操作了
1.3.2 exec
#exec 是通过子进程的方式
docker container exec -it testdocker /bin/bash
#这种进入容器的方式,是在运行的容器中启动了一个/bin/bash的进程
1.4 删除容器
#docker rm 只能删除已经处于终止或者退出状态的容器,不能删除还处于运行中的容器
docker rm testdocker
#-f 参数删除可以删除正在运行的容器, docker会先发送一个SIGKILL信号给容器,终止其中的应用,之后强行删除
docker rm -f testdocker
#删除所有容器(自己测试用生产环境切勿使用)
docker rm -f `docker ps -qa`
#-l 移除容器间的网络连接,而非容器本身
#-v 删除与容器关联的卷
1.5 容器的查看
docker container ls -a
docker ps -a
#-a 是查看详细信息
docker ps -qa #查看所有容器的id
docker inspect dockertest #查看容器的 详细信息