原文地址:http://blog.jboost.cn/docker-6.html

容器是Docker中的另一核心概念,在Docker中,应用的运行都是在容器内进行的,容器则基于镜像创建。前面已对Docker镜像做了基本介绍,本文对Docker容器管理的相关内容做一个梳理。

1. 启动容器

启动容器的命令格式如下

docker run [OPTIONS] IMAGE-NAME [COMMAND] [ARG...]

其中OPTIONS部分可指定容器运行的一些可选项,常用选项包括:

  • -d 将容器以后台进程(daemon)的形式运行
  • -p 指定容器内应用暴露端口与主机端口的映射,如 -p 8080:80 表示将容器内80端口映射到主机的8080端口(主机端口在前,容器端口在后)
  • -v 指定容器与主机的挂载目录映射,如 -v /var/log:/log 表示将容器的/log目录挂载到主机的/var/log目录(同样主机目录在前,容器目录在后),后续对容器的/log写操作实际作用于主机的/var/log目录
  • -e 为容器设置环境变量
  • -t 为容器启动一个伪终端(pseudo-tty)
  • -i 让容器的标准输入保持打开,一般与 -t 配合使用,让容器启动后就打开一个可交互的命令行界面
  • -w 指定容器的工作目录

COMMAND [ARG..] 部分就是容器需要运行的应用进程启动命令与参数,如果镜像中有通过 CMD, 或 ENTRYPOINT 指定了容器启动程序,则可省略。另外可通过 –name 指定容器的名称,以及 –restart 来指定重启策略,–restart有三种取值,代表容器支持的三种不同的重启策略

取值 描述
always 除非被docker stop命令明确停止,否则一直尝试重启处于停止态的容器;如果Docker重启,也会自动启动容器
unless-stopped 与always的区别是,停止态的容器不在Docker重启的时候被重启
on-failed 在容器退出时返回值不为0的时候,重启容器;如果Docker重启,容器也会被启动,不管之前是否处于停止状态

以启动一个mysql数据库服务为例

docker run -d -p : --name mysql \
-v /home/devuser/apps/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
-v /home/devuser/apps/mysql/logs:/var/log/mysql \
-v /home/devuser/apps/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Passw0rd --restart=always mysql:5.7

上述命令启动了一个mysql容器服务,-d 表示以后台进程运行,执行命令后只返回一个容器ID,不会输出任何其它信息;-p 将容器暴露的端口3306映射到宿主机的3306端口,外部主机就可以通过宿主机IP与3306端口来访问mysql服务; –name 指定了容器名称为mysql; -v 将mysql的配置文件路径、日志路径、数据存储路径映射到了宿主机对应的路径目录;-e 设置了一个环节变量指定mysql root账号的密码;–restart 指定容器在异常退出时,包括Docker重启时,自动启动容器。

我们前面有提过,当我们执行CLI命令时,实际上是客户端(Docker Client)通过发送请求到Docker后台进程(Docker Daemon),由Docker后台进程来执行的,那么当我们执行上述docker run命令的时候,Docker后台进程具体都干了些啥呢?一般来说,包括如下几个操作步骤

  1. 检测本地是否存在指定的镜像,如果不存在,就从公共仓库下载
  2. 利用镜像创建一个容器,并启动它
  3. 分配一个文件系统,并在只读的镜像层上面挂载一层可读写层(容器存储层)
  4. 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
  5. 从地址池配置一个 ip 地址给容器
  6. 执行用户指定的应用程序
  7. 执行应用程序完毕后容器被终止

2. 管理已有容器

一般对已有容器的管理包括如下几个操作:

  1. 查看运行中的容器 docker ps 或 docker container ls
  2. 查看所有容器 docker ps -a 或 docker container ls -a
  3. 停止运行 docker stop xxx
  4. 开始停止状态的容器 docker start xxx
  5. 重启运行状态的容器 docker restart xxx
  6. 删除停止状态的容器 docker rm xxx
  7. 强制删除容器(包括运行状态中) docker rm -f xxx
  8. 删除所有停止状态的容器 docker container prune

其中xxx既可以是容器ID(短ID即可,只要与其它区分开来),也可以是容器名称。
docker rm之前必须要先docker stop将容器置为停止状态,而docker rm -f可以强制删除运行状态的容器,其背后是通过Linux/POSIX信号来实现的,docker rm -f命令直接发出SIGKILL信号,不会给容器内运行进程任何缓冲的时间,立即终止,而docker stop命令却是先发送SIGTERM信号,通知容器进程结束,会为进程预留一个清理并优雅停止的机会,如果一段时间后进程还没有终止,那么就会发送SIGKILL信号,来终止进程的运行。

我们也可以像镜像操作中一样,组合使用命令来更方便地操作,如强制删除所有容器(慎用)

docker rm -f $(docker ps -aq)

3. 进入容器

容器在运行时指定 -d 选项时, 是以后台进程的形式运行的,如果我们需要进入容器查看或操作,可以通过docker exec命令,docker exec命令的格式如下

docker exec [OPTIONS] container-id COMMAND

OPTIONS常用的一般是 -t, -i,意义跟在docker run选项中一样 —— 为容器启动一个伪终端(pseudo-tty),并保持标准输入打开,从而可以像Linux命令行一样进行交互, COMMAND一般为 bash

另外还有一个命令是docker attach xxx,其中xxx是容器ID,但推荐使用docker exec,因为docker attach中当执行exit退出容器时,容器也会随之终止,但docker exec则不会。

如果不进入容器,也可以通过docker logs xxx,xxx是容器ID,来查看容器的输出信息。

4. 导入导出容器

可以使用docker export命令将一个容器的快照进行导出,如

