封尘网

让学习成为一种习惯!

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版本:

Client:
 Version:      1.8.2-el7.centos
 API version:  1.20
 Package Version: docker-1.8.2-10.el7.centos.x86_64
 Go version:   go1.4.2
 Git commit:   a01dc02/1.8.2
 Built:
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.2-el7.centos
 API version:  1.20
 Package Version:
 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服务:

yum install vsftp -y

挂载系统光盘:【由于实验都基于Centos7.1,这里就挂载Centos7.1光盘】

mount /dev/cdrom /mnt

并复制光盘里所有内容到FTP目录下:

cp -rf /mnt/* /var/ftp/pub/

启动FTP服务并加入开机启动:

service vsftpd start
chkconfig vsftpd on

测试是否成功:


[root@yum-server yum.repos.d]# curl ftp://10.0.10.99
drwxr-xr-x    4 0        0            4096 Jan 16 11:06 pub

能看到上面即ftp服务成功:

3、安装Docker服务【以下在Docker服务器上操作】

Centos7可以直接安装:

yum install docker-io -y

启动服务,并加入开机启动:

systemctl start docker.service
systemctl enable docker

执行命令查看Docker镜像

【刚装完肯定是空的,如何制作利用本地光盘制作Docker镜像可参考文文章:http://www.58jb.com/html/66.html】

[root@centos7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

根据上一篇文章我已经制作了一个镜像:

centos centos7.1.1503 fab4b1df8eb1 4 days ago 212.1 MB

4、由于Dockerfile是基于仓库镜像基础上生成新镜像的,如果本地仓库里没有,就会在网上下载,当然这有点背了【因为我都使用内网源了,那肯定是想避开网络资源】,所以这里制作Dockerfile文件是基本自己本地镜像制作。

4.1 建立一个目录【用作保存Dockerfile、内网源等文件,当然还可以有脚本】

[root@centos7 ~]# mkdir docker-swper

进入目录添加以下三个个文件:
使用内网YUM源的配置文件:

cat >cdrom.repo <<-EOF
    [local-yum]
    name=ftp-server
    baseurl=ftp://10.0.10.99/pub/centos7.1/
    gpgcheck=0
    enabled=1
    EOF

    Dockerfile文件:
cat >Dockerfile<<-EOF
    #First Dockerfile
    FROM centos:centos7.1.1503
    MAINTAINER swper "hz328@qq.com"

    ENV TZ "Asia/Shanghai"
    ENV TERM xterm
    RUN mkdir /etc/yum.repos.d/bak && cd /etc/yum.repos.d/ && mv /etc/yum.repos.d/*.repo bak/
    ADD cdrom.repo /etc/yum.repos.d/cdrom.repo

    RUN yum install -y httpd vim-minimal
    RUN yum clean all
    RUN mv /etc/yum.repos.d/bak/* /etc/yum.repos.d/
    RUN sed -i 's/#ServerName www.example.com:80/ServerName 127.0.0.1:80/' /etc/httpd/conf/httpd.conf
    EXPOSE 80
    ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]

    EOF

第三个只是作为一个测试主页,我一会挂载当前目录为容器的网站目录:

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、生成镜像【首次使用比较慢一点,再次生成时会就快了】

[root@centos7 docker-swper]$ docker build -t swper/centos:httpd .

执行过程:

Sending build context to Docker daemon 3.072 kB
Step 0 : FROM centos:centos7.1.1503
 ---> fab4b1df8eb1
Step 1 : MAINTAINER swper "hz328@qq.com"
 ---> Running in 8dc71f7999c6
 ---> 41af4c441912
Removing intermediate container 8dc71f7999c6
Step 2 : ENV TZ "Asia/Shanghai"
 ---> Running in f334dfae3a3e
 ---> d53bcb971ee3
Removing intermediate container f334dfae3a3e
Step 3 : ENV TERM xterm
 ---> Running in 8e08cf9f421f
 ---> 12fd4a67e974
Removing intermediate container 8e08cf9f421f
Step 4 : ADD cdrom.repo /etc/yum.repos.d/cdrom.repo
 ---> 4bb17716bc64
Removing intermediate container 9868229a912b
Step 5 : RUN yum install -y httpd
 ---> Running in 2b72e1b8c783
Loaded plugins: fastestmirror

最后成功会有如下提示:

Successfully built 6bfc915de694

检查当前仓库里的镜像:

[root@centos7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos7.1.1503      fab4b1df8eb1        4 days ago           212.1 MB
swper/centos        httpd               b1fbe8636389        2 hours ago          276.3 MB

6、最重要的来了【创建一个容器,看Apache是否成功运行】

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 【检查运行中的容器】
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                   NAMES
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服务:

[root@centos7 ~]# docker top web-016
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                8524                1808                0                   Jan17               pts/4               00:00:00            /bin/bash
root                8549                8524                0                   Jan17               ?                   00:00:01            /usr/sbin/httpd
48                  11699               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd
48                  11700               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd
48                  11701               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd
48                  11702               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd
48                  11703               8549                0                   00:04               ?                   00:00:00            /usr/sbin/httpd
48                  13330               8549                0                   00:27               ?                   00:00:00            /usr/sbin/httpd

当然最直接的方式就是打开网页查看:

[root@centos7 ~]# curl http://10.0.10.7:32768
<h1>This is Apache run on Docker.</h1>

最后上个图吧: