Dockerfile创建镜像(ssh,http,nginx,tomcat,supervisor)

一,使用Dockerfile创建docker-ssh镜像:

mkdir /tmp/docker/Dockerfile
cd  /tmp/docker/Dockerfile

vim Dolcerfile
FROM rhel7        #指定基础镜像
MAINTAINER ly@test.com   #作者信息
ENV HOSTNAME server1   #设置容器主机名
EXPOSE 22    #容器对外开放的端口
COPY dvd.repo /etc/yum/repos.d/dvd.repo     #复制本地文件到容器中
RUN yum install -y openssh-clients openssh-server && yum clean all && 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"]

vim dvd.repo
[dvd]                                                                   
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0

在Docerfile的目录下
docker build -t rhel7:test1 .     #创建rhel7:test1镜像,包含ssh服务
docker run -d --name vm1 rhel7:test1  #使用rhel7:test1镜像创建容器
docker inspect vm1    #查看容器信息
ssh root@172.17.0.2    #测试

查看创建ssh镜像的过程:
这里写图片描述

二,使用Dockerfile创建docker-http镜像:

mkdir /tmp/docker/Dockerfile
cd /tmp/docker/Dockerfile

[root@foundation92 Dockerfile]# cat Dockerfile 
FROM rhel7
MAINTAINER ly@test.com
ENV HOSTNAME server2
EXPOSE 80
COPY dvd.repo /etc/yum/repos.d/dvd.repo
RUN yum install -y httpd && yum clean all
VOLUME ["/var/www/html"]
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

[root@foundation92 Dockerfile]# cat dvd.repo 
[dvd]                                                                 
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0

[root@foundation92 Dockerfile]# pwd
/tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# docker build -t rhel7:httpd .

mkdir /tmp/html
cd /tmp/html
vim index.html
<h1>Docker-httpd create sucessfully!</h1>

docker run -d -v /tmp/html/:/var/www/html --name httpd2 rhel7:httpd   #创建容器httpd2
docker inspect httpd2    #查看容器信息

测试:
这里写图片描述

docker save -o apache.tar rhel7:http #保存为本地tar文件。

三,使用Dockerfile创建tomcat镜像(rpm):

docker rm -f `docker ps -aq`


mkdir /tmp/docker/Dockerfile
cd /tmp/docker/Dockerfile

[root@foundation92 Dockerfile]# cat Dockerfile 
FROM rhel7
MAINTAINER ly@test.com
ENV HOSTNAME server3
EXPOSE 8080
COPY dvd.repo /etc/yum/repos.d/dvd.repo
RUN yum install -y tomcat && yum clean all
VOLUME ["/var/lib/tomcat/webapps/ROOT"]
CMD ["/usr/libexec/tomcat/server","start"]

[root@foundation92 Dockerfile]# cat dvd.repo 
[dvd]                                                                 
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0

[root@foundation92 Dockerfile]# pwd
/tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# docker build -t rhel7:tomcat .

[root@foundation92 html]# pwd
/tmp/html
[root@foundation92 html]# cat index.jsp 
Now time is: <%=new java.util.Date()%>

docker run -d --name tomcat1 -p 80:8080 -v /tmp/html/:/var/lib/tomcat/webapps/ROOT rhel7:tomcat

测试:
这里写图片描述
可以看见Tomcat容器创建成功。

使用tomcat源码构建tomcat镜像:

vim Dockerfile
FROM rhel7
MAINTAINER ly@test.com
ENV HOSTNAME server4
ENV JAVA_HOME /usr/local/jdk1.7.0_79
EXPOSE 8080
ADD jdk-7u79-linux-x64.tar.gz /uar/local/
ADD apache-tomcat-7.0.37.tar.gz /usr/local/
VOLUME ["/usr/lcoal/apache-tomcat-7.0.37/webapps/ROOT"]
CMD ["/usr/local/apache-tomcat-7.0.37/bin/startup.sh"]                          
~                                                         

Dockerfile创建supervisor

CMD 如果只有一个命令,那创建如果我们需要运行多个服务怎么办呢?最好的办法是分别在不同的容器中运行,通过 link 进行连接,比如先前实验中用到的 web,app,db 容器。如果一定要在一个容器中运行多个服务可以考虑用 Supervisord 来进行进程管理,方式就是将多个启动命令放入到一个启动脚本中。

[root@foundation92 Dockerfile]# pwd
/tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# ls 
Dockerfile  dvd.repo  supervisord.conf

[root@foundation92 Dockerfile]# cat Dockerfile 
FROM rhel7
MAINTAINER test@mirro.com
ENV HOSTNAME server5
EXPOSE 80 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN yum install -y httpd openssh-clients openssh-server supervisor  && yum clean all && 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:westos | chpasswd
COPY supervisord.conf /etc/supervisord.conf
VOLUME ["/var/www/html"]
CMD ["/usr/bin/supervisord"]

