使用Dockerfile可以允许用户创建自定义的镜像
Dockerfile一般由一条条语句组成,并支持以 # 开头的注释行
一般来说Dockerfile分为四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
一、创建支持apache服务的docker镜像
1、编写支持apache的Dockerfile
[root@foundation51 ~]# mkdir /tmp/docker
[root@foundation51 ~]# cd /tmp/docker/
[root@foundation51 docker]# vim Dockerfile
FROM rhel7
MAINTAINER zh@163.com
ENV HOSTNAME server1
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
[root@foundation51 docker]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.51.250/rhel7.3
gpgcheck=0
2、删除上层镜像,保留rhel7最底层镜像
[root@foundation51 docker]# docker images rhel7 ##显示当前系统 docker rhel7 库中的所有镜像
[root@foundation51 docker]# docker rmi rhel7:v3 ##删除上层镜像,留下最底层
[root@foundation51 docker]# docker rmi rhel7:v2
[root@foundation51 docker]# docker rmi rhel7:v1
[root@foundation51 docker]# docker rmi rhel7:super
[root@foundation51 docker]# docker rmi rhel7:ssh
[root@foundation51 docker]# docker rmi rhel7:apache
- 显示当前系统 docker rhel7 库中的所有镜像
- 删除上层镜像后,留下的最底层镜像
3、构建镜像
[root@foundation51 docker]# docker build -t rhel7:apache .
- 查看构建的apache镜像
4、测试apache
[root@foundation51 docker]# vim index.html ##编写测试页
www.Hannah_zh.org
[root@foundation51 ~]# docker run -d --name vm1 rhel7:apache ##创建并运行vm1容器
[root@foundation51 docker]# docker container cp index.html vm1:/var/www/html
- 测试apache服务
二、创建支持ssh服务的docker镜像
1、编写支持ssh的Dockerfile
[root@foundation51 docker]# vim Dockerfile
FROM rhel7
MAINTAINER zh@163.com
ENV HOSTNAME server2
EXPOSE 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server openssh-clients && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N "" && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -q -N "" && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -q -N "" && echo root:redhat | chpasswd
CMD ["/usr/sbin/sshd", "-D"]
2、构建镜像
[root@foundation51 docker]# docker build -t rhel7:ssh .
3、测试sshd服务
[root@foundation51 docker]# docker run -d --name vm2 -p 2222:22 rhel7:ssh ##端口映射
[root@foundation51 docker]# ssh -p 2222 root@172.25.51.250 ##测试sshd服务
- 查看创建并运行的vm2容器
- iptables -t nat -nL 查看外部访问容器的NAT规则
- 测试sshd服务
三、创建支持supervisord服务的docker镜像
CMD 如果只有一个命令,那如果我们需要运行多个服务怎么办呢?
最好的办法是分别在不同的容器中运行,通过 link 进行连接,比如先前实验中用到的web、app、db 容器。如果一定要在一个容器中运行多个服务可以考虑用 Supervisord 来进行进程管理,方式就是将多个启动命令放入到一个启动脚本中。
1、编写supervisord.conf文件
[root@foundation51 docker]# vim supervisord.conf
[supervisord]
nodaemon=true
[program:httpd]
command=/usr/sbin/httpd
[program:ssh]
command=/usr/sbin/sshd -D
2、编写dvd.repo文件
[root@foundation51 docker]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.51.250/rhel7.3
gpgcheck=0
[supervisor]
name=supervisor
baseurl=http://172.25.254.250/pub/docker ##镜像
gpgcheck=0
3、编写apache测试页
[root@foundation51 docker]# vim index.html ##编写测试页
www.Hannah_zh.org
4、编写支持supervisord的Dockerfile(同时运行apache、sshd服务)
[root@foundation51 docker]# vim Dockerfile
FROM rhel7
MAINTAINER zh@163.com
ENV HOSTNAME server3
EXPOSE 22 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y openssh-server openssh-clients httpd supervisor && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -q -N "" && ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -q -N "" && ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -q -N "" && echo root:redhat | chpasswd
COPY supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord"]
5、构建镜像
[root@foundation51 docker]# docker build -t rhel7:supervisord .
6、测试
- 创建容器vm3并端口映射
[root@foundation51 docker]# docker run -d --name vm3 -p 8080:80 -v /tmp/docker/:/var/www/html rhel7:supervisord
- 查看容器vm3的ip地址
[root@foundation120 ns]# docker inspect vm3 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",
- 测试sshd服务
[root@foundation120 docker]# ssh root@172.17.0.4
- 测试apache服务
[root@foundation51 docker]# curl http://172.25.51.250:8080/
www.Hannah_zh.org