Dockerfile利用内网YUM源制作镜像与Apache自启动容器


 本次实验主要是介绍,如果利用内网YUM源来安装Dockerfile中的软件,并制作成镜像,模拟生产环境中,避免大量安装软件导致网络堵塞问题。同进用新制作的镜像,运行一个Apache服务的容器,让它自动运行httpd服务,并挂载宿主机中的目录。

 

1、系统环境:

Docker宿主机:centos7.1.1503 【3.10.0-229.el7.x86_64】
内网YUM服务器:Centos6.5【2.6.32-431.el6.x86_64】
Docker版本:
 
  1. Client: 
  2.  Version:      1.8.2-el7.centos 
  3.  API version:  1.20 
  4.  Package Version: docker-1.8.2-10.el7.centos.x86_64 
  5.  Go version:   go1.4.2 
  6.  Git commit:   a01dc02/1.8.2 
  7.  Built:         
  8.  OS/Arch:      linux/amd64 
  9.  
  10. Server: 
  11.  Version:      1.8.2-el7.centos 
  12.  API version:  1.20 
  13.  Package Version:  
  14.  Go version:   go1.4.2 
 Git commit:   a01dc02/1.8.2
 Built:        
 OS/Arch:      linux/amd64
 
IP分配:
Docker宿主机:10.0.10.7
YUM服务器:10.0.10.99
 
 
2、搭建内网YUM服务器:【在10.0.10.99上操作】
安装VSFTP服务
 
  1. yum install vsftp -y 
挂载系统光盘:【由于实验都基于Centos7.1,这里就挂载Centos7.1光盘】
 
  1. mount /dev/cdrom /mnt 
