程序员

docker 容器的基本管理

2020-11-29  本文已影响0人  相信奇迹德人

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.png

1.1.2 docker run 创建和启动容器的过程

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库或者自己配置的私有镜像仓库下载
  2. 利用镜像创建一个容器,并在只读的镜像层外面挂载一层可读写层
  3. 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中
  4. 从网桥的地址池中配置一个IP地址给容器
  5. 执行用户指定的应用程序
  6. 执行完毕后容器被自动终止

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 #查看容器的 详细信息
上一篇下一篇

猜你喜欢

热点阅读