Docker 入门学习札记

很早之前就听说过Docker,但一直木有实践过。前一阵子参加OSC的源创会时,里面嘉宾讲的东西提到了Docker,感觉Docker是一个很有意义的工具,于是就学习了一下它的基本用法,在此总结一下。

以我的理解,Docker是一种虚拟化容器,这个容器里可以运行各种程序,是一种轻量级的虚拟化技术,使用Golang编写。它与传统的虚拟化技术(KVM和Xen)的区别是,Docker容器是操作系统层面上的虚拟化(内核级),基于LXC技术,直接服用本地操作系统,而传统的虚拟化技术则是从硬件方面进行虚拟化。它的好处是,启动特别快,而且对系统资源的利用率较高,一台机器上可以运行很多Docker容器,而且因为Docker非常轻量,它为快速部署提供了很好的技术支持。并且Docker引入了版本控制的思想,可以更好地持续构建和部署。

下面总结一下Docker的基本用法:

安装

用apt-get或者yum安装都是坑,基本上都不是最新版本的。要安装还是用官方的命令安装:

1
curl -sSL https://get.docker.com/ | sh

不过由于Docker的安装文件存放在Amazon S3上,会间接性抽风,因此最好找个国内的源。

(2015-7 补充:DaoCloud是不错的选择,服务很好)

容器与镜像

Docker容器可以理解为运行在沙盒里的进程。

通俗地讲,镜像(images)相当于一个类,而容器(container)相当于类的一个实例。容器可以不断地被修改,并通过commit化为一个镜像。

基本命令

主要有:

Docker信息

查看Docker版本:docker version
登录至远程库:docker login

镜像操作

列出镜像列表:docker images
删除镜像:docker rmi [id]
搜索镜像:docker search [name]
从远程拉取镜像:docker pull [name]:[tag]
将镜像发布至远程:docker push [name]

容器运行

容器运行用docker run命令,它有一些详细的参数很有用,比如:
以交互模式启动容器centos:latest : docker run -i - t centos:latest /bin/bash
-i表示支持输入,-t表示命令行交互。
以后台模式运行,并进行端口映射: docker run -d -p 8080:8080 sczyh30/tomcat:v1 /start.sh
-d表示daemon,即以后台方式运行。-p表示端口映射。
这里用的时候有个比较fucking的地方,如果运行容器的时候相应的命令不阻塞,那么容器会自动结束运行(比如resin)。看来以后运行命令要加个阻塞的命令咯~
另外对于在容器里自动执行apt-get命令时,一定要加上-y,否则容器虽然进入交互模式但却无法响应,运行完即退出。

容器管理

查看正在运行的容器:docker ps
查看所有容器:docker ps -a
删除容器:docker rm [name/id]
删除所有容器:docker rm 'docker ps -a -q'
停止、启动、杀死一个容器:

1
2
3
$docker stop [Name/ID]
$docker start [Name/ID]
$docker kill [Name/ID]

从容器中读取日志:docker logs [Name/ID]
列出更改项:docker diff [Name/ID]
从容器中拷贝文件至本机:docker cp ID:/container_path to_path
附加到一个运行的容器上:docker attach [ID]

容器的简单构建

通过命令操作来部署容器显然很麻烦,所以通过Dockerfile进行自动化容器构建是非常方便的。
这里我自己写了一个简单的Dockerfile来练练手,这是一个用于构建Hexo博客的Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#构建的镜像基础
FROM node:slim
#维护者
MAINTAINER sczyh30 root@sczyh30.com
#执行命令用RUN,注意要遇到需要交互的地方加-y
RUN apt-get update \
&& apt-get install -y git ssh-client ca-certificates --no-install-recommends \
&& rm -r /var/lib/apt/lists/*
#更改时区
RUN echo "Asia/Shanghai" > /etc/timezone \
&& dpkg-reconfigure -f noninteractive tzdata
#安装hexo
RUN npm install hexo-cli -g
#初始化
RUN cd / && hexo init blog && cd blog && npm install
#设定默认工作目录
WORKDIR /blog
#设定暴露端口
EXPOSE 4000
#设定容器运行时执行的命令,只能有一条,若多条则执行最后一条
CMD hexo s

然后在此目录执行构建:

1
docker build -t sczyh30/simple_test:v1 .

.表示在当前目录构建
docker build的一些参数:

1
2
3
4
--no-cache=false Do not use cache when building the image
-q, --quiet=false Suppress the verbose output generated by the containers
--rm=true Remove intermediate containers after a successful build
-t, --tag="" Repository name (and optionally a tag) to be applied to the resulting image in case of success

执行后就会按照Dockerfile的内容进行构建,过几分钟构建成功,用docker run运行一下:

1
docker run -d -p 80:4000 sczyh30/simple_test:v1

运行成功~在docker ps里可以看到容器已成功运行:

1
2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45782259f2c3 sczyh30/simple_test:v1 "/bin/sh -c 'hexo s'" 2 minutes ago Up 2 minutes 0.0.0.0:80->4000/tcp trusting_ramanujan

在浏览器中打开,一个简单的Hexo已经搭好咯~

总结一下,Dockerfile非常方便,以后用它构建容器进行集群部署貌似是不错的选择呢~
后面将进行更多的关于Docker的实践。

文章目录
  1. 1. 安装
  2. 2. 容器与镜像
  3. 3. 基本命令
    1. 3.1. Docker信息
    2. 3.2. 镜像操作
    3. 3.3. 容器运行
    4. 3.4. 容器管理
  4. 4. 容器的简单构建