Docker 应用实践-容器篇

2023-03-08 21:28:33 浏览数 (2)

在 Docker 镜像篇中,我们了解到 Docker 镜像类似于模板,那么 Docker 容器就相当于从模板复制过来运行时的实例,Docker 容器可以被创建、复制、暂停和删除等。 每一个 Docker 容器在运行时都是以镜像为基础层,并在镜像的基础上创建当前容器的存储层,容器存储层的生存周期与容器是一致的,因此当某一个容器删除后,该容器存储层的数据也会随之被删除掉。 按照 Docker 最佳实践的要求,Docker 容器是不应该向其存储层内写入数据的,Docker 容器存储层需保持无状态话。Docker 容器中的所有文件写入操作都应该使用数据卷或绑定到宿主机目录上,在这些位置的读写操作会跳过容器存储层,性能和稳定性也会更高 本篇内容主要介绍:关于 Docker 容器、Docker 命令应用实践

文章目录
  • 一、关于 Docker 容器
    • 1、对于 Docker 容器的理解
    • 2、虚拟机与容器
    • 3、容器生命周期

  • 二、Docker 命令应用实践
    • 1、容器查看
    • 2、容器创建 – docker create
    • 3、容器启动 – docker start
    • 4、容器创建并启动 – docker run
    • 5、docker run 与 docker create docker start
    • 6、容器暂停 – docker pause
    • 7、容器取消暂停 – docker unpause
    • 8、容器关闭 – docker stop
    • 9、容器终止 – docker kill
    • 10、docker stop和docker kill的区别
    • 11、容器重启 – docker restart
    • 12、容器删除 – docker container rm

一、关于 Docker 容器

1、对于 Docker 容器的理解

在 Docker 镜像篇中,我们了解到 Docker 镜像类似于模板,那么 Docker 容器就相当于从模板复制过来运行时的实例,Docker 容器可以被创建、复制、暂停和删除等。

每一个 Docker 容器在运行时都是以镜像为基础层,并在镜像的基础上创建当前容器的存储层,容器存储层的生存周期与容器是一致的,因此当某一个容器删除后,该容器存储层的数据也会随之被删除掉。

按照 Docker 最佳实践的要求,Docker 容器是不应该向其存储层内写入数据的,Docker 容器存储层需保持无状态话。Docker 容器中的所有文件写入操作都应该使用数据卷或绑定到宿主机目录上,在这些位置的读写操作会跳过容器存储层,性能和稳定性也会更高

2、虚拟机与容器

虚拟机(VM)是物理硬件的抽象,它将一台服务器变成很多服务器。 虚拟机管理程序允许多个 VM 在单台计算机上运行。 每个 VM 均包含操作系统,应用程序以及必要的二进制文件和库的完整副本-占用数十 GB。 VM也 可能启动缓慢。

容器是应用程序层的抽象,将代码和依赖项打包在一起。 多个容器可以在同一台计算机上运行,并与其他容器共享其 OS 内核,每个容器在用户空间中作为隔离的进程运行。 容器占用的空间少于VM(容器映像的大小通常为几十 MB),可以处理更多的应用程序,并且需要的 VM 和操作系统更少。

虚拟化 vs 容器化:

  • 速度:说到速度,容器是明显的赢家。它们被设计用来大大减少软件应用程序的加载和运行时间。由于操作系统已经启动和运行,应用程序的启动将没有明显的延迟。这种没有延迟的情况对于软件开发团队来说是一个很好的解决方案,因为它将在应用测试周期中节省时间。相反,虚拟机需要充足的时间来完成整个操作系统的启动过程,导致虚拟机的启动时间要比容器长得多。
  • 资源:由于虚拟服务器运行独立的操作系统,每一个系统调用都要经过虚拟化层,所以它们往往是资源密集型的。这对于内存来说尤其如此,因为即使不处理用户请求,虚拟机也会消耗内存。由于CPU虚拟化的成本相对较低,所以虚拟机的处理器成本往往较低。当涉及到容器时,它们会快速启动,与虚拟机相比,它们的内存消耗保持在较低水平。容器也减少了开销,因为它们可以不使用管理程序而运作。
  • 安全性和隔离性:虚拟化在安全和隔离方面获胜。就其本质而言,虚拟机保持独立和相互隔离。一个被感染的虚拟机不会影响另一个,而且每个虚拟机都可以实现自己的安全协议。由于容器只在进程层面隔离数据和应用程序,它们提供的安全环境较差,并依赖于主机系统的安全协议。
  • 可移植性和应用程序共享:由于容器镜像比虚拟机小得多,它们更容易转移,并节省主机文件系统的空间。另一方面,虚拟机需要复制整个操作系统、主机内核、系统库、配置文件和任何必要的文件目录。这大大增加了映像的大小,使虚拟机在共享或转移时面临挑战。容器图像可以通过几种方式共享,互联网上有各种应用共享中心。虚拟机图像不能利用这些集中的中心。转移它们需要把它们上传到另一台服务器上。
  • 操作系统要求:当一个企业运行多个需要专用操作系统的应用程序时,虚拟机是最好的。但是,如果大多数应用程序有相同的操作系统要求,容器化将是一个更实用的解决方案。
  • 应用程序的生命周期:容器对于短期的应用需求很有效。它们可以快速设置,可移植,而且启动时间比虚拟机快得多。它们的局限性来自于缺乏一个专门的操作系统、处理和存储资源。当你的主要目标是优化你的服务器资源的效率时,使用容器。但是,如果你计划运行需要长时间运行的应用程序,虚拟机是一个更好的选择。虚拟机更适合处理延长的运行时间,因为它们在虚拟化环境中运行,更加强大和通用。
3、容器生命周期

对于一个 Docker 容器可以具有以下状态:

  • created:初建状态
  • running:运行状态
  • exited:停止状态
  • paused: 暂停状态
  • deleted:删除状态

二、Docker 命令应用实践

1、容器查看
代码语言:javascript复制
# 查看机器上正在运行的所有容器
docker ps

# 查看宿主机上所有的容器(包括停止的)
docker ps -a

# 查看最后一次运行的容器
docker ps –l

# 查看停止的容器
docker ps -f status=exited
2、容器创建 – docker create
代码语言:javascript复制
# 作用:
	利用镜像创建出一个Created 状态的待启动容器
    
# 命令格式:
	docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
    
# 命令参数(OPTIONS):查看更多
	-t, --tty           		分配一个伪TTY,也就是分配虚拟终端bash
    -i, --interactive    	    以交互模式运行容器,加入-t-i这两个参数,容器启动后会直接进入容器。分配一个伪终端
    --name          		    为容器起名,如果没有指定将会随机产生一个名称
    
# 命令参数(COMMANDARG):
	COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
	ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
    
# 命令演示:
# ps -A 提前预设一个命令,容器一启动就会执行
# 当容器启动-->执行ps -A,命令一执行完,容器就停止了,因为它不是可以夯住的命令
docker create --name test-container centos ps -A
docker create -ti --name test-container2 centos /bin/bash


# 我们拉的centous镜像是纯净版,里面没有sshd服务端,如果启了一个centos7的容器,宿主机不能直接用ssh连接容器(进到容器做交互)
# 要么装一个sshd服务端,要么下载第三方集成了sshd服务端的镜像。
# 这里用的-t,并不是真正的进到容器,只是分配一个伪终端,相当于启一个bash窗口,和宿主机做交互
3、容器启动 – docker start
代码语言:javascript复制
# 作用:
	将一个或多个处于创建状态或关闭状态的容器启动起来
    
# 命令格式:
	docker start [OPTIONS] CONTAINER [CONTAINER...]
    
# 命令参数(OPTIONS):
	-a, --attach		将当前shell的 STDOUT/STDERR 连接到容器上
	-i, --interactive	将当前shell的 STDIN连接到容器上	
    
# 命令演示:
docker ps -a
docker start -a 65ebc
docker start test-container2
4、容器创建并启动 – docker run
代码语言:javascript复制
# 作用:
	利用镜像创建并启动一个容器
    
# 命令格式:
	docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
# 命令参数(OPTIONS):查看更多
	-t, --tty           分配一个伪TTY,也就是分配虚拟终端,表示容器启动后会进入其命令行
    -i, --interactive   以交互模式运行容器,加入-t-i这两个参数,容器启动后会直接进入容器。分配一个伪终端
        --name          为容器起名,如果没有指定将会随机产生一个名称
	-d, --detach		创建一个守护进程在后台运行容器并打印出容器ID,不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进入容器
	--rm			    当容器退出运行后,自动删除容器
    
# 命令参数(COMMANDARG):
	COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
	ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
    
# 命令演示:
# 注意,docker run 镜像, 如果本地没有该镜像,会先pull最新版镜像,再执行docker run
docker run --name test1 centos:centos7                # 创建并启动test1,启动后容器就停止了
docker run --name test2 centos:centos7 /bin/bash      # 创建并启动test2,启动后容器就停止了
docker run -ti --name test3 centos:centos7            # 创建并启动test3,启动后运行/bin/bash交互(根路径下),exit退出后,容器就停止了 
docker run -ti --name test4 centos:centos7 /bin/bash  # 创建并启动test4,启动后运行/bin/bash交互(根路径下),exit退出后,容器就停止了 
docker run -ti --name test5 redis            # 创建并启动test5,启动后进入到redis前端,exit退出后,容器就停止了 
docker run -ti --name test6 redis /bin/bash  # 创建并启动test6,启动后运行/bin/bash交互(/data路径下),exit退出后,容器就停止了

docker run -d --name t1 centos:centos7    # 创建并启动t1,启动后容器就停止了
docker run -di --name t2 centos:centos7  # 创建并启动t2,启动后容器维持后台运行
docker run -d --name t3 redis             # 创建并启动t3,启动后容器维持后台运行
docker run -dti --name t4 redis           # 创建并启动t4,启动后容器维持后台运行
5、docker run 与 docker create docker start
代码语言:javascript复制
docker run    相当于 docker create   docker start –a      前台模式
docker run -d 相当于 docker create   docker start          后台模式
6、容器暂停 – docker pause
代码语言:javascript复制
# 作用:
	暂停一个或多个处于运行状态的容器
    
# 命令格式:
	docker pause CONTAINER [CONTAINER...]
    
# 命令参数(OPTIONS):
	无
    
# 命令演示
docker ps -a
docker pause test-container2
docker ps -a # 容器是Pause状态
7、容器取消暂停 – docker unpause
代码语言:javascript复制
# 作用:
	取消一个或多个处于暂停状态的容器,恢复运行
    
# 命令格式:
	docker unpause CONTAINER [CONTAINER...]
    
# 命令参数(OPTIONS):
	无	
    
# 命令演示:
docker unpause test-container2
docker ps -a # 处于运行状态
8、容器关闭 – docker stop
代码语言:javascript复制
# 作用:
	关闭一个或多个处于暂停状态或者运行状态的容器
    
# 命令格式:
	docker stop [OPTIONS] CONTAINER [CONTAINER...]
    
# 命令参数(OPTIONS):
	-t, --time int   关闭前,等待的时间,单位秒(默认 10s)	
    
# 命令演示:
docker stop -t 1 容器id
9、容器终止 – docker kill
代码语言:javascript复制
# 作用:
	强制并立即关闭一个或多个处于暂停状态或者运行状态的容器
    
# 命令格式:
	docker kill [OPTIONS] CONTAINER [CONTAINER...]
    
# 命令参数(OPTIONS):
	-s, --signal string   	指定发送给容器的关闭信号 (默认“KILL”信号)	
    
# 命令演示:
docker kill test-container2
10、docker stop和docker kill的区别
代码语言:javascript复制
# 一 前提知识点:
    1 Linux其中两种终止进程的信号是:SIGTERM和SIGKILL
    2 SIGKILL信号:无条件终止进程信号。
    进程接收到该信号会立即终止,不进行清理和暂存工作。
    该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。
    3  SIGTERM信号:程序终结信号,可以由kill命令产生。
    与SIGKILL不同的是,SIGTERM信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。

# 二 docker stop 会先发出SIGTERM信号给进程,告诉进程即将会被关闭。在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器。
# 三 docker kill 直接发出SIGKILL信号关闭容器。但也可以通过-s参数修改发出的信号。

# 四 因此会发现在docker stop的等过过程中,如果终止docker stop的执行,容器最终没有被关闭。而docker kill几乎是立刻发生,无法撤销。

# 五 此外还有些异常原因也会导致容器被关闭,比如docker daemon重启、容器内部进程运行发生错误等等“异常原因”。
11、容器重启 – docker restart
代码语言:javascript复制
# 作用:
	重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器
	该命令相当于stop和start命令的结合
    
# 命令格式:
	docker restart [OPTIONS] CONTAINER [CONTAINER...]
    
# 命令参数(OPTIONS):
	 -t, --time int   	重启前,等待的时间,单位秒(默认 10s) 
				        实则是关闭前等待的时间
12、容器删除 – docker container rm
代码语言:javascript复制
# 作用:
	删除一个或多个容器
    
# 命令格式:
	docker container rm [OPTIONS] CONTAINER [CONTAINER...]
      或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
        
# 命令参数(OPTIONS):
	 -f, --force     		强行删除容器(会使用 SIGKILL信号) 
	 -v, --volumes   		同时删除绑定在容器上的数据卷	
        
# 命令演示
docker rm -f 容器id 容器名
docker rm 8379 7380 1023      # 可以放多个id,批量删除
docker rm `docker ps -a -q`   # 删除所有容器

0 人点赞