Docker 与 K8S学习笔记(五)—— 容器的操作(上篇)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 上一篇我们介绍了Dockerfile的基本编写方法,这一节我们来看看Docker容器的常用操作。 一、容器的运行方式 容器有两种运行方式,即daemon形式运行与非daemon形式运行,通俗地讲就是长期运行和短暂运行,当我们的容器作为对外服务的时候需要采用damon形式运行,当我们的容器仅仅作为一个

Docker 与 K8S学习笔记(五)—— 容器的操作(上篇)


上一篇我们介绍了Dockerfile的基本编写方法,这一节我们来看看Docker容器的常用操作。


一、容器的运行方式


容器有两种运行方式,即daemon形式运行与非daemon形式运行,通俗地讲就是长期运行和短暂运行,当我们的容器作为对外服务的时候需要采用damon形式运行,当我们的容器仅仅作为一个临时的工作环境那么使用非daemon形式运行是比较恰当的。


首先先来看看以非daemon形式如何运行容器,比我们启动一个容器然后执行ls -a命令:


$ sudo docker run ubuntu:18.04 ls -a
.
..
.dockerenv
bin
boot
dev
etc
home
lib
......


此时我们看看容器状态,我们可以发现此时容器已经退出了,它的状态是Exited。


$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS                      PORTS     NAMES
01932bada339   ubuntu:18.04   "ls -a"   45 seconds ago   Exited (0) 44 seconds ago             zen_albattani


很显然这种“一闪而过”的容器运行方式往往不能满足我们部署服务的需求,接下来我们看看如何以daemon形式运行容器。我们首先要明确一点:容器的生命周期依赖于容器启动时执行的命令,只要该命令不结束,容器就不会退出理解了这个原理,那我们接下来让容器执行top命令验证一下:


$ sudo docker run ubuntu:18.04 top -b
top - 14:32:01 up  5:09,  0 users,  load average: 0.01, 0.03, 0.00
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.6 us,  0.6 sy,  0.1 ni, 98.6 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4015800 total,   967180 free,   296536 used,  2752084 buff/cache
KiB Swap:  4015100 total,  4015088 free,       12 used.  3426824 avail Mem
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
     1 root      20   0   36496   2992   2644 R   0.0  0.1   0:00.03 top


由于当前终端不会退出,所以另起一个终端通过docker ps -a看下容器状态,可见容器仍处于运行状态:


$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND    CREATED         STATUS                     PORTS     NAMES
f0adeca308f6   ubuntu:18.04   "top -b"   2 minutes ago   Up 2 minutes                         vigilant_wilbur
01932bada339   ubuntu:18.04   "ls -a"    7 minutes ago   Exited (0) 7 minutes ago             zen_albattani


上面这种方式虽然让容器长期运行,但大家会发现这种方式存在一个确定,那就是他会占用一个终端,因此我们可以通过-d参数以后台方式启动容器:


$ sudo docker run -d ubuntu:18.04 top -b
82b049e20195fcbbd0f8a69fb5d11b2a70ad408f2324a750446acae5a269da7f


这条命令执行后返回了一条字符串,这条字符串就是所启动容器的ID。通过此ID,我们可以对容器进行一系列的操作。


二、如何进入容器


我们在实际工作中,往往需要进入到容器内部做一些工作,比如查看日志、调试或启动其它进程等,进入容器有两种方式:attach和exec。接下来分别对这两种方式进行讲解。


1、attach方式


attach会让我们进入到容器启动命令的终端,这就意味着我们通过此命令进入容器后是能看到容器当前执行的命令的输出,如果要退出容器使用ctrl + p和ctrl + q即可,如果使用ctrl + c有时会退出容器。我们就以刚才后台启动的容器进行演示,当我们attach此容器时,我们便能看到top命令的输出:


$ sudo docker attach 82b049e20195fcbbd0f8a69fb5d11b2a70ad408f2324a750446acae5a269da7f
top - 14:46:37 up  5:24,  0 users,  load average: 0.00, 0.00, 0.00
Tasks:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4015800 total,   962780 free,   297956 used,  2755064 buff/cache
KiB Swap:  4015100 total,  4015088 free,       12 used.  3426364 avail Mem
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
     1 root      20   0   36496   3028   2672 R   0.0  0.1   0:00.18 top


这个时候细心的你一定发现,此时通过ctrl+p和ctrl+q无法退出容器,这是为什么呢?当启动容器时没有指定-t -i参数时,attach容器后,执行ctrl+p,ctrl+q是无法退出当前容器的


2、exec方式


exec方式可以是我们进入到对应容器中,我们可以像操作linux服务器一样操作容器,如果要退出容器直接使用exit命令即可。


$ sudo docker exec -it 82b049e20195fcbbd0f8a69fb5d11b2a70ad408f2324a750446acae5a269da7f bash
root@82b049e20195:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


这里要注意,我们一定要带上-it参数,这样才能以交互模式打开终端。大家会注意到root@后面跟了一串字符串,这个其实是容器的短ID,我们执行exec时使用的是容器的长ID,对于同一个容器,使用长ID或短ID都可以使我们对于容器进行一系列操作。


3、attach与exec方式对比


  • attach直接进入容器启动命令的终端,不会启动新的进程;
  • exec则在容器中打开新的终端,并可以启动新的进程;
  • 如果想直接在容器中查看启动命令的输出那就用attach,其他情况使用exec。


分类: 容器技术

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
15天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
152 77
|
2天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
19 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
1月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
26天前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
46 1
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
26天前
|
Kubernetes 开发者 Docker
Docker与Kubernetes的协同工作
Docker与Kubernetes的协同工作
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
23天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
8天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
26 3
实战~如何组织一个多容器项目docker-compose
|
17天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
59 3

相关产品

  • 容器服务Kubernetes版