docker容器自动化部署落地实践之三:docker安装配置与dockerfile制做镜像

安装docker 

yum install -y docker-io

若是提示No package docker-io available,以下图,那么再安装epel


yum install -y epel-release
接下来再安装就ok了


制做镜像并提交到镜像仓库

因为咱们的应用程序是容器化的 因此这里咱们须要制做基础镜像 以便管理生产流水线上的环境 java

像这样的场景有不少 例如:linux

1.旧的应用环境使用的是ant+jdk1.6,新的应用环境使用的是maven+1.8,能不能有个专属于这些应用的环境,每次构建发布的时候,只要拿到我想要的环境而后直接发布便可docker

2.若是我为个人应用作多服务器负载均衡的话,那么若是我这个应用的环境一改变,是否须要到多台服务器上改变这些环境,有没有办法让这些应用环境一旦须要改变,就更新这些服务器上的环境呢shell

3.还有容器镜像复用等等等问题vim

以上的问题 docker的镜像制做均可觉得咱们解决centos

假设咱们的老系统用的是jdk1.6 有帐户模块 用户模块 管理模块 新系统用的是jdk1.8 有商品模块 订单模块 支付模块 缓存

咱们能够将镜像划分为几个层 基础镜像 用来选择系统版本 而后就是环境镜像 选择jdk或者构建工具 最后就是应用的镜像 好比说 咱们制做了一个jdk1.8的镜像 就能够提供给多个应用去使用这个镜像 咱们也不用再去构建环境之类的 bash

具体思路以下图 网上有些实践文章也是说最好不要加到四层更高 笔者项目当中仍是初次实践 还没加的这么多服务器


接下来就是咱们的准备工做 先到docker hub上边申请一个帐号 以便push镜像到仓库上边 ps: docker hub的速度比较慢 同窗们能够找国内的镜像仓库 笔者也在找 目前找的要钱的居多 这里就用docker hub作示范session

首先到docker hub上边注册一个帐号 https://hub.docker.com/ 以后会发送确认激活邮件 确认后就能够直接登陆了 界面以下


为本身的环境建立一个仓库 Create Repository


这里我就随便起个名字了 叫作base 那么咱们后边dockerfile上边from的镜像前缀就使用name/base:app-version这个格式

name通常就是用户名 base标识这个仓库 通常我我的用来标识这个仓库是干吗的 例如是基础环境仓库 app就是应用名 version就是应用版本 若是我制做的是jdk1.8的镜像 那么就是这样:huaihz/base:jdk-1.8 这个是我的习惯 固然同窗们有其余的用法的话也能够按照其余的方式去命名去用

这里咱们先制做一个基础的系统镜像 首先建立dockerfile目录

mkdir -p /usr/local/docker/dockerfile/centos/7/7.3
cd /usr/local/docker/dockerfile/centos/7/7.3/
编写Dockerfile

vim Dockerfile
FROM centos:centos7.3.1611#选择系统版本镜像 FROM命令是基于哪一个镜像制做
MAINTAINER huaihkiss <1174889899@qq.com>#编写做者信息
RUN yum install -y wget #安装wget RUN是执行shell命令
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup #备份默认源
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #为镜像添加国内源
RUN yum -y makecache #刷新源缓存
RUN yum install -y openssl openssh-clients initscripts iptables openssh-server net-tools #安装镜像必要程序
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key #配置登陆认证
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key #配置登陆认证
RUN mkdir /usr/local/soft #建立应用文件夹 待其余镜像使用
RUN touch /etc/pam.d/sshd #配置登陆认证
RUN sed -ri 's/sessionrequired pam_loginuid.so/#sessionrequired pam_loginuid.so/g' /etc/pam.d/sshd #配置登陆认证
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh #配置登陆认证
EXPOSE 22 #开放22端口 EXPOSE命令带上端口号为开放端口
RUN echo 'root:123456' | chpasswd #初始化密码
ENV LANG en_US.UTF-8 #配置环境变量
ENV LC_ALL en_US.UTF-8 #配置环境变量
CMD /usr/sbin/sshd -D #容器启动执行的命令
保存 而后编译镜像 

docker build -t huaihkiss/centos7-base:centos-7.3 .



命令解释 这里用docker build编译一个docker镜像 

参数-t的意思就是给镜像打上tag标签 后边带了 huaihkiss/centos7-base:centos-7.3这里的huaihkiss就是咱们dockerhub的用户名 centos7-base就是咱们建立的镜像仓库名 centos-7.3就是具体的镜像名称 注:这里笔者换了一个docker hub帐号 因此用户名如今就变成了huaihkiss 仓库名就变成了 centos7-base 笔者这个帐号里边的东西是现成的 后期也将用这个作演示


构建成功!查看全部镜像

docker images


能够发现镜像成功打上去了 接下来登陆docker hub帐号 将该镜像上传到dockerhub上边

docker login

上传镜像 

docker push huaihkiss/centos7-base:centos-7.3


上传成功以后 去docker-hub中对应的仓库查看 在tag下边看


docker-hub中的仓库已经有了 接下来基于这个系统镜像 再制做jdk镜像 

建立jdk的docker file目录

mkdir -p /usr/local/docker/file/java/jdk/jdk8/1.8
cd /usr/local/docker/file/java/jdk/jdk8/1.8

下载jdk文件到该目录中 以便将jdk放在镜像中

建立jdk的Dockerfile

vim Dockerfile
FROM huaihkiss/centos7-base:centos-7.3
#选择基础系统镜像 这里咱们FROM咱们上一步骤制做的系统镜像 填入他的完整tag
MAINTAINER huaihkiss <1174889899@qq.com>
ADD jdk-8u144-linux-x64.tar.gz /usr/local/soft
#将刚刚下载的jdk文件放在镜像中的soft文件夹中 也就是咱们上一步骤中建立的soft目录 注意 jdk的压缩包记得必定要放进去
#RUN tar -xf /usr/local/soft/jdk-8u144-linux-x64.tar.gz
ENV JAVA_HOME /usr/local/soft/jdk1.8.0_144
ENV PATH $PATH:$JAVA_HOME/bin
#这里他会自动解压 将jdk路径写到环境变量便可 格式为: ENV 变量名 变量值
CMD /usr/sbin/sshd -D
保存后 构建dockerfile

docker build -t huaihkiss/centos7-base:jdk-1.8 .

查看镜像 

docker images

如今用jdk镜像运行一个容器 看看能用不

docker run -it --name jdk-1.8-con huaihkiss/centos7-base:jdk-1.8 /bin/bash

测试java是否安装成功

java -version


ctrl+q+p退出容器交互 这种方式退出交互不会结束容器 

接下来查看全部容器 看看jdk容器详细信息

docker ps -a

ok  环境容器也制做完了 接下来若是想往上边再制做maven或者ant gradle等构建工具 的话 再基于这个镜像制做就好 

如今把jdk镜像也上传到docker-hub

docker push huaihkiss/centos7-base:jdk-1.8

查看docker-hub


ok 大功告成