Docker容器

容器是Docker又一核心概念。

简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其它系统环境)和跑在上面的应用。

本文将具体介绍如何来管理一个容器,包括创建、启动、停止。

容器的生命周期如图

启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将在终止状态(stopped)的容器重新启动。

因为Docker的容器实在太轻量级,很多时候用户都是随时删除和新创建容器。

新建并启动

所需要的命令主要为docker run

例如,下面的命令输出一个"Hello World",之后终止容器。

[root@localhost /]# docker run ubuntu /bin/echo "hello world"
hello world

这跟在本地直接执行/bin/echo 'hello world'几乎感觉不出任何区别。

下面的命令则启动一个bash终端,允许用户进行交互。

[root@localhost /]# docker run -it ubuntu /bin/bash
root@e50e2cf795a5:/#

其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。

在交互模式下,用户可以通过所创建的终端来输入命令,例如:

root@e50e2cf795a5:/# pwd
/
root@e50e2cf795a5:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr

当利用docker run来创建容器时,Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
  • 利用镜像创建并启动一个容器。
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去。
  • 从地址池配置一个IP地址给容器。
  • 执行用户指定的应用程序。
  • 执行完毕后容器被终止。

启动已终止容器

可以利用docker start命令,直接将一个已经终止的或者是停止的容器启动运行。

容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必须的。除此之外,并没有其它的资源。可以在伪终端中利用pstop来查看进程信息。

[root@localhost /]# docker run -it ubuntu /bin/bash
root@07a623250425:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
9 pts/0 00:00:00 ps

可见,容器中仅运行了指定的bash应用。这种特点使得Docker对资源的利用率极高,是货真价实的轻量级虚拟化。

守护态运行容器

更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。

例如下面的命令会在后台运行容器,该容器会间隔一秒输入I'm SkyBiuBiu。

docker run -itd ubuntu /bin/sh -c "while true;do echo 'I m SkyBiuBiu';sleep 1;done"
5ed298c00af007b8c353c3de04e1ae9f50797841a2f8fa9312380fe6999942b1

容器启动后会返回一个唯一的CONTAINER_ID,也可以通过docker ps命令来查看容器信息。

[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ed298c00af0 ubuntu "/bin/sh -c 'while t…" 39 seconds ago Up 38 seconds nostalgic_engelbart

要获取容器的输出信息,可以通过docker logs命令。

[root@localhost /]# docker logs 5ed298c00af0
I m SkyBiuBiu
I m SkyBiuBiu
I m SkyBiuBiu
I m SkyBiuBiu
I m SkyBiuBiu
I m SkyBiuBiu
...

终止容器

可以使用docker stop来终止一个运行中的容器。

此外,当Docker容器中指定的应用终结时,容器也自动终止。例如只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止。

终止状态的容器可以用docker ps -a命令看到。例如:

[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ed298c00af0 ubuntu "/bin/sh -c 'while t…" 5 minutes ago Exited (137) 3 minutes ago nostalgic_engelbart
03a0dfd9e420 ubuntu "/bin/sh -c 'while t…" 6 minutes ago Exited (130) 5 minutes ago musing_franklin
f2ccf1162f1b ubuntu "/bin/sh -c 'while t…" 6 minutes ago Exited (130) 6 minutes ago flamboyant_kepler
765c32a276bd ubuntu "/bin/sh -c 'while t…" 6 minutes ago Exited (130) 6 minutes ago boring_booth
1327cb2a5446 ubuntu "/bin/sh" 8 minutes ago Exited (0) 8 minutes ago upbeat_rhodes

处于终止状态的容器,可以通过docker start命令来重新启动。

此外,docker restart命令会将一个运行态的容器终止,然后再重新启动它。

进入容器

在使用-d参数时,容器启动后会进入后台,某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach命令或docker exec命令等。

attach命令

docker attach是Docker自带的命令。下面示例如何使用该命令。

[root@localhost /]# docker run -itd ubuntu
3535f6bf11404e6a1a40b165e3cca14e18d8d3258785d8f94cccc43a64312da2
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3535f6bf1140 ubuntu "bash" 3 seconds ago Up 2 seconds nervous_bose
[root@localhost /]# docker attach 3535f6bf1140
root@3535f6bf1140:/#

但是使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器时,所有窗口都会同步显示。当某个窗口因命令阻塞时,其它窗口也无法执行操作了。

要注意的是,Docker attach可以attach到一个已经运行的容器的stdin(标准输入),然后进行命令执行动作。但是需要注意的是,如果从这个stdin中exit,会导致容器停止。

[root@localhost /]# docker attach 3535f6bf1140
root@3535f6bf1140:/#
root@3535f6bf1140:/# exit
exit
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

由上可见,退出来之后,容器也终止了。

exec命令

docker exec是Docker自带的命令,用于在一个运行中的容器中执行命令。

通常可以通过docker exec -it <容器ID> /bin/bash进入一个运行中的容器。

[root@localhost /]# docker run -d ubuntu /bin/sh -c "while true;do echo 'I m SkyBiuBiu';sleep 1;done"
a50c4e7d505bac3437988ef04e4c12b5230bc4681d4759870212b439eb979b4c
[root@localhost /]# docker exec -it a50c /bin/bash
root@a50c4e7d505b:/#

对比attach命令,通过exec进入容器,退出的时候不会导致容器的终止。

[root@localhost /]# docker exec -it a50c /bin/bash
root@a50c4e7d505b:/# exit
exit
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a50c4e7d505b ubuntu "/bin/sh -c 'while t…" 51 seconds ago Up 50 seconds fervent_ganguly

导出和导入容器

导出容器

通过docker export [OPTIONS] CONTAINER可以将容器导出。

-o:--output="xxx",导出为一个文件,而非标准输出。

[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a50c4e7d505b ubuntu "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes fervent_ganguly
[root@localhost /]# docker export -o a50c > ~/ubuntu.tar
[root@localhost /]# ls ~ | grep ubuntu
ubuntu.tar

导入容器

通过docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]可以将容器导入。

-c:按照Dockerfile指令来创建镜像。

-m:为导入的镜像设置commit信息。

[root@localhost ~]# docker import -m="I'm SkyBiuBIu" ubuntu.tar skybiubiu/ubuntu:v1
sha256:eef69ddbf0d7c8bcb8addd3307814e2746ace23bd0e358ca479579ac8bdd45e9
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
skybiubiu/ubuntu v1 eef69ddbf0d7 4 seconds ago 72.8MB
ubuntu latest ba6acccedd29 7 weeks ago 72.8MB

或者通过docker load [OPTIONS]命令来导入容器。

-i:从tar归档文件读取,而非标准输入。

-q:不输出信息。

删除容器

可以使用docker rm来删除一个处于终止状态的容器。例如:

[root@localhost ~]# docker rm ubuntu
ubuntu

如果要删除一个运行中的容器,可以添加-f参数。Docker会发送SIGKILL信号给容器。

[云原生]Docker - 容器的更多相关文章

  1. [云原生]Docker - 简介

    目录 什么是Docker? 为什么使用Docker? 对比传统虚拟机总结 什么是Docker? Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业务项目.它基于Go ...

  2. Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)

    内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 云原生分布式块存储解决方案设计架构和概念 Longhorn 企业级云原生容器存储解决方 ...

  3. [云原生]Docker - 镜像

    目录 Docker镜像 获取镜像 列出本地镜像 创建镜像 方法一:修改已有镜像 方法二:通过Dockerfile构建镜像 方法三:从本地文件系统导入 上传镜像 保存和载入镜像 移除本地镜像 镜像的实现 ...

  4. [云原生]Docker - 安装&卸载

    目录 系统要求 卸载旧版本 安装Docker 方法一:通过repo安装 设置Repository 安装Docker Engine 升级Docker Engine 方法二:通过package安装 方法三 ...

  5. 阿里云运行docker容器报错

    [root@izbp145axkc98giot5b448z ~]# docker run -d 231d40e811cd -p 80:80 --name=nginx 56896ff0b49cfe5f1 ...

  6. 混部之殇-论云原生资源隔离技术之CPU隔离(一)

    作者 蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 混部,通常指在离线混部(也有离在线混部之说 ...

  7. 云原生之旅 - 2)Docker 容器化你的应用

    前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...

  8. 5.云原生之Docker容器网络介绍与实践

    转载自:https://www.bilibili.com/read/cv15185166/?from=readlist 例如, 当在一台未经过特殊网络配置的centos 或 ubuntu机器上安装完d ...

  9. Docker Data Center系列(一)- 快速搭建云原生架构的实践环境

    本系列文章演示如何快速搭建一个简单的云原生架构的实践环境. 基于这个基础架构,可以持续部署微服务架构的应用栈,演练敏捷开发过程,提升DevOps实践能力. 1 整体规划 1.1 拓扑架构 1.2 基础 ...

随机推荐

  1. MyScript 开发文档

    一.IInk SDK runtime 1.1 引擎创建 1.2 对象释放 1.3 获取并设置配置 配置 访问配置 配置识别 二.文件存储 2.1 支持的内容的类型 2.2 模型结构 2.3 Conte ...

  2. go微服务框架Kratos笔记(六)链路追踪实战

    什么是链路追踪 借用阿里云链路追踪文档来解释 分布式链路追踪(Distributed Tracing),也叫 分布式链路跟踪,分布式跟踪,分布式追踪 等等,它为分布式应用的开发者提供了完整的调用链路还 ...

  3. js数组常用添加方法有两种

        //头部     //this.list.unshift({name:this.itemName,date:new Date()});     //尾部         this.list.p ...

  4. Windwos安装Node.js和npm的详细步骤

    How to Install Node.js and NPM on Windows Node.js和npm 安装 Node.js 的时候会自动安装 npm ,并且 npm 就是 Node.js 的包管 ...

  5. SpringSecurity过滤器原理

    SpringSecurity原理 主要过滤器链 SpringSecurity的功能主要是由一系列的过滤器链相互配合完成的.验证一个过滤器之后放行到下一个过滤器链,然后到最后. 认证流程 过滤器作用 S ...

  6. LOJ #6207 - 米缇(杜教筛+拉格朗日插值)

    LOJ 题面传送门 首先将 \(\sigma_k(ij)\) 展开: \[\sigma_k(ij)=\sum\limits_{x\mid i}\sum\limits_{y\mid j}[x\perp ...

  7. Codeforces 1129E - Legendary Tree(思维题)

    Codeforces 题面传送门 & 洛谷题面传送门 考虑以 \(1\) 为根,记 \(siz_i\) 为 \(i\) 子树的大小,那么可以通过询问 \(S=\{2,3,\cdots,n\}, ...

  8. DP 做题记录 II.

    里面会有一些数据结构优化 DP 的题目(如 XI.),以及普通 DP. *I. P3643 [APIO2016]划艇 题意简述:给出序列 \(a_i,b_i\),求出有多少序列 \(c_i\) 满足 ...

  9. Mysql的delimiter

    告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了.默认情况下,delimiter是分号;.在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令. 有时 ...

  10. brew 切换源

    切换到国内源 # 替换brew.git: $ cd "$(brew --repo)" # 中国科大: $ git remote set-url origin https://mir ...