原文地址: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. Sql 2017 安装到sql_shared_mrconfigaction-install-confignonrc-cpu64卡住不动问题

    解决方法:取消功能选择的实例功能和共享功能中的"机器学习服务(数据库内)""机器学习服务器(独立)"

  2. Window Features(包括Z-Order,Layered Windows, Message-Only Windows, Owned Windows, Window的状态等)

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms632599(v=vs.85).aspx#owned_windows https: ...

  3. ChartDirector应用笔记(可同时为Web和Qt MFC提供图表)

    ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库.其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C+ ...

  4. 【Web前端Talk】“用数据说话,从埋点开始”-带你理解前端的三种埋点

    埋点到底是什么呢? 引用自百科的原话是,埋点分析网站分析的一种常用的数据采集方法.因此其本质是分析,但是靠什么分析呢?靠埋点得到的数据.通俗来讲,就是当我想要在某个产品上得到用户的一些行为数据用来分析 ...

  5. 音视频技术“塔尖”之争,网易云信如何C位出道?

    音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ...

  6. ZooKeeper学习之路(四)—— Java 客户端 Apache Curator

    一.基本依赖 Curator是Netflix公司开源的一个Zookeeper客户端,目前由Apache进行维护.与Zookeeper原生客户端相比,Curator的抽象层次更高,功能也更加丰富,是目前 ...

  7. spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

    文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...

  8. SSM(六)JDK动态代理和Cglib动态代理

    1.Cglib动态代理 目标类: package cn.happy.proxy.cglib; public class Service { public Service() { System.out. ...

  9. NoSQL数据库兴起

    前言 近几年NoSQL数据库兴起,各种新的产品层出不穷,在此学习下NoSQL的基本理论,并认识下常见的NoSQL数据库. 一 NoSQL数据库兴起的原因 随着大数据技术兴起和Web2.0时代的到来.传 ...

  10. 正则RegExp对象的用法

    RegExp实例方法: 1.Test() RegExpObject.test(string) 判断string中是否有与表达式匹配的字符串,有则返回true,否则返回false 例如 var patt ...