Docker 容器操作命令
容器是镜像的一个运行实例,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
一、创建容器
1. 新建容器
使用docker create命令新建一个容器,-t选项让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
$ docker create -it ubuntu:latest
使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
2. 启动容器
使用docker start命令来启动一个已经创建的容器
$ docker start af
通过docker ps命令查看一个运行中的容器,ps -a 查看所有容器
3. 新建并启动容器
docker run 等价于先执行docker create命令,再执行docker start命令
$ docker run ubuntu:18.04 /bin/echo 'Hello World'
当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
1)检查本地是否存在指定的镜像,不存在就从公有仓库下载;
2)利用镜像创建一个容器,并启动该容器
3)分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
4)从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
5)从网桥的地址池配置一个IP地址给容器;
6)执行用户指定的应用程序;
7)执行完毕后容器被自动终止;
命令执行后出错,会默认返回错误码,默认情况下,常见错误代码包括:
1) 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
2) 126:所指定命令无法执行,例如权限出错
3) 127:容器内命令无法找到。
4. 守护态运行
添加-d参数来实现守护态形式运行,容器启动后会返回一个唯一的id,可以通过docker ps来查看容器信息。
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
要获取容器的输也信息,可以使用docker logs命令(ce5为容器id前缀):
$ docker logs ce5
二、终止容器
可以使用docker stop来终止一个运行中的容器,该命令格式为docker stop [-t|--time[=10]] [CONTAINER...]
首先向容器发送SIGTERM信号,等待一段超过时间(默认为10秒)后,再发送SIGKILL信号来终止容器(ce5为容器id前缀):
$ docker stop ce5
docker kill命令会直接发送SIGKILL信号来强行终止容器
此外,当Docker容器中指定的应用终结时,容器也会自动终止。对于只启动了一个终端的容器,用户通过exit命令或ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。docker restart命令会将一个运行态的容器先终止,然后再重新启动它。
三、进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。如果需要进入容器进行操作,有多种办法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等。
1. attach命令
attach命令是Docker自带的命令,命令格式为:
docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
支持三个主要选项:
1) --detach-keys=[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
2) --no-stdin=true|false:是否关闭标准输入,默认是保持打开;
3) --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true;
当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2. exec命令
exec命令可以在窗口内直接执行任意命令。
docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]
比较重要的参数有
1) -i,--interactive=true|false:打开标准输入接受用户输入命令,默认为false;
2)--privileged=true|false:是否给执行命令以高权限,默认为false;
3)-t, --tty=true|false:分配伪终端,默认为false;
4)-u, --user="":执行命令的用户名或ID;
$ docker exec -it 243c32535da7 /bin/bash
3. nsenter工具
在util-linux软件包版本2.23+中包含nsenter工具。如果系统中的util-linux包没有该命令,可以按照下面的方法从源码安装:
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-;cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && cp nsenter /usr/local/bin
为了使用nsenter连接到容器,还需要找到容器进程的PID,可以通过下面的命令获取:
PID = $(docker inspect --format "{{.State.Pid}}" <container>)
通过这个PID,就可以连接到这个容器:
$ nsenter --target $PID --mount --uts --ipc --net --pid


四、删除容器
使用docker rm命令为删除处于终止或退出状态的容器,命令格式为
docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
主要支持的选项包括
1) -f, --force=false:是否强行终止并删除一个运行中的容器
2) -l, --link=false:删除容器的连接,但保留容器
3) -v, --volumes=false:删除容器挂载的数据卷。
五、导入和导出容器
1. 导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,格式为
docker export [-o|--output[=""]] CONTAINER。其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现
$ docker export -o hello1.tar a4d
$ docker export a4d > hello2.tar

2. 导入容器
导出的文件可以通过docker import命令导入变成镜像
docker import [-c|--change[=[]]] [-m|-message[=MESAGE]] file|URL - [REPOSITORY[:TAG]]
用户可以通过-c,--change=[]选项在导和的同时执行对容器进行修改的Dockerfile指令。

即可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令来导入一个容器快照到本地镜像库
两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
Docker 容器操作命令的更多相关文章
- Docker容器的操作命令
Docker容器的操作命令 写该文章时候的初衷是在使用Docker for windows 的时候遇到的一些问题.起初我在运行好docker客户端以后,创建了一个.NET Core应用发布到docke ...
- Docker容器日常操作命令
在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其 ...
- docker容器登录,退出等操作命令
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口 ...
- docker容器使用
查看容器的配置信息 # docker inspect dc4e2ff3eb58 查看容器的网络信息 # docker inspect -f {{.NetworkSettings}} node4 [ro ...
- 使用pipework将Docker容器桥接到本地网络环境中
在使用Docker的过程中,有时候我们会有将Docker容器配置到和主机同一网段的需求.要实现这个需求,我们只要将Docker容器和主机的网卡桥接起来,再给Docker容器配上IP就可以了.pipew ...
- Docker 常用操作命令
一. docker安装 方式1 本地安装: 1)下载docker安装文件: 2)执行安装命令 yum localinstall *: 3)安装完之后 重启 systemctl restart do ...
- docker容器化python服务部署(supervisor-gunicorn-flask)
docker容器化python服务部署(supervisor-gunicorn-flask) 本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-furt ...
- Docker容器网络-基础篇
开源Linux 一个执着于技术的公众号 Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/N ...
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
随机推荐
- php使用fastdfs
php的服务器地址:10.10.1.2 fastdfs tracker地址:10.15.1.2 fastdfs storage地址:10.16.1.2 将fastdfs的源码上传到php所在服务器,进 ...
- TensorFlow机器学习实战指南之第二章
一.计算图中的操作 在这个例子中,我们将结合前面所学的知识,传入一个列表到计算图中的操作,并打印返回值: 声明张量和占位符.这里,创建一个numpy数组,传入计算图操作: import tensorf ...
- Unity外包团队:U3D与UE我选哪个好?请别再问这种问题了!
原本预先决定的两家VR游戏公司采访,思熊和星为棋,并没有发现什么共性之初.结果在采访之后却意外发现,两家的经历有着非常相似的地方.他们都是来自于开发游戏所用的引擎的原开发商,比如思熊的主力来自Epic ...
- 转 一个oracle11g 使用exp导出空表丢失的问题分析及解决办法
用exp无法导出空表解决方法 最早的一次使用oracle 11g导出数据发现有的表丢失了,感觉莫名其妙的,后来终于找到原因了. 找到问题以后,再看看解决方案.11GR2中有个新特性,当表无数据时,不分 ...
- Vue 给对象添加属性
坑真多,没想到很多小细节都 改了,我添加个属性都 折腾了半天才看明白原因 Vue.set(row,"isEdit",false); //给row对象新增一个isEdit的属性.
- squid http,https, 代理,默认端口3128
squid http,https, 代理,默认端口3128 https 代理时出现 403,是因为squid默认允许 192.168.0.0 网段代理 在配置文件中,““acl localnet sr ...
- 【译】Optaplanner开发手册本地化: (0) - 前言及概念
在此之前,针对APS写了一些理论性的文章:而对于Optaplanner也写了一些介绍性质,几少量入门级的帮助初学者走近Optaplanner.在此以后,老农将会按照Optaplanner官方的用户手册 ...
- jenkins疑惑
本地仓库,脚本 os.getcwd() 获取当前脚本目录 正常 把脚本放到了工作区,os.getcwd()获取的却是 项目的主目录 打算: 思路: 兼容一波,给jenkins的写个配置文件在 项目的主 ...
- java大数据量调优
从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案集中在这样几个环节:1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要 ...
- redis的pub/sub命令
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...