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。
Docker 与 K8S学习笔记(五)—— 容器的操作(上篇)的更多相关文章
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- Docker 与 K8S学习笔记(五)—— 容器的操作(下篇)
上一篇我们学习了容器的启动和常用的进入容器的方式,今天我们来看看如何控制容器起停以及容器删除操作. 一.stop.kill.start和restart stop.kill命令都可以停止运行的容器,二者 ...
- Docker 与 K8S学习笔记(七)—— 容器的网络
本节我们来看看Docker网络,我们这里主要讨论单机docker上的网络.当docker安装后,会自动在服务器中创建三种网络:none.host和bridge,接下来我们分别了解下这三种网络: $ s ...
- Docker 与 K8S学习笔记(三)—— 镜像的使用
前面的文章介绍过镜像的三种获取方式: 下载并使用别人创建好的镜像: 在现有镜像上创建新的镜像: 从无到有创建镜像. 本文主要介绍前两种. 一.下载镜像 在Docker Hub上有大量优质镜像可以使用, ...
- Docker 与 K8S学习笔记(九)—— 容器间通信
容器之间可通过IP.Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下. 一.IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使 ...
- Docker 与 K8S学习笔记(二)—— 容器核心知识梳理
本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...
- Docker 与 K8S学习笔记(十)—— 容器的端口映射
我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...
- Docker 与 K8S学习笔记(八)—— 自定义容器网络
我们在上一篇中介绍了Docker中三种网络,none.host和bridge,除了这三种网络,Docker还允许我们创建自定义网络,当我们要创建自定义网络时,Docker提供了三种网络驱动供我们选择: ...
- Docker 与 K8S学习笔记(六)—— 容器的资源限制
我们在启动Docker容器时,默认情况下容器所使用的资源是没有限制的,这样就会存在部分特别耗资源的容器会占用大量系统资源,从而导致其他容器甚至整个服务器性能降低,为此,Docker提供了一系列参数方便 ...
随机推荐
- Spring Cloud 2021.0.0 正式发布,第一个支持Spring Boot 2.6的版本!
美国时间12月2日,Spring Cloud 正式发布了第一个支持 Spring Boot 2.6 的版本,版本号为:2021.0.0,codename 为 Jubilee. 在了解具体更新内容之前, ...
- 3 - 简单了解一下springboot中的yml语法 和 使用yml赋值
1.简单了解yml语法 2.使用yml给实体类赋值 准备工作:导入依赖 <!-- 这个jar包就是为了实体类中使用@ConfigurationProperties(prefix = " ...
- 巩固javaweb的第二十五天
常用的验证 1. 非空验证 // 验证是否是空 function isNull(str) { if(str.length==0) return true; else return false; } 2 ...
- ASP.NET Core中使用固定窗口限流
算法原理 固定窗口算法又称计数器算法,是一种简单的限流算法.在单位时间内设定一个阈值和一个计数值,每收到一个请求则计数值加一,如果计数值超过阈值则触发限流,如果达不到则请求正常处理,进入下一个单位时间 ...
- Spark(十二)【SparkSql中数据读取和保存】
一. 读取和保存说明 SparkSQL提供了通用的保存数据和数据加载的方式,还提供了专用的方式 读取:通用和专用 保存 保存有四种模式: 默认: error : 输出目录存在就报错 append: 向 ...
- Linux基础命令---htdigest建立和更新apache服务器摘要
htdigest htdigest指令用来建立和更新apache服务器用于摘要认证的存放用户认证信息的文件. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS. 1.语法 ...
- Tomcat(2):配置Tomcat
1,打开IDEA创建一个项目 2,配置Tomcat服务器 3,运行 5,成功 t t
- 数据库系统相关SQL
杀进程 查出所有被锁住的表 select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY, c.USERNAME LOGINI ...
- 用户信息系统_serviceImpl
package com.hopetesting.service.impl;import com.hopetesting.dao.UserDao;import com.hopetesting.dao.i ...
- ssm+mysql+jsp打造在线考试系统WeKnow-学生端
一.登陆模块 前台提交账号和密码传到后台处理控制层 1.1 首先是控制器 @RequestMapping(value="/studentLogin", method=Request ...