dockerfile 实践

看过了这么多的教程,我仍然写不好一个 Dockerfile 文件233333333。主要原因还是没有自己动手实践,把自己的项目一行一行敲出来做成一个镜像。

在这篇文档中,我将在我 GitHub 上的项目 —— KeluLinuxKit 作为基础,对照其中的命令移植到 Dockerfile 里来。

准备


先看一下我原生的脚本:

install_openresty(){
    cd $DOWNLOAD
    aptitude -y install libreadline-dev libpcre3-dev libssl-dev libpq-dev
    wget https://openresty.org/download/ngx_openresty-1.9.7.1.tar.gz
    tar -xzvf ngx_openresty-1.9.7.1.tar.gz
    cd ngx_openresty-1.9.7.1/
    ./configure --prefix=/usr/share/openresty --with-pcre-jit --with-http_postgres_module --with-http_iconv_module --with-http_stub_status_module
    make && make install

    mkdir /var/local/nginx
    mkdir /var/local/log/nginx
    cp -R $NGINX_HOME /var/local
    cd /var/local/nginx
    mkdir conf/vhost

    cp $RESOURCE/nginx/* /var/local/nginx/
}

这部分命令行主要做的是 openresty 的下载、编译然后拷贝现有的配置,其中涉及的命令行的知识就不做解读了。

以下这个部分会非常长,嫌麻烦的可以直接跳到最后看结果。

dockerfile 介绍


接触过容器的朋友应该都知道,Dockerfile是由一系列命令和参数构成的脚本,使用 Dockerfile 可以创建容器的镜像。

一个Dockerfile里面包含了构建一个容器镜像的完整命令。Docker通过docker build执行Dockerfile中的一系列命令自动构建image

首先,我使用一个简单的例子介绍一下 dockerfile。 一个标准最小化的 dockerfile 格式应该是这样子的:

FROM nginx
MAINTAINER kelvinblood <xxx@xxx.org>
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
ENTRYPOINT ["nginx", "-g", "daemon off;"]

它包含四个部分:

  • 基础镜像(父镜像)信息
  • 维护者信息
  • 镜像操作命令
  • 容器启动命令

完成之后,我们只需要简单的的使用 docker build . 命令,就可以将它制作出来了。

以下介绍 Dockerfile 的常用命令:

  • build
  • FROM
  • MAINTAINER
  • USER
  • ENV
  • ARG
  • RUN
  • ADD
  • COPY
  • LABLE
  • ONBUILD
  • STOPSIGNAL
  • HEALTHCHECK
  • SHELL
  • CMD
  • EXPOSE
  • ENTRYPOINT
  • VOLUME
  • WORKDIR

Rancher 再学习(一)

前段时间转载了这篇《Rancher安装手册》文章, 也尝试着安装了一下,有了一些浅显的认识。今天从0开始又一次部署,算是对 Rancher 的再学习。 这一篇主要是将各种事先需要准备的一些东西。

使用的环境为 CentOS 7.4 ( cat /etc/redhat-release

事先准备几个命令,后边你可能会经常用到(但愿不需要用到)

docker kill $(docker ps -a -q) # 杀死所有正在运行的容器
docker rm $(docker ps -a -q)	# 删除所有已经停止的容器
docker rmi $(docker images -q)	# 删除所有镜像

重置 docker/rancher:

rm -rf /var/lib/docker
rm -rf /var/lib/rancher

Docker再安装

按照 Rancher 的官方推荐,使用 17.06 版本的 Docker。所以要先把本机的docker 卸载,再重新安装。

# 查看安装版本号、卸载
yum list installed | grep docker
yum -y remove docker-ce.x86_64

# 查看可用的版本
yum makecache fast
yum list docker-ce.x86_64 --showduplicates | sort -r

yum -y install docker-ce-17.06.0.ce

加速

安装成功后需要对 Docker 源进行加速。我试用 Docker 官方的加速办法:在 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。

touch /etc/docker/daemon.json
vi /etc/docker/daemon.json
{  
	"registry-mirrors": ["https://registry.docker-cn.com"]
}

重启 Docker 后生效。

开机自启动

systemctl enable docker
# Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

Rancher 安装

参照我先前的文章《Rancher安装手册》进行安装。

注意要使用 Chrome 访问 Rancher。在 IE 下会出现无法添加主机的情况(嗯,我踩过的坑。)

防火墙firewall

容器之间通信需要借助防火墙。使用 Rancher 添加不同主机的时候,就需要打通各个主机的通信,主要是 Rancher 服务器的默认 8080 端口和 IPsec 的 500、4500端口(UDP协议)。这里列几个,其他的我会再开一篇文章记录一下。

关于 firewall,只要记住服务和端口两个概念即可。

iptables -F; # 清除 iptables,防止两个防火墙冲突。
iptables -L;
firewall-cmd --zone=public --list-ports  # 查看所有打开的端口
firewall-cmd --list-services			# 查看开启的服务。
firewall-cmd --zone=public --add-port=80/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)							#  添加端口
firewall-cmd --permanent --add-service="ipsec"  # 添加服务
firewall-cmd --reload
systemctl start firewalld.server		# 重启 firewall

打了这么些命令,可以参考一下

检查远端端口是否可用

使用 nc 命令进行检测:

nc -v host port

出现 Connection refused 或者 Connected 都说明端口可用。如果出现 No route to host. 则说明端口未开放。例如:

参考资料


Rancher 中文文档 —— Rancher 安装

原文:http://rancher.com/docs/rancher/v1.6/en/installing-rancher/installing-server/

查看本系列翻译的目录

安装 Rancher 服务器


Rancher 由一系列的 Dcoekr 容器组成。 运行 Rancher 就像添加两个容器一样简单: 一个服务管理容器和一个作为客户端的节点容器。

注意:Rancher 服务器容器帮助选项docker run rancher/server --help