君は春の中にいる、かけがえのない春の中にいる.

你驻足于春色中,于那独一无二的春色之中.

Docker快速入门

套用介绍Docker的话,Docker是一个开源的引擎,可以创建一个轻量级的虚拟系统。由于它可以更加轻量级的实现虚拟机的作用,而且它自带很多很方便的监控运行系统状态的特性,所以受到大家的青睐。

这篇博客旨在快速部署Docker,并不是对Docker进行深入研究,所以只会说说我在实际用Docker的过程中使用频次较高的实际指令,并不会详细介绍Docker基于Linux的底层实现原理和理论的东西,如果有错误请留言指正。

0x01 基本部署

这里我使用Ubuntu16.04进行测试。先说说Docker的安装,最简单的方法的直接使用Ubuntu的apt-get安装:

sudo apt-get update
sudo apt-get install docker

而我为了能够安装最新版的Docker,使用下面更加复杂的方法:

1.升级source列表,安装相应的ca证书

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates

2.增加密钥

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

3.添加源列表文件

sudo vi /etc/apt/sources.list.d/docker.list

4.按照系统版本增加entry

sudo deb https://apt.dockerproject.org/repo ubuntu-xenial main

5.安装docker并测试

sudo apt-get update
sudo apt-get install docker-engine
sudo service docker start
sudo docker run hello-world

这个时候docker程序会先检查本地仓库是否有镜像,如果没有,就会从官方的仓库中拉取相应的镜像并运行它。而这个hello-world的程序还会打印出官方的一些帮助信息。

0x02 常用命令

接着上一节拉取到的镜像,我们就用这个镜像说明Docker会经常用到的一些指令。

0.快速的搜寻镜像

docker search 镜像名或id

这种方法可以快速的从官方仓库查找可用的镜像,相比起直接访问官网查询,这种方法不用太多的等待,不足之处在于,作为初心者,这种方式几乎看不到镜像的详细使用说明,对新手的使用并不够友好,而在官网上可以看到作者的详细使用说明和Dockerfile文件,更适合我们入门学习。

1.安静的拉取镜像

docker pull 镜像名或id

这个命令只会从官方仓库下载镜像到本地,并不会执行生成容器。

2.方便的掌握镜像

docker images

查看本地仓库中的可用镜像

3.常用的运行方式

docker run -it 镜像名或id /bin/bash
docker run -d 镜像名或id

以上两种是学习过程中经常能够看到的命令,前者适合对于生成的容器进行调试,而且即使没有前台进程(后面会说这个的关系),它也可以运行起来;后者多作为真正部署时使用。

之所以会这样,当然是因为run后面不同的参数值了,i参数是为了保持stdin打开,t参数是为了维持一个为终端,而d参数测试在后台运行容器。

当容器运行在后台时,它就有点像我们通常在Windows下执行可执行程序的逻辑,当没有循环或者其他逻辑维持它的前台进程时,容器就会自动结束。所以当使用d参数时,就需要有一个前台进程来保持容器的运行。

run指令下还有一些常用的参数:

-a参数,负责进行连接附加,可以连接标准输入输出等
-e参数,设置环境变量,例如一些数据库镜像的生成时的参数
--name,重命名容器,方便进行管理,避免了你输入那些随机生成的科学家名或者ID
-p参数,将容器内的端口映射到宿主机相应端口
-v参数,挂载容器内的内容

其他参数可以直接查阅手册,这里只列出了我常用到的参数。

示例如下:

我们运行一个由我自己编译的wordpress镜像,内置数据库

我们先用images查看可用的镜像

在使用下面这个指令来启动镜像,生成容器

docker -d --name wordpress -p 0.0.0.0:80:80 镜像名或id

生成的同时,容器被赋予了一个唯一的ID

4.常用的维护命令

还是如上图

docker ps 

可以查看正在运行的容器和基本信息,而-l参数则显示上一次运行过的容器

docker inspect 容器名或id

