博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用Dockerfile构建服务镜像案例(ssh、systemd、nginx、tomcat)
阅读量:2134 次
发布时间:2019-04-30

本文共 4634 字,大约阅读时间需要 15 分钟。

目录

一、Dockerfile文件的概要

  • Dockerfile是由一组指令组成的文件
  • Dockerfile结构四部分
基础镜像信息  维护者信息  镜像操作指令  容器启动时执行指令
  • Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释
  • Dockerfile操作指令
指令 含义
FROM 镜像 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令。
MAINTAINER 名字 说明新镜像的维护人信息
RUN 命令 在所基于的镜像上执行命令,并提交到新的镜像中
CMD [“要运行的程序“,“参数1”,“参数2”] 指令启动容器时要运行的命令或者脚本,Dockerfile只能有—条CMD命令,如果指定多条则只能最后一条被执行
EXPOSE 端口号 指定新镜像加载到Docker时要开启的端口
ENV 环境变量 变量值 设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录 将本地主机上的文件/目录复制到目标地点。源文件/目录要与Dockerfile在相同的目录中
VOLUME [“目录"] 在容器中创建一个挂载点
USER 用户名/UID 指定运行容器时的用户
WORKDIR 路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD 命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查

CMD与ENTRYPOINT 指令对比:

CMD指令可以指定容器启动时默认执行的命令,但它可以被docker run命令的参数覆盖掉。ENTRYPOINT 指令和CMD类似,它也是用户指定容器启动时要执行的命令,但如果dockerfile中也有CMD指令,CMD中的参数会被附加到ENTRYPOINT指令的后面。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。这样当容器启动后,会执行ENTRYPOINT 指令的参数部分。可以看出,相对来说ENTRYPOINT指令优先级更高。

二、构建SSH镜像

[root@server1 ~]# mkdir /sshd[root@server1 ~]# cd /sshd[root@server1 sshd]# vim DockerfileFROM centos:7MAINTAINER this is ssh#更新容器的yum源RUN yum -y update#安装ssh和其他服务软件包RUN yum install -y openssh* net-tools lsof telnet passwd#修改root用户密码RUN echo "123456" | passwd --stdin root#设置不使用ssh服务端的pam模块RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config#创建非对称秘钥RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key#关闭pam.d机制里的ssh会话模块RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^ /#/' /etc/pam.d/sshd#创建ssh工作目录并放通权限RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh#开通端口EXPOSE 22#开启sshd服务,容器的centos7镜像里没有systemctl命令,故不能用服务的方式启动CMD ["/usr/sbin/sshd","-D"]#生成镜像docker build -t sshd:centos#启动容器docker run -d -P sshd:centosdocker ps -a              #查找系统自动映射的端口号ssh localhost -p 32772   #宿主机通过端口连接ssh容器

三、容器使用systemctl镜像

[root@server1 ~]# mkdir /systemctl[root@server1 ~]# cd /systemctl[root@server1 systemctl]# vim DockerfileFROM sshd:centosMAINTAINER this is sshENV container dockerRUN (cd /lib/systemd/system/sysinit.target.wants/;for i in *;do [ $i== \systemd-tmpfiles-setup.service ] || rm -f $i;done); \rm -f /lib/systemd/system/multi-user.target.wants/*; \rm -f /etc/systemd/system/*.wants/*; \rm -f /lib/systemd/system/local-fs.target.wants/*; \rm -f /lib/systemd/system/sockets.target.wants/*udev*; \rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \rm -f /lib/systemd/system/basic.target.wants/*; \rm -f /lib/systemd/system/anaconda.target.wants/*;VOLUME [ "/sys/fs/cgroup" ]CMD ["/usr/sbin/init"][root@localhost systemctl]# docker build -t systemd:centos .    ##privileged container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。[root@server1 systemctl]# docker run --privileged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemctl:centos /sbin/init &[1] 26319[root@server1 systemctl]# docker exec -it 73f6438deda2 bash[root@73f6438deda2 /]# systemctl status sshd

四、构建nginx镜像

[root@server1 ~]# mkdir /nginx[root@server1 ~]# cd /nginx[root@localhost nginx]# vim DockerfileFROM centos:7MAINTAINER this is nginxRUN yum -y updateRUN yum -y install gcc gcc-c++ make pcre-devel zlib-develRUN useradd -M -s /sbin/nologin nginx#ADD既能把压缩包复制到容器中,同时还能把压缩包进行解压ADD nginx-1.12.2.tar.gz /optWORKDIR /opt/nginx-1.12.2RUN ./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module && make && make installENV PATH /usr/local/nginx/sbin:$PATHEXPOSE 80EXPOSE 443#需要关闭nginx的守护进程,否则会和容器的守护进程冲突RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.confADD run.sh /run.shRUN chmod 755 /run.shCMD ["/run.sh"][root@server1 nginx]# vim run.sh#!/bin/bash/usr/local/nginx/sbin/nginx[root@server1 nginx]# docker build -t nginx:centos .[root@server1 nginx]# docker run -d -P nginx:centos

访问http://10.0.0.20:32771/验证

在这里插入图片描述

五、构建Tomcat镜像

[root@server1 ~]# mkdir /tomcat[root@server1 ~]# cd /tomcatapache-tomcat-9.0.16.tar.gz和jdk-8u91-linux-x64.tar.gz上传到/tomcat目录下[root@server1 tomcat]# vim DockerfileFROM centos:7MAINTAINER this is tomcat#解压java到目录/usr/local下,搭建tomcat的环境ADD jdk-8u91-linux-x64.tar.gz /usr/local/WORKDIR /usr/local/RUN mv jdk1.8.0_91 java#设置环境变量ENV JAVA_HOME /usr/local/javaENV JRE_HOME /usr/local/java/jreENV CLASSPATH /usr/local/java/lib:/usr/local/java/jre/libENV PATH /usr/local/java/bin:$PATH#解压安装tomcat包ADD apache-tomcat-9.0.16.tar.gz /usr/local/#进入目录/usr/local/WORKDIR /usr/local/#重命名方便管理RUN mv apache-tomcat-9.0.16 /usr/local/tomcat9#放通tomcat服务的8080端口EXPOSE 8080#在这里我用的是catalina.sh文件启动,startup.sh文件也可以。ENTRYPOINT ["/usr/local/tomcat9/bin/catalina.sh","run"]#创建tomcat镜像并利用tomcat镜像创建容器[root@server1 tomcat]# docker build -t tomcat:centos .[root@server1 tomcat]# docker run -d -P tomcat:centos

在这里插入图片描述

转载地址:http://trkgf.baihongyu.com/

你可能感兴趣的文章
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
[Kick Start 2020] Round A 1.Allocation
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
阿里云《云原生》公开课笔记 第九章 应用存储和持久化数据卷:核心知识
查看>>
linux系统 阿里云源
查看>>
国内外helm源记录
查看>>
牛客网题目1:最大数
查看>>
散落人间知识点记录one
查看>>
Leetcode C++ 随手刷 547.朋友圈
查看>>