docker export xxx > mycontainer.tar

其中xxx是容器ID,可以通过docker ps -a查看,上述命令将容器的当前快照导出到了本地文件。

docker import命令则可以将一个容器快照文件导入为镜像,如

cat mycontainer.tar | docker import - test/myimage:v1.

也可以通过URL来导入,如

docker import http://test.com/testimage.tgz test/myimage2:v1.0

由此可见,我们获取镜像又多了一个来源——从已有容器快照文件导入。

5. 总结

本文对容器的一些基本操作进行了介绍,需要注意的是如之前所说,容器应以无状态的形式运行,所有产生的数据应该通过挂载数据卷的方式写入宿主机文件目录,避免容器销毁时造成数据丢失;尽量使用docker stop + docker rm的方式来替代docker rm -f,使容器内运行程序“优雅”地退出。有时候可能遇到这样的场景,容器创建运行后,我们需要对运行的一些参数进行更新或添加,这时候该怎么操作。后文会对该场景进行介绍,欢迎关注。

我的个人博客地址:http://blog.jboost.cn
我的微信公众号:jboost-ksxy (一个不只有技术干货的公众号,欢迎关注,及时获取更新内容)
———————————————————————————————————————————————————————————————

Docker笔记(六):容器管理的更多相关文章

  1. Docker背后的容器管理——Libcontainer深度解析

    Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...

  2. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  3. Docker笔记--操作容器命令

    Docker笔记--操作容器命令 创建容器 docker [container] create-- 创建容器,使用docker [container] create命令新建的容器处于停止状态,可以使用 ...

  4. Docker进阶之五:容器管理

    容器管理 一.创建容器常用选项 docker container --help 指令 描述 资源限制指令 -i, --interactive 交互式 -m,--memory 容器可以使用的最大内存量 ...

  5. Docker镜像和容器管理(二)

    Docker安装 Docker镜像管理 https://hub.docker.com/ 是公共的一个Docker镜像仓库,类似GitHub一样,上面有非常多的开源项目镜像. 可以直接在命令行搜索镜像 ...

  6. Docker 镜像与容器管理

    镜像与容器简介 Docker的大部分操作都围绕着它的三大核心概念:镜像.容器.仓库而展开.因此,准确把握这三大核心概念对于掌握Docker技术尤为重要,在docker中,我们重点关注的就是镜像和容器了 ...

  7. Docker 与 Podman 容器管理的比较

    翻译自 Paul Ferrill 2020年9月1日的文章<Compare Docker vs. Podman for container management> [1] Docker 和 ...

  8. Docker学习笔记四:Docker镜像、容器管理工具shipyard

    一.拉取以下几种镜像: docker pull alpineshipyard/shipyarddocker pull swarm docker pull shipyard/shipyarddocker ...

  9. rancher1.X+docker+k8s搭建容器管理集群

    一, 环境准备 服务器 Linux k8s-m -.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Li ...

  10. 难部署的taiga,式微的circus——趋势从进程管理到容器管理,简单才是美

    一直需要一个项目管理系统,一直没时间弄. taiga是github上搜project management star最多的项目,又是基于django用python写的后端,所以就用它: 但是,集中精力 ...

随机推荐

  1. qt sql事务操作

    事务是数据库的一个重要功能,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位.在Qt中用transaction()开始一个事务操作,用commit()函数或 ...

  2. 新玩法,CentOS7中LVM通过扩展逻辑卷扩展swap空间

    在我们日常运维工作中,偶尔也会遇到需要扩展swap空间的操作.扩展swap空间的方法很多,现在让我们一起来探讨一下,在LVM下扩展swap空间的方法. 1.查看一下卷组,是否还有空闲空间能用于扩展sw ...

  3. 初次比较正式的IT职场面试后几点对自己web开发的思考

    昨天晚上参加一个web开发面试,对于还没有真正毕业的自己来说,web开发的面试不是第一次,暑假就面试几家公司,前几次的面试并没有发现自己对自己学习的专业知识有什么学习态度的问题,因为前几次的面试官都是 ...

  4. 生产环境MySQL优化

    a:硬件的优化: 1. 采用64位cpu,cpu至少4颗,L2缓存越大越好2. 内存要大,32-64G运行1-2个实例,96-128G运行3-4个实例3. 机械盘选用sas盘,转速15000以上,有可 ...

  5. PHP学习(一)

    // php注释: // 单行注释 /*多行注释 多行注释*/ /** *姓名:李华 *时间:2016年 *内容:文档注释 */ #这是脚本注释--以下是注释代码 /*php的数据类型: 标量类型(4 ...

  6. spring 5.x 系列第16篇 —— 整合dubbo (代码配置方式)

    文章目录 一. 项目结构说明 二.项目依赖 三.公共模块(dubbo-ano-common) 四. 服务提供者(dubbo-ano-provider) 4.1 提供方配置 4.2 使用注解@Servi ...

  7. appcan 多按钮提示框

    使用  appcan.window.alert EG: var btnList=new Array(); btnList[0]="确认"; btnList[1]="取消& ...

  8. chromedriver配置

    需要先安装chrome浏览器,添加chrome源 sudo vim /etc/yum.repos.d/google-chrome.repo 添加以下内容 [google-chrome] name=go ...

  9. 解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的

    由于TCP协议整个机制也非常复杂我只能尽可能的在某一条线上来说,不可能面面俱到,如果有疏漏或者对于内容有异议可以留言.谢谢大家. 查看服务器上各个状态的统计数量: netstat -ant | awk ...

  10. Input标签中Type的类型及详细用法

    Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍.1,type=text输入类型是text,这是我们见的最多 ...