可以查看容器的详细信息,这个指令的输出较多,就不截图了。不过这个指令结果里有几个重要参数值的我们注意:

  1. 容器的宿主机存储路径,包括容器主机名、配置信息、日志等
  2. 容器映射出的端口信息
  3. 网络服务的配置信息,包括容器ip、DNS等
  4. 运行环境的配置信息

……

这些信息可以帮助我们更好的去认识镜像、容器、宿主机之间的关系

docker exec -it 容器名 /bin/bash

这条指令可以方便我们去访问后台运行状态的容器内部,进行修改添加应用,当然,也可以在一开始就给容器开一个ssh进行管理

docker events/logs/info

这几条指令都是将容器当前运行的一些事件、日志信息输出到宿主机界面上,方便我们进行容器部署应用的观察和管理

docker commit 容器名 镜像名:标签

提交一个你修改满意的容器到本地仓库生成相应的镜像

5.常用的删除启动命令

docker start/stop/restart 容器名

这个不用多解释了

docker rm 容器名

永久删除当前容器,但是前提是先stop了这个容器

docker rmi 镜像名

永久删除本地仓库中的镜像

有了这几条命令,简单运行一个Docker就基本逻辑可以走顺了,当然,完整的命令请参照官方手册。

还有几个关键命令会在下一节适合它们的地方登场。

0x03 DIY

官方仓库中经过认证和未认证的项目有上千例(未具体求证),基本满足我们的应用部署需要,但是,有时候我们的有一些特殊需求时,可能就需要我们自己去编译一个镜像。

当然,在介绍这部分之前,不得不提一个Dockeric(不保证有这么个词)的观点,Docker实现的容器应该是模块化的,所以每一个单独的容器最好只运行一个单独的进程,复杂的逻辑关系应该通过容器间的连接(–link)实现。向我在之前作为例子实现的wordpress其实就是一个反例,因为我在一个容器中同时放入了wordpress进程和mysql进程。所以,在DIY编译镜像时,尽量不要想使用vmware那样放太多的东西进去,小心鸡蛋砸在一个Container里~~。

先入门基本指令,我以我的wordpress为例:

FROM ubuntu:14.04

MAINTAINER xxxx xxxx@xxxx

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update

RUN apt-get -y upgrade

上手先W再E,FROM决定整个镜像的根基,你是打算用Ubuntu:14.04,Ubuntu:latset,CentOS还是什么其他的;MAINTAINER填写创建者信息;RUN是运行安装指令的基础;ENV设置环境变量

RUN apt-get -y install mysql-server mysql-client nginx php5-fpm php5-mysql php-apc pwgen python-setuptools curl git unzip

RUN sed -i -e”s/^bind-address\s=\s127.0.0.1/bind-address = 0.0.0.0/“ /etc/mysql/my.cnf
……

ADD ./nginx-site.conf /etc/nginx/sites-available/default

EXPOSE 3306

EXPOSE 80

VOLUME [“/var/lib/mysql”, “/usr/share/nginx/www”]

CMD [“/bin/bash”, “/start.sh”]

接着Q后面接R,ADD可以拷贝编译文件夹下的文件到镜像生成后的容器的相应文件夹下,EXPOSE则设置容器内部开启的端口,VOLUME负责挂载容器的文件,CMD是容器启动时执行的命令。而有多条CMD命令时,只执行最后的一行的CMD命令。

当然这个文件只是说明,并不完整,完整的Dockerfile官网上有很多,我就不把我写的蹩脚file放到这里了。

写好写指令后,保存为Dockerfile文件名,存在一个文件夹下,把相应的外部文件也都移到一起。

在当前目录下执行

docker build -t 自己起的镜像名 .(这里还有一点,别看掉了)

程序就会按照你指定的安装流程进行相应的安装了。

0x04 结语

还是要说一下,这一篇是基于快速部署而写下的,内容肯定很浅薄,后面随着我对Docker学习的深入,应该还会有更进一步的经验总结和实际应用。