本次实验主要是介绍,如果利用内网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>
最后上个图吧: