Docker笔记(六):容器管理
原文地址: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后台进程具体都干了些啥呢?一般来说,包括如下几个操作步骤
- 检测本地是否存在指定的镜像,如果不存在,就从公共仓库下载
- 利用镜像创建一个容器,并启动它
- 分配一个文件系统,并在只读的镜像层上面挂载一层可读写层(容器存储层)
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从地址池配置一个 ip 地址给容器
- 执行用户指定的应用程序
- 执行应用程序完毕后容器被终止
2. 管理已有容器
一般对已有容器的管理包括如下几个操作:
- 查看运行中的容器
docker ps或docker container ls - 查看所有容器
docker ps -a或docker container ls -a - 停止运行
docker stop xxx - 开始停止状态的容器
docker start xxx - 重启运行状态的容器
docker restart xxx - 删除停止状态的容器
docker rm xxx - 强制删除容器(包括运行状态中)
docker rm -f xxx - 删除所有停止状态的容器
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笔记(六):容器管理的更多相关文章
- Docker背后的容器管理——Libcontainer深度解析
Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Docker笔记--操作容器命令
Docker笔记--操作容器命令 创建容器 docker [container] create-- 创建容器,使用docker [container] create命令新建的容器处于停止状态,可以使用 ...
- Docker进阶之五:容器管理
容器管理 一.创建容器常用选项 docker container --help 指令 描述 资源限制指令 -i, --interactive 交互式 -m,--memory 容器可以使用的最大内存量 ...
- Docker镜像和容器管理(二)
Docker安装 Docker镜像管理 https://hub.docker.com/ 是公共的一个Docker镜像仓库,类似GitHub一样,上面有非常多的开源项目镜像. 可以直接在命令行搜索镜像 ...
- Docker 镜像与容器管理
镜像与容器简介 Docker的大部分操作都围绕着它的三大核心概念:镜像.容器.仓库而展开.因此,准确把握这三大核心概念对于掌握Docker技术尤为重要,在docker中,我们重点关注的就是镜像和容器了 ...
- Docker 与 Podman 容器管理的比较
翻译自 Paul Ferrill 2020年9月1日的文章<Compare Docker vs. Podman for container management> [1] Docker 和 ...
- Docker学习笔记四:Docker镜像、容器管理工具shipyard
一.拉取以下几种镜像: docker pull alpineshipyard/shipyarddocker pull swarm docker pull shipyard/shipyarddocker ...
- 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 ...
- 难部署的taiga,式微的circus——趋势从进程管理到容器管理,简单才是美
一直需要一个项目管理系统,一直没时间弄. taiga是github上搜project management star最多的项目,又是基于django用python写的后端,所以就用它: 但是,集中精力 ...
随机推荐
- 最小二乘法 good
最小二乘法也称为最小平方法,是一种数据优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配. 最小二乘法最初由高尔顿在创立回归分析的时候提出,现在已经成为探索变量间关系最重要的方法,最小二乘法根据 ...
- 把握每次机会,麒麟芯片5年成就高端(SoC包括AP、基带、ISP等,华为确实牛)
从2016年11月华为Mate 9 /Mate 9 Pro发布,到2017年2月荣耀V9和华为P10 /P10 Plus 相继发布,这几款都是华为和荣耀的高端旗舰机型,且搭载的都是华为最新旗舰芯片-- ...
- Qt4.8.6与VS2008的集成开发环境的安装配置
一.安装编译Qt 1. 在Windows下用Qt做开发,编译器可以用mingw的gcc/g++,也可以用VS. 2. 安装VS2008集成开发环境(完全安装). 3. 安装qt4.8.6(qt-op ...
- QThread的源码(直接搜索"thread.cpp"即可,或者在github里搜)
void QThread::run() { (void) exec(); } int QThread::exec() { Q_D(QThread); QMutexLocker locker(& ...
- python中的基本数据类型之 int bool str
一.基本数据类型 1. int ==> 整数.主要用来进行数学运算. 2.str ==> 字符串.可以保存少量的数据,并进行相应的操作. 3.bool => 布尔值.判断 ...
- 3022Java_运算
运算 1.运算符分类 算术运算符 二元运算符 +,-,*,/,% 一元运算符 ++,-- 赋值运算符 = 扩展运算符 +=,-=,*=,/= 关系运算符 >,<,>=,<= ...
- JAVA8之lambda表达式详解
原文:http://blog.csdn.net/jinzhencs/article/details/50748202 lambda表达式详解 一.问题 1.什么是lambda表达式? 2.lambda ...
- .Net for Spark 实现 WordCount 应用及调试入坑详解
.Net for Spark 实现WordCount应用及调试入坑详解 1. 概述 iNeuOS云端操作系统现在具备物联网.视图业务建模.机器学习的功能,但是缺少一个计算平台产品.最近在调研使用 ...
- Django之Cookie Session详解,CBV,FBV登陆验证装饰器和自定义分页
Cookie Session和自定义分页 cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接 ...
- VUE、微信for动态变量取值(拼接取值)
item.value是其它循的值如value=[1,2,3] {{'images[arrAy' + item.value+']'}} 那么拼接结果是 {{images[arrAy1]}}, {{ima ...