文章目录
1.容器的概念
1.1 docker是什么
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器部署应用程序称为容器化。容器不是新的,但它们用于轻松部署应用程序
容器化越来越流行,因为容器是:
- 灵活:即使是最复杂的应用程序也可以容器化。
- 轻量级:容器利用并共享主机内核。
- 可互换:您可以随时部署更新和升级。
- 可移植:您可以在本地构建、部署到云端并在任何地方运行。
- 可扩展性:您可以增加并自动分发容器副本。
- 可堆叠:您可以垂直和动态堆叠服务。
1.2基本概念
镜像(image):是一个可执行包,它包含运行应用程序所需的一切,包括代码、运行时环境,库、环境变量和配置文件。操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image) ,就相当于是一个 root 文件系统。比如官方镜像 ubuntu:14.04 就包含了完整的一套Ubuntu 14.04 最小系统的 root 文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等) 。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
分层存储
因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在Docker 设计时,就充分利用***Union FS*** 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。容器(container):是一个镜像的运行时实例。通过执行镜像,启动相应的容器,您可以使用docker ps命令查看正在运行的容器列表,就像在Linux中一样。镜像(Image) 和容器(Container) 的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被
创建、启动、停止、删除、暂停等。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume) 、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。Docker Registry
镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器
上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry
就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository) ;每个仓库可以包含多
个标签(Tag) ;每个标签对应一个镜像。
通常,一个仓库通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版
本的镜像。如果不给出标签,将以 latest 作为默认标签。
以 Ubuntu 镜像 为例, ubuntu 是仓库的名字,其内包含有不同的版本标签,
如, 14.04 , 16.04 。我们可以通过 ubuntu:14.04 ,或者 ubuntu:16.04
来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu ,那将视为
ubuntu:latest 。容器和虚拟机的比较
容器在Linux上本机运行,并与其他容器共享主机的内核。它运行一个离散的进程,占用的内存不超过任何其他可执行文件,从而使它变得轻量级。
相比之下,虚拟机(VM)运行一个完整的 “guest” 操作系统,通过虚拟机监控程序对主机资源进行虚拟访问。通常,虚拟机为环境提供的资源比大多数应用程序需要的资源多。
特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为 MB 一般为 GB 硬盘使用 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个
2.安装docker
[可根据自己的操作系统,参考docker官网安装][https://docs.docker.com/install/]
3.使用镜像
3.1.获取镜像 :
从 Docker Registry 获取镜像的命令是 docker pull 。其命令格式为:
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
$ docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b49298
3ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:14.04
3.2.运行镜像
有了镜像后,我们就可以以这个镜像为基础启动一个容器来运行。以上面的
ubuntu:14.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的
话,可以执行下面的命令。
$ docker run -it --rm ubuntu:14.04 bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
root@e7009c6ce357:/# exit
exit
$
docker run 就是运行容器的命令-it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们
这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
–rm :这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免
浪费空间。ubuntu:14.04 :这是指用 ubuntu:14.04 镜像为基础来启动容器。bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash 。进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了cat /etc/os-release ,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 14.04.5 LTS 系统。最后我们通过 exit 退出了这个容器。
3.3.列出镜像
要想列出已经下载下来的镜像,可以使用 docker images 命令。
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
mongo 3.2 fe9198c04d62 5 days ago 342 MB
3.4.commit容器
而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
docker commit 的语法格式为:
$ docker commit \
--author "Tao Wang <twang2218@gmail.com>" \
--message "修改了默认网页" \
webserver \
nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa
1795214
但是慎用commit,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像 而且生成镜像包含了很多其他不需要的东西,会越来越臃肿,推荐用dockerfile构建镜像。
3.5.使用dockerfile构建镜像
新建一个dockerfile
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
Dockerfile内容如下
FROM debian:jessie
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redi
s-3.2.5.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
FROM:指定基础镜像
RUN:执行命令
写完后,构建这个镜像,在 Dockerfile 文件所在目录执行:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/h
tml/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
其他使用方法参考以下文档
[Dockerfie 官方文档][https://docs.docker.com/engine/reference/builder/]
[Dockerfile 最佳实践文档][https://docs.docker.com/engine/userguide/engimage/dockerfile_best-practices/ ]
4.操作容器
4.1新建并启动
所需要的命令主要为 docker run 。
例如,下面的命令输出一个 “Hello World”,之后终止容器。
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
下面的命令则启动一个 bash 终端,允许用户进行交互。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
其中, -t 选项让Docker分配一个伪终端(pseudo-tty) 并绑定到容器的标准输入
上, -i 则让容器的标准输入保持打开。
4.2进入容器
在使用 -d 参数时,容器启动后会进入后台。
$ sudo docker run -d ubuntu:14.04 /bin/bash
某些时候需要进入容器进行操作,
有很多种方法,包括使用 docker exec 命令等。
$sudo docker exec -it ubuntu:14.04 /bin/bash
root@243c32535da7:/#
4.3终止容器
可以使用 docker stop 来终止一个运行中的容器。
4.4导出和导入容器
导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 h
ours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,例如
$ cat | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB