安装

久仰Docker大名,很实用的东西,听说还能用在NAS上跑程序。。不过一直没机会体验,最近正好在做一个OJ系统,为了保证服务器的安全,项目中要用到Docker做容器化,于是开始学习Docker,发现还挺容易上手的。这篇文章会分享一下Docker在CentOS7环境下的的安装和使用,写的可能不是很好,please go easy on me tonight~

注:使用root用户

检查 Device Mapper

这东西是Linux里一种逻辑设备到物理设备的映射框架机制,开始安装Docker前,需要先安装它

ls -l /sys/class/misc/device-mapper

如果没有检测到,安装

yum install -y device-mapper

安装完然后加载Device Mapper

modprobe dm_mod

然后再检查一遍,应该就能找到了

安装EPEL源

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

安装Docker

yum -y install docker-io

检查是否正确安装

docker info

确认Docker守护进程

dockerd

启动Docker

systemctl start docker.service

这个时候docker已经安装好了,相当简单

使用

创建并启动容器

docker run -i -t ubuntu /bin/bash

-i 参数保证容器中stdin是开启的

-t 参数代表为容器分配一个伪tty终端

有这两个参数,新创建的容器才能提供一个交互式shell

ubuntu 代表使用ubuntu镜像,这是一个Docker公司提供的常备镜像,这里用它当例子

/bin/bash 代表启动容器后运行的命令,即启动一个Bash Shell

随后可以在容器内的Ubuntu系统中做任何想做的事,输入exit,可返回宿主机。这时容器会停止运行,因为指定的/bin/bash命令结束了,容器也随之停止,但是容器依然存在。

此外,在启动容器时,还有其他一些有用的参数

--name <any_name> 容器命名,有助于分辨容器,很多Docker命令中,都可以用容器名称来代替容器ID

-d 创建守护式容器,没有交互式会话,适合长期运行应用程序和服务

--log-driver="syslog" 指定Docker日志驱动

--restart=always 设置自动重启,可用的选项always代表无论退出代码是什么都会重启,on-failure代表退出代码非0时重启,还可指定重启次数on-failure:5

停止/重新启动容器

docker start <docker_name>
docker restart <docker_name>
docker stop <docker_name>

重启容器时,会沿用docker run时指定的参数

附着到容器上

docker attach <docker_name> 重启一个容器后,是不会回到容器内的Shell的,可以通过这样回到交互式shell上

获取容器统计信息及日志

docker top <docker_name> 查看容器内的进程

docker stats <docker_name0> ... 查看一个或多个容器统计信息

docker logs <docker_name> 输出最后几条日志并返回

-f 监控Docker的日志,持续输出

-t 日志附带时间戳

在容器内运行进程

docker exec-t -i <docker_name> /bin/bash 在容器内额外启动新的进程,可以是守护进程也可以是交互式进程。

查看容器状态

docker ps 列出运行中的容器

-a 列出所有存在的容器

-l 列出最后一个运行的容器

--format 进一步控制显示哪些信息

删除容器

docker rm <docker_id>

创建容器需要一个镜像,这篇文章使用了Docker的常备镜像Ubuntu,下篇文章会介绍如何从获得其他镜像或者自制镜像

Docker镜像

列出镜像

docker images 显示镜像列表。本地镜像都保存在宿主机的/var/lib/docker目录下。

使用Docker Hub

Docker Hub是一个Docker公司运营的公共Registry服务,也可以搭建自己的私有Registry。先注册一个Docker Hub账号吧

国内从Docker Hub下载镜像速度是非常慢的,除了自备科学上网工具以外,还可以使用一些Docker加速器服务,我使用的是DaoCloud,配置后速度还是很快的。

可以在Docker Hub上浏览选择想要的镜像,然后使用如下命令

docker pull <image_name>:<image_tag> 拉取镜像。image_tag可以省略,它可以用来区分版本

docker search <search_key> 可以使用命令式的查找镜像

docker login/logout 和Git类似,本地操作远端库也是需要配置认证。用户的个人认证信息保存到$HOME/.docker/config.json中

构建镜像

如果想要客制化的镜像,可以自己构建。

一般都是基于一个已有的镜像构建,而不是从零构建一个全新的镜像。

一般是用Dockerfile构建镜像,就像编译需要的Makefile,Docker通过Dockerfile里的信息去构建

$ mkdir new_image_dir
$ cd new_image_dir
$ touch Dockerfile

创建一个构建环境(build context),即new_image_dir,并保存Dockerfile文件

#Version: 0.0.1
FROM ubuntu:14.04
MAINTAINER Shawn Chen "sc@163.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, I am in your container' \
    >/usr/share/nginx/html/index.html
EXPOSE 80

需要注意的是指令必须是大写字母

FROM 指定了基础镜像

MAINTAINER 设置作者信息

RUN 指定了运行的命令,每条命令都会创建一个新的镜像层,(镜像层是Docker镜像的一个很好的特性一个镜像可能有许多镜像层,每个镜像层都会有一个ID)如果该命令执行成功,就会将此镜像层提交,之后继续执行Dockerfile中的下一条命令。如果某条命令执行失败了,创建的镜像会停留在上一个镜像层,这非常有利于调试

EXPOSE 指定了向外部公开的端口,可以多个

除了这几个指令,还有CMD(容器启动时会运行的命令,就像系统启动项)、ENV(用来配置环境变量)、WORKDIR(设置工作目录,CMD指定的程序会在这个目录下执行),COPY(往镜像里复制文件,比如Nginx的html目录等)等等命令.

$ cd new_image_dir
$ sudo docker build -t="my-image:v0.0.1"

推送到Docker Hub

docker push <user_id>/<image_name> 推送到自己的镜像仓库

删除镜像

docker rmi <image_name> 删除本地镜像,如果要同时删除仓库里的镜像,需要登录到Registry里操作

我已经使用过Nginx和Redis的官方镜像,实在太方便。尤其是服务器比较多的情况,开发环境使用Docker,想要部署到线上服务器,只要build一下然后从镜像启动容器,什么软件都不用装了,环境也不需要配置了。我觉得这是和Spring Boot一样,会给我带来开发幸福感的工具,以后会经常使用它。