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写的后端,所以就用它: 但是,集中精力 ...
随机推荐
- Linux C/C++编程手册查阅方法
Linux Programmer's Manual & User Commands https://www.kernel.org/doc/man-pages/ 搜索框输入epoll调用搜索引擎 ...
- 记录一次PHP项目报502的问题
问题描述 最近有台服务器偶尔会报502错误,虽然量不多,每天就几十个,但是也必须得找到原因,避免让小问题变成大问题. 排查过程 502错误的原因,一般是对用户访问请求的响应超时造成的,一开始以为是请求 ...
- “多团队大规模”开发模式 - 基于SAP HANA平台的多团队产品研发
应用SAP HANA “官方”开发模式的伙伴们在转到“多团队大规模”开发模式时会遇到各式各样的心理不适应的状况,各种纠结.比如GIT Repository和HANA Repository冲突什么的. ...
- 条款14:在资源管理类中小心copying行为
请牢记: 1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 2.普遍常见的RAII class copying行为是:抑制copyin ...
- Kafka笔记3
向Kafka写入消息从创建一个ProducerRecord对象开始,ProducerRecord需要包含目标主题和要发送的内容,我们还可以指定键或分区,在发送ProducerRecord对象时,生产者 ...
- C语言实现常用数据结构——栈
#include<stdio.h> #include<stdlib.h> //用链表实现栈 typedef struct Node { int data; struct Nod ...
- spring boot单元测试之RestTemplate(二)
上篇博客中,简单介绍了RestTemplate,只是用到了单元测试环节,如果在正式开发环境使用RestTemplate调用远程接口,还有一些配置要做. 一.配置类 由于Spring boot没有对Re ...
- kolla-ansible-----快速部署openstack
基本环境 操作系统:CentOS Linux release 7.5.1804 (Core) 内核版本:3.10.0-862.el7.x86_64 docker版本:1.13.1 1.禁用宿主机的 L ...
- Laravel --- Laravel5.3 和 Workerman结合使用(异步)
网上查阅资料有现成和workerman结合的composer组件,但个人感觉不太靠谱,github上star太少,而且怕有问题也不好调,就想自己先试试. 我的办法因为修改要一点Workerman源码, ...
- python trojan development 2nd —— use python to send mail and listen to the key board then combine them
请勿用于非法用途!!!!!本人概不负责!!!原创作品,转载说明出处!!!!! from pynput.keyboard import Key,Listener import logging impor ...