Dockerfile ----构建sshd、systemctl、Nginx、Tomcat镜像
一:什么是Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。 Dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指定进行自动构建容器,基于dockerfile制作镜像,每一个指令都会创建一个镜像层,即镜像都是多层叠加而成。
Dockerfile结构四部分:
-
基础镜像信息
-
维护者信息
-
镜像操作指令
-
容器启动时执行指令
Dockerfile操作指令:
- FROM 镜像:指明构建的新镜像是来自于哪个基础镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令;
- MAINTAINER 名字 :指明镜像的维护人信息;
- RUN 命令: 在所基于的镜像上执行命令,并提交到新的镜像中;
- CMD [“要运行的程序”,“参数1”,“参数2”]:指定启动容器时要运行的命令或脚本,Dockefile只能有一条CMD命令,如指定多条则只能最后一条被执行;
- EXPOSE 端口号 :声明容器运行的服务端口;
- ENV 环境变量 变量值 :指定一个环境变量的值,会被后面的RUN使用;
- ADD 源文件/目录 目标文件/目录 : 将源文件复制到目标文件,源文件要与dockerfile位于相同目录中或者是一个URL;
- COPY 源文件/目录 目标文件/目录 :作用与ADD类似,但是不支持自动下载和解压;
- ENTRYPOINT:指定一个容器启动时要运行的命令,用法类似于CMD,只是有由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序;
- VOLUME [“目录”] :在容器中创建一个挂载点;
- USER 用户名/UID : 指定运行容器时的用户;
- WORKDIR 路径:相当于cd命令,切换目录路径;
- ONBUILD 命令 :指定所生成的镜像作为一个基础镜像时要运行的命令;
- HEALTHCHECK :健康检查
二:Dockerfile实战
1、创建目录
[root@localhost ~]# mkdir nginx
[root@localhost ~]# cd nginx/
[root@localhost nginx]# rz ‘把nginx-1.12.2源码包放入此目录中’
2、编辑dockerfile
[root@localhost nginx]# vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#下载nginx软件包
ADD nginx-1.12.2.tar.gz /usr/local/src
WORKDIR /usr/local/src
#指定工作目录
WORKDIR nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
#添加宿主机中的run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
3、创建run.sh脚本
[root@localhost nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
4、创建镜像
[root@localhost nginx]# docker build -t nginx:new .
5、启动镜像
[root@localhost nginx]# docker run -d -P nginx:new
[root@localhost nginx]# docker ps -a
6、验证:在浏览器上输入虚拟机地址和端口
1、创建一个目录
[root@localhost ~]# cd /opt/
[root@localhost opt]# mkdir sshd
[root@localhost opt]# cd sshd/
2、编辑Dockerfile
[root@localhost sshd]# vim Dockerfile
#基础镜像
FROM centos:7
#描述信息
MAINTAINER this is sshd <xm>
#更新容器的yum源
RUN yum -y update
#部署环境工具
RUN yum -y install openssh* net-tools lsof telnet passwd
#设置登录密码
RUN echo '123' | 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
#禁用ssh中pam会话模块
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
#开放22服务端口
EXPOSE 22
#容器加载时启动sshd服务
CMD ["/usr/sbin/sshd" , "-D"]
3、生成镜像
[root@localhost sshd]# docker build -t sshd:new .
4、启动容器
[root@localhost sshd]# docker run -d -P sshd:new
[root@localhost sshd]# docker ps -a
[root@localhost sshd]# ssh localhost -p 32768
1、创建目录
[root@localhost ~]# mkdir systemctl
[root@localhost ~]# cd systemctl/
2、编辑Dockerfile
[root@localhost systemctl]# vim Dockerfile
FROM sshd:new
#设置环境变量 container和docker
ENV container docker
#执行先到指定目录,进行for循环遍历目录下所有文件并删除指定的文件。之后进行一系列的删除
RUN (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"]
3、生成镜像
[root@localhost systemctl]# docker build -t systemd:new .
4、启动镜像
[root@localhost systemctl]# docker run --privileged -it -v /sys/fs/cgroup/:/sys/fs/cgroup:ro systemd:new /sbin/init
[root@localhost ~]# docker ps -a
[root@localhost ~]# docker exec -it 5967ae45751e bash
[root@5967ae45751e /]# systemctl status sshd
1、创建目录
[root@localhost ~]# mkdir /opt/tomcat
[root@localhost ~]# cd /opt/tomcat/
[root@localhost tomcat]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u91-linux-x64.tar.gz ‘把这两个包拷贝到/opt/tomcat中’
2、编辑Dockerfile
[root@localhost tomcat]# vim Dockerfile
FROM centos:7
MAINTAINER this is tomcat
#添加jdk到/usr/local目录中
ADD jdk-8u91-linux-x64.tar.gz /usr/local
#指定工作目录,并安装jdk
WORKDIR /usr/local
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JAVA_BIN /usr/local/java/bin
ENV JRE_HOME /usr/local/java/jre
ENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/bin
ENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jar
#解压tomcat源码包
ADD apache-tomcat-9.0.16.tar.gz /usr/local
WORKDIR /usr/local/
RUN mv apache-tomcat-9.0.16 /usr/local/tomcat8
#开启tomcat容器内部的8080端口
EXPOSE 8080
#使用ENTRYPOINT启动tomcat
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]
3、生成镜像
[root@localhost tomcat]# docker build -t tomcat:centos .
4、生成容器
[root@localhost tomcat]# docker run -d --name tomcat01 -p 1213:8080 tomcat:centos ‘指定端口号为1213’
61b66ab566607e5817fd2486ff6b35181d2a3c346d3131912975c73c8d8aa42e
5、进入容器,启动服务
[root@localhost tomcat]# docker ps -a
[root@localhost tomcat]# docker exec -it 61b66ab56660 bash
[root@61b66ab56660 local]# cd /usr/local/tomcat8/bin/
[root@61b66ab56660 bin]# ./startup.sh