Docker学习笔记

最近花几天时间学了一下Docker,Docker目前太火了,而且也确实挺有用的,用起来也不难。

我找到两个很好的教程,一个是Docker——从入门到实践这本书,另一个是翻译自官方Docker getting started的Docker入门教程

什么是Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker的优点

Docker中的三个基本概念

1. 镜像

Docker 镜像(Image)就是一个只读的模板。

例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。

镜像可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

2. 容器

Docker 利用容器(Container)来运行应用。

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

3. 仓库

仓库(Repository)是集中存放镜像文件的场所。每个仓库中包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。

国内的公开仓库包括 时速云网易云 等,可以提供大陆用户更稳定快速的访问。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

Docker的使用

获取镜像

docker pull hub.c.163.com/public/centos:6.5

列出本地镜像

docker images

使用更改后的容器创建镜像

docker commit   # 类似于git的提交更改
docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2

利用Dockerfile创建镜像

docker build -t="ouruser/sinatra:v2" .

. 是Dockerfile文件所在的目录

Dockerfile文件的一个例子:

# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

删除本地镜像

docker rmi training/sinatra

删除所有未打过标签的本地镜像:

docker rmi $(docker images -q -f "dangling=true")

新建并启动容器

docker run ubuntu:14.04 /bin/echo 'Hello world'

容器启动之后会运行最后指明的命令,如果命令运行完了,容器就会终止,如果命令不退出,容器也会一直运行。

如果后面不接命令的话,就会运行默认的命令/bin/bash

下面是几个经常用到的参数:

在正在运行的容器中执行命令

docker exec docker exec 76ed90b24f31 echo "Hello world"

76ed90b24f31 是容器ID

进入容器

docker attach nostalgic_hypatia

进入容器nostalgic_hypatia中。但是这种方式在退出终端的时候容器也跟着退出了。

第二种方式。docker exec -it。

docker exec -it nostalgic_hypatia /bin/bash

这样输入“exit”或者按键“Ctrl + C”退出container时,这个container仍然在后台运行 。

停止容器

docker stop trusting_newton
docker kill trusting_newton

停止容器名为trusting_newton的容器。stop和kill都能停止容器,stop发送SIGTERM信号,kill发送SIGKILL信号。差异与Linux下的向进程发送信号类似,一个是优雅地停止,一个是强制停止。

注意:停止容器不会导致容器里的数据丢失。通过docker start可以启动一个停止的容器,容器里的数据与停止之前相同。

删除容器

docker rm trusting_newton

删除容器trusting_newton,rm后面可以是容器name或者容器ID。删除容器之前容器的状态必须为stop,不能删除运行中的容器。

清理所有处于终止状态的容器

docker rm $(docker ps -a -q)