1、Dockerfile简介
Dockerfile是由一些列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
作用
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;3、对于运维人员:在部署时,可以实现应用的无缝移植。
组成命令作用FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name声明镜像的创建者
ENV key value设置环境变量 (可以写多条)
RUN command是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
CPOY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir设置工作目录
EXPOSE port1 prot2用来指定端口,使容器内的应用可以通过端口和外界交互
CMD argument在构建容器时使用,会被docker run 后的argument覆盖
ENTRYPOINT argument和CMD相似,但是并不会被docker run指定的参数覆盖
VOLUME将本地文件夹或者其他容器的文件挂载到容器中
构建镜像
创建完一个Dockerfile文件之后并在其当前目录下运行docker build -t new_image_name:tag .命令生成一个新的镜像
2、中间件Dockerfile等相关文件及镜像的构建
本次我们仅将中间件部分转移到docker中,数据库依旧是用原来虚拟机上的数据库,所以我们的Dockerfile主要任务有:配置中间件运行环境(依赖包及环境变量)
配置oracle即时客户端,用于连接原虚拟机的数据库
其他一些杂项配置等
Dockerfile# 选择一个已有的os镜像作为基础
FROM centos:latest
# 镜像的作者
MAINTAINER quxun "quxun10433@hundsun.com"
# 设置环境变量
ENV LANG zh_CN.UTF-8
ENV NLS_LANG "AMERICAN_AMERICA.ZHS16GBK"
ENV ORACLE_HOME /opt/oracle/instantclient_10_2
ENV TNS_ADMIN /opt/oracle/instantclient_10_2
ENV FBASE_HOME /home/hundsun/linux.i386
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/oracle/instantclient_10_2:/home/hundsun/linux.i386/lib:/home/hundsun/appcom
ENV PATH $PATH:/opt/oracle/instantclient_10_2:/home/hundsun/linux.i386/bin:.
ENV TERM $TERM:dumb
# 拷贝oracle即时客户端,用于连接数据库
ADD ./source/basic-10.2.0.5.0-linux.zip /opt/oracle/
ADD ./source/sqlplus-10.2.0.5.0-linux.zip /opt/oracle/
ADD ./source/profile /opt/oracle/
ADD ./source/tnsnames.ora /opt/oracle/
# 安装设置ssh,新增hundsun,oracle用户,设置环境变量,配置oracle即时客户端,安装中间件依赖的包
RUN yum install -y openssh-server && \
yum -y install openssh-clients && \
sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && \
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && \
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" && \
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" && \
echo "root:hundsun" | chpasswd && \
yum install -y unzip && \
unzip /opt/oracle/basic-10.2.0.5.0-linux.zip -d /opt/oracle/ && \
unzip /opt/oracle/sqlplus-10.2.0.5.0-linux.zip -d /opt/oracle/ && \
ln -s /opt/oracle/instantclient_10_2/libclntsh.so.10.1 /opt/oracle/instantclient_10_2/libclntsh.so && \
ln -s /opt/oracle/instantclient_10_2/libocci.so.10.1 /opt/oracle/instantclient_10_2/libocci.so && \
yum install -y glibc.i686 && \
yum install -y libaio && \
yum install -y libstdc++-4.8.5-16.el7.i686 &&\
yum install -y libxml2-2.9.1-6.el7_2.3.i686 &&\
yum install -y psmisc && \
ln -s /usr/lib/libcurl.so.4 /usr/lib/libcurl.so.3 && \
cat /opt/oracle/tnsnames.ora >> /opt/oracle/instantclient_10_2/tnsnames.ora && \
cat /opt/oracle/profile >> /root/.bash_profile && \
useradd hundsun && \
echo "hundsun:hundsun" | chpasswd && \
cat /opt/oracle/profile >> /home/hundsun/.bash_profile && \
useradd oracle && \
echo "oracle:hundsun" | chpasswd && \
cat /opt/oracle/profile >> /home/oracle/.bash_profile
# 创建挂载点,注意在run时需用-v实际指定具体的宿主机目录
VOLUME ["/home/hundsun/workspace","/home/hundsun/appcom","/home/hundsun/linux.i386"]
# 暴漏22 9002 9004端口
EXPOSE 22 9002 9004
# 启动sshd服务
CMD ["/usr/sbin/sshd", "-D"]
镜像制作
新建/qx/centos_ssh文件夹,将Dockerfile拷贝到目录下,并新建source文件夹,文件夹中存放如下资料[root@localhost centos_ssh]# pwd
/qx/centos_ssh[root@localhost centos_ssh]# ll
-rw-rr. 1 root root 2520 Oct 10 13:54 Dockerfile
drwxr-xr-x. 2 root root 189 Oct 10 10:43 source[root@localhost source]# ll
-rw-rr. 1 root root 34813238 Oct 9 14:30 basic-10.2.0.5.0-linux.zip
-rw-rr. 1 root root 432 Oct 10 10:12 profile
-rw-rr. 1 root root 747944 Oct 9 14:43 sqlplus-10.2.0.5.0-linux.zip
-rw-rr. 1 root root 1797 Oct 10 10:40 tnsnames.ora
上面basic-10.2.0.5.0-linux.zip、sqlplus-10.2.0.5.0-linux.zip为oracle即时客户端,profile中是环境变量,tnsnames.ora是我们需要连接的tns配置,可以直接从待迁移机器上拷过来即可。切换到/qx/centos_ssh目录下,执行docker build -t centos_mid .
等待镜像构建完成,可能需要一会儿完成之后,执行docker images
查看镜像列表
3、通过上面构建出来的镜像创建容器
Dockerfile中我们说过创建挂载点,注意在run时需用-v实际指定具体的宿主机目录我们先将hundsun下的三个目录,包括appcom,linux.i386,workspace拷贝到宿主机器上,例如放在[root@localhost uf_114]# pwd
/home/hundsun/uf_114
[root@localhost uf_114]# ll
drwxrwxr-x. 2 hundsun hundsun 36864 Oct 10 09:49 appcom
drwxrwxr-x. 4 hundsun hundsun 28 Oct 10 09:47 linux.i386
drwxrwxr-x. 10 hundsun hundsun 4096 Oct 10 11:00 workspace
然后我们创建容器时就将/home/hundsun/uf_114下的三个目录分别挂载到我们容器中的/home/hundsun/下的三个目录中[hundsun@d64e4b7c1af2 ~]$ pwd
/home/hundsun
[hundsun@d64e4b7c1af2 ~]$ ll
drwxrwxr-x. 2 hundsun hundsun 36864 Oct 10 09:49 appcom
drwxrwxr-x. 4 hundsun hundsun 28 Oct 10 09:47 linux.i386
drwxrwxr-x. 10 hundsun hundsun 4096 Oct 10 11:00 workspace
除此之外,我们还需要根据需要映射端口,如22,9002,9004等。最终,我们的命令如下docker run -d -p 2225:22 -p 9002:9002 -p 9004:9004 privileged shm-size=4G
-v /home/hundsun/uf_114/workspace/:/home/hundsun/workspace
-v /home/hundsun/uf_114/appcom/:/home/hundsun/appcom
-v /home/hundsun/uf_114/linux.i386/:/home/hundsun/linux.i386/ name centos_mid_uf centos_mid:latest
由于我们Dockerfile中最后有一条启动ssh的cmd,所以这里我们不用docker run -it xxx /bin/bash,而是用-d后台运行,因为如果有docker run -it xxx /bin/bash,就会覆盖Dockerfile中的最后一条cmd命令,导致ssh不能正常启动上面执行成功后,我们通过docker exec -it centos_mid_uf bash
进入容器,后面就是与原来虚拟机操作一样的了。由于上面我们上面映射了2225端口到22端口上,所以我们可以直接通过宿主机ip:2225连接到容器中,可通过xshell,xftp等工具直接连接。还有9002和9004端口,也可以通过hsadmin,客户端等直接连接宿主机,即可连接到容器内。而我们挂载的三个文件夹,则可以直接连接宿主机进行升级操作,会同步更新到容器内。
4、通过Dockefile安装oracle11.2.0.4
上面主要是完成了中间件环境Dockerfile的编写及构建,数据库依旧采用的是虚拟机管理,那么接下来我们写一个安装oracle的Dockerfile,由于有了上面的基础,这里就大概的介绍一下流程。
手工安装oracle是一个非常麻烦的事情,需要改一堆配置,需要尝试的可以看看这篇文章。
在上找到了一个写好的,但是有点问题,我们就是基于此来修改并新增一些个性化的功能,fork了一个到。
然后我们将上面所需要的文件都放到docker宿主机上,如下Dockerfile及所需脚本文件放在/qx/oracle_image下:
[root@localhost oracle_image]# pwd
/qx/oracle_image
[root@localhost oracle_image]# ll
total 4
drwxr-xr-x. 2 root root 245 Oct 17 14:10 assets
-rw-rr. 1 root root 637 Oct 17 15:53 Dockerfile/qx/oracle_image/assets中的文件为:
[root@localhost assets]# pwd
/qx/oracle_image/assets
[root@localhost assets]# ll
total 144
-rw-rr. 1 root root 2573 Oct 16 17:39 CentOS-Base.repo
-rw-rr. 1 root root 255 Oct 13 15:14 colorecho
-rw-rr. 1 root root 74826 Oct 17 13:35 dbca.rsp
-rw-rr. 1 root root 25242 Oct 13 15:14 db_install.rsp
-rw-rr. 1 root root 2531 Oct 17 14:55 entrypoint_oracle.sh
-rw-rr. 1 root root 239 Oct 13 15:14 entrypoint.sh
-rw-rr. 1 root root 604 Oct 13 15:14 install.sh
-rw-rr. 1 root root 119 Oct 13 15:14 limits.conf
-rw-rr. 1 root root 461 Oct 13 15:14 profile
-rw-rr. 1 root root 129 Oct 13 15:14 run_installer.sh
-rw-rr. 1 root root 1833 Oct 17 16:10 setup.sh
-rw-rr. 1 root root 301 Oct 13 15:14 sysctl.conf数据库安装包放在/qx/database下:
[root@localhost database]# pwd
/qx/database
[root@localhost database]# ll
total 44
drwxr-xr-x. 4 root root 248 Aug 27 2013 install
-rw-rr. 1 root root 30016 Aug 27 2013 readme.html
drwxr-xr-x. 2 root root 61 Aug 27 2013 response
drwxr-xr-x. 2 root root 34 Aug 27 2013 rpm
-rwxr-xr-x. 1 root root 3267 Aug 27 2013 runInstaller
drwxr-xr-x. 2 root root 29 Aug 27 2013 sshsetup
drwxr-xr-x. 14 root root 4096 Aug 27 2013 stage
-rw-rr. 1 root root 500 Aug 27 2013 welcome.html
先看下Dockerfile[root@localhost oracle_image]# cat Dockerfile
FROM centos:7
#基于https://github.com/jaspeen/oracle-11g
#https://github.com/quxiaozha/oracle-11g/tree/master/assets
MAINTAINER quxun
ADD assets /assets
#设置时区 设置yum源为阿里云 执行oracle安装前置脚本
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \
&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
&& curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
&& yum clean all \
&& chmod -R 755 /assets \
&& /assets/setup.sh
EXPOSE 22 1521 8080
CMD ["/assets/entrypoint.sh"]
其实主要的几个步骤是:/assets/setup.sh脚本中主要是安装oracle所需依赖、oracle用户组、以及修改一些系统文件以满足oracle安装检查,新增了安装ssh服务
切换目录到/qx/oracle_image/下,通过docker bulid -t oracle .构建一个名为oracle的镜像
构建完镜像,Dockerfile的任务已经完成,接着创建并启动容器
docker run privileged shm-size=4G name oracle-container -p 1521:1521 -p 2222:22
-v /qx/database:/install/database oracle
/assets/entrypoint.sh是在创建容器时执行的,里面主要安装oracle,通过调用/assets/install.sh安装
安装完或者已经安装(比如第二次启动时),继续执行/assets/entrypoint_oracle.sh脚本
/assets/entrypoint_oracle.sh这个脚本主要时建库以及启动数据库
至此,数据库已经安装完毕,建库完毕,启动完毕。
linux用户名/密码:root/install
oracle/install
数据库SERVICE_NAME = ORCL,sys密码oracle