[root@foundation92 Dockerfile]# cat dvd.repo 
[dvd]
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0

[update]
name=update
baseurl=ftp://172.25.92.250/pub/docker           #用于下载supervisor的yum源
gpgcheck=0

[root@foundation92 Dockerfile]# cat supervisord.conf  #配置文件,如果有多个服务需要启动可以在文件后继续添加[program:xxx]
[supervisord]
nodaemon=true
[program:httpd]
command=/usr/sbin/httpd
[program:sshd]
command=/usr/sbin/sshd -D

[root@foundation92 Dockerfile]# docker build -t rhel7:image1 .  #根据Dockerfile创建镜像

[root@foundation92 Dockerfile]# docker run -d --name vm2 -v /tmp/docker/html:/var/www/html rhel7:image1         #创建容器
[root@foundation92 Dockerfile]# ssh 172.17.0.3  
The authenticity of host '172.17.0.3 (172.17.0.3)' can't be established.
ECDSA key fingerprint is 9d:1a:fd:f1:39:d4:8f:c1:34:d0:c9:07:49:e2:07:ec.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.3' (ECDSA) to the list of known hosts.
root@172.17.0.3's password: 
-bash-4.2# yum install -y net-tools
-bash-4.2# netstat -antlp       #可以看见容器对外开方的端口22,80全部开启
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      9/sshd              
tcp        0      0 172.17.0.3:54663        172.25.92.250:80        TIME_WAIT   -                   
tcp        0      0 172.17.0.3:54660        172.25.92.250:80        TIME_WAIT   -                   
tcp        0      0 172.17.0.3:54667        172.25.92.250:80        TIME_WAIT   -                   
tcp        0      0 172.17.0.3:54664        172.25.92.250:80        TIME_WAIT   -                   
tcp        0      0 172.17.0.3:59728        172.25.92.250:21        TIME_WAIT   -                   
tcp        0      0 172.17.0.3:22           172.17.0.1:49074        ESTABLISHED 20/sshd: root@pts/0 
tcp6       0      0 :::80                   :::*                    LISTEN      10/httpd            
tcp6       0      0 :::22                   :::*                    LISTEN

Dockerfile中常用指令:

  1. 指定容器运行的用户
    该用户将作为后续的 RUN 命令执行的用户。
    一些需要指定用
    户来运行的应用部署时非常关键,比如提供 hadoop 服务的容器通常会使用 hadoop 用户来启动服务。
    命令使用方式,例如使用 shiyanlou 用户来执行后续命令:
    USER shiyanlou

  2. 指定后续命令的执行目录
    由于我们需要运行的是一个静态网站,将启动后的工作目录切换到/var/www/html 目录:WORKDIR /var/www/html

  3. 对外连接端口号
    由于内部服务会启动 Web 服务,我们需要把对应的 80 端口暴露出来,可以提供给容器间互联使用,可以使用 EXPOSE 命令。
    在镜像操作部分增加下面一句:
    EXPOSE 80

  4. 设置容器主机名
    ENV 命令能够对容器内的环境变量进行设置:
    ENV HOSTNAME sevrer1.example.com

  5. 向镜像中增加文件
    向镜像中添加文件有两种命令:COPY 和 ADD。
    COPY 命令可以复制本地文件夹到镜像中:
    COPY website /var/www/html
    ADD 命令支持添加本地的 tar 压缩包到容器中指定目录,压缩包会被自动解压为目录,也可以自动下载 URL 并拷贝到镜像,例如:
    ADD html.tar /var/www
    ADD http://www.westos.org/html.tar /var/www
    根据实验需求,我们把需要的一个网站放到镜像里,需要把一个 tar 包添加到 apache 的
    /var/www 目录下,因此选择使用 ADD 命令:
    ADD html.tar /var/www

  6. CMD 与 ENTRYPOINT
    ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与CMD 的 区 别 是 不 可 以 被 docker run 覆 盖 , 会 把 docker run 后 面 的 参 数 当 作 传 递 给ENTRYPOINT 指令的参数。Dockerfile 中只能指定一个 ENTRYPOINT,如果指定了很多,只 有 最 后 一 个 有 效 。 docker run 命 令 的 -entrypoint 参 数 可 以 把 指 定 的 参 数 继 续 传 递 给ENTRYPOINT。

  7. 挂载数据卷
    将 apache 访问的日志数据存储到宿主机可以访问的数据卷中:
    VOLUME [“/var/log/apche2”]

  8. 设置容器内的环境变量
    使用 ENV 设置一些 apache 启动的环境变量:
    ENV APACHE_RUN_USER www-data
    ENV APACHE_RUN_GROUP www-data
    ENV APACHE_LOG_DIR /var/log/apche2
    ENV APACHE_PID_FILE /var/run/apache2.pid
    ENV APACHE_RUN_DIR /var/run/apache2
    ENV APACHE_LOCK_DIR /var/lock/apche2

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值