并复制光盘里所有内容到FTP目录下:
 
  1. cp -rf /mnt/* /var/ftp/pub/ 
启动FTP服务并加入开机启动:
 
  1. service vsftpd start 
  2. chkconfig vsftpd on 
测试是否成功:
 
  1. [root@yum-server yum.repos.d]# curl ftp://10.0.10.99 
  2. drwxr-xr-x    4 0        0            4096 Jan 16 11:06 pub 
能看到上面即ftp服务成功:
 
3、安装Docker服务【以下在Docker服务器上操作】
Centos7可以直接安装:
 
  1. yum install docker-io -y 
启动服务,并加入开机启动:
 
  1. systemctl start docker.service 
  2. systemctl enable docker 
执行命令查看Docker镜像
      【刚装完肯定是空的,如何制作利用本地光盘制作Docker镜像可参考文文章:http://www.58jb.com/html/66.html】
 
  1. [root@centos7 ~]# docker images 
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE 
  3. 根据上一篇文章我已经制作了一个镜像: 
  4. centos              centos7.1.1503      fab4b1df8eb1        4 days ago        212.1 MB 
 
4、由于Dockerfile是基于仓库镜像基础上生成新镜像的,如果本地仓库里没有,就会在网上下载,当然这有点背了【因为我都使用内网源了,那肯定是想避开网络资源】,所以这里制作Dockerfile文件是基本自己本地镜像制作。
 
4.1 建立一个目录【用作保存Dockerfile、内网源等文件,当然还可以有脚本】
  1. [root@centos7 ~]# mkdir docker-swper 
进入目录添加以下三个个文件:
使用内网YUM源的配置文件:
  1. cat >cdrom.repo <<EOF 
  2.     [local-yum] 
  3.     name=ftp-server 
  4.     baseurl=ftp://10.0.10.99/pub/centos7.1/ 
  5.     gpgcheck=0   
  6.     enabled=1 
  7.     EOF 
 
Dockerfile文件:
  1. cat >Dockerfile<<EOF 
  2.     #First Dockerfile     
  3.     FROM centos:centos7.1.1503 
  4.     MAINTAINER swper "hz328@qq.com" 
  5.  
  6.     ENV TZ "Asia/Shanghai" 
  7.     ENV TERM xterm 
  8.     RUN mkdir /etc/yum.repos.d/bak && cd /etc/yum.repos.d/ && mv /etc/yum.repos.d/*.repo bak/ 
  9.     ADD cdrom.repo /etc/yum.repos.d/cdrom.repo 
  10.  
  11.     RUN yum install -y httpd vim-minimal 
  12.     RUN yum clean all 
  13.     RUN mv /etc/yum.repos.d/bak/* /etc/yum.repos.d/ 
  14.     RUN sed -i 's/#ServerName www.example.com:80/ServerName 127.0.0.1:80/' /etc/httpd/conf/httpd.conf 
  15.     EXPOSE 80 
  16.     ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"] 
  17.  
  18.     EOF 
 
第三个只是作为一个测试主页,我一会挂载当前目录为容器的网站目录:
 
  1. echo "<h1>This is Apache run on Docker.</h1>>index.html 
Dockerfile中的参数简单讲解:
第一行#号开头为注释:
第二行:FROM centos:centos7.1.1503 指定镜像基础来自本地的仓库中镜像,名字要对应不然会在网上搜了
第三行,不多说那是个人信息:
第四、五行设置时区,的终端。
第六行,为了确保走内网源,我所原来的配置文件移到bak/目录下,跟第十行对应的,【还原】
第七行,把当前目录下的cdrom.repo追加到镜像的/etc/yum.repos.d/目录下
第八行,yum安装httpd,VIm软件。【由于只是使用了光盘源,如果同步了网上的源那软件就多了】
第十一行,去掉Apache启动时弹出的一个提示:你懂的。
第十二行,大家都说暴露80端口,它就是把容器的80端口可以影射到宿主中。【如果运行容器时不使用-p 80也没用 】
最后一个很重要,就是容器运行后,它会自动运行httpd服务,不需要我们手工开启。【还有其它方法,如加载脚本等。】
 
 
5、生成镜像【首次使用比较慢一点,再次生成时会就快了】
 
  1. [root@centos7 docker-swper]$ docker build -t swper/centos:httpd . 
执行过程:
 
  1. Sending build context to Docker daemon 3.072 kB 
  2. Step 0 : FROM centos:centos7.1.1503 
  3.  ---> fab4b1df8eb1 
  4. Step 1 : MAINTAINER swper "hz328@qq.com" 
  5.  ---> Running in 8dc71f7999c6 
  6.  ---> 41af4c441912 
  7. Removing intermediate container 8dc71f7999c6 
  8. Step 2 : ENV TZ "Asia/Shanghai" 
  9.  ---> Running in f334dfae3a3e 
  10.  ---> d53bcb971ee3 
  11. Removing intermediate container f334dfae3a3e 
  12. Step 3 : ENV TERM xterm 
  13.  ---> Running in 8e08cf9f421f 
  14.  ---> 12fd4a67e974 
  15. Removing intermediate container 8e08cf9f421f 
  16. Step 4 : ADD cdrom.repo /etc/yum.repos.d/cdrom.repo 
  17.  ---> 4bb17716bc64 
  18. Removing intermediate container 9868229a912b 
  19. Step 5 : RUN yum install -y httpd 
  20.  ---> Running in 2b72e1b8c783 
  21. Loaded plugins: fastestmirror 
  22. 最后成功会有如下提示: 
  23. Successfully built 6bfc915de694 
 
检查当前仓库里的镜像:
 
  1. [root@centos7 ~]# docker images 
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE 
  3.  
  4. centos              centos7.1.1503      fab4b1df8eb1        4 days ago           212.1 MB 
  5.  
  6. swper/centos        httpd               b1fbe8636389        2 hours ago          276.3 MB 
 
6、最重要的来了【创建一个容器,看Apache是否成功运行】
 
  1. docker run -it -p 80 --name web-016 -d -v "$PWD":/var/www/html/ swper/centos:httpd 
参数简单说明:
-it:标准输入输出,可以不加,加了可以进入容器,查看,操作。
-p 80:启用端口影射
--name:根据自己情况定义一个另名,方便识别。
-d:允许后台运行,不加会启动后就结束,在WEB应用中必须加上。【除了作为数据卷时可以不加】
-v "$PWD":/var/www/html/把当前的目录挂载到容器的/var/www/html/目录,因变yum安装后Apache的网站目录就是那里。
swper/centos:httpd :使用哪个镜像,就是刚才Dockerfile文件制作的新镜像。
 
 
[root@centos7 ~]# docker ps 【检查运行中的容器】
 
  1. CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                   NAMES 
  2.  
  3. 0a713e6ccc7a        swper/centos:httpd   "/bin/bash"              2 hours ago         Up 2 hours          0.0.0.0:32768->80/tcp   web-016 
可以看到0.0.0.0:32768->80/tcp表示,容器的80端口已经影射到宿主机的32768端口上。
 
可以检查是否成功启动Apache服务:
 
  1. [root@centos7 ~]# docker top web-016 
  2.  
  3. UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD 
  4. root                8524                1808                0                   Jan17               pts/4               00:00:00            /bin/bash 
  5. root                8549                8524                0                   Jan17               ?                   00:00:01            /usr/sbin/httpd 
  6. 48                  11699               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd 
  7. 48                  11700               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd 
  8. 48                  11701               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd 
  9. 48                  11702               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd 
  10. 48                  11703               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd 
  11. 48                  13330               8549                0                   00:27               ?                   00:00:00            /usr/sbin/httpd 
当然最直接的方式就是打开网页查看:
 
  1. [root@centos7 ~]# curl http://10.0.10.7:32768 
  2. <h1>This is Apache run on Docker.</h1> 

最后上个图吧: