Docker之Docker文件,一篇就够了

一、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 健康检查

注:ADD命令还有解压的功能

二、构建ssh服务镜像

  • docker exec 命令登录容器不需要密码,安全性比较低,为了提升安全性,可以构建ssh密钥服务镜像,来新建一个容器
  • 创建一个sshd目录,用于存放Dockerfile文件
[root@server3 ~]# mkdir sshd
[root@server3 ~]# cd sshd
创建文件Dockerfile
[root@server3 sshd]# vi Dockerfile

FROM centos:7
MAINTAINER The CentOS Project <cloud-centos>
#更新容器的yum源
RUN yum -y update
#安装ssh和其他服务的软件包
RUN yum -y install openssh* net-tools lsof telnet passwd
#修改root用户密码
RUN echo '123123' | 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
#s表示空格+表示匹配一次或多次,关闭pam.d机制里的ssh会话模块
RUN sed -i '/^sessions+requireds+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服务 
CMD ["/usr/sbin/sshd","-D"]  
  • 生成镜像
[root@server3 sshd]# docker build -t sshd:new .
  • 启动容器并修改root密码
[root@server3 sshd]# docker run -d -P sshd:new  #-P随机分配一个端口,起始端口号为32768
d847901a28bedde6f6fd90151e00fd65b5e7e5f134dcc189ab0b37b4a3a6d0f4
  •   登录测试

 三、构建systemctl镜像

  • centos容器镜像里面没有systemctl命令,不能使用此命令管理服务,构建镜像后才能使用

1、创建目录,用于存放Dockerfile文件,并配置Dockerfile  

mkdir /systemctl
cd /systemctl
vi Dockerfile 
#基于ssh服务搭建systemctl服务
FROM sshd:new
#基于容器  
ENV container docker
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"]

2、生成镜像,并启动容器  

docker build -t systemd:new .

#privateged container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户
docker run --privileged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemctl:new /sbin/init

3、登录容器后进行测试

 四、构建nginx镜像

  • 创建目录,存放Dockerfile文件,并进行配置
mkdir nginx
cd nginx
将nginx-1.12.2源码包放在nginx目录下
FROM centos:7
MAINTAINER this is nginx
RUN yum install -y gcc gcc-c++ make pcre-devel zlib-devel
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /opt/
WORKDIR /opt/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 443
EXPOSE 80
#关闭守护进程,这里必须设置
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]  
  • 生成镜像,并启动镜像
[root@server3 nginx]# docker build -t nginx:new .
Sending build context to Docker daemon  986.1kB
Step 1/14 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/14 : MAINTAINER this is nginx
[root@server3 nginx]# docker run -d -P nginx:new
0fee269b45f4c368d06517239e8a4020af58fcfca9c34cc95e2d77033244eeb8

 

  •  在浏览器中访问

 

 五、构建tomcat镜像

  • 创建目录,存放Dockerfile文件,并对其进行配置
mkdir tomcat
cd tomcat#将jdk-8u91-linux-x64.tar.gz、apache-tomcat-9.0.16.tar.gz放在目录里
FROM centos:7
MAINTAINER this is tomcat
ADD jdk-8u91-linux-x64.tar.gz /opt  #将压缩包解压,放在/opt目录下
WORKDIR /opt/jdk1.8.0_91/      #进入目录
WORKDIR /opt
RUN mv jdk1.8.0_91 /usr/local/java    #重命名方便使用
ENV JAVA_HOME /usr/local/java     #设置环境变量
ENV JRE_HOME /usr/local/java/jre
ENV CLASSPATH /usr/local/java/lib:/usr/local/java/jre/lib
ENV PATH /usr/local/java/bin:$PATH
ADD apache-tomcat-8.5.16.tar.gz /opt   #解压
WORKDIR /opt    
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat8
RUN /usr/local/tomcat8/bin/startup.sh
EXPOSE 8080   #开放端口好
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]   #启动服务  
  • 创建镜像和容器
docker build -t tomcat.new .
docker run -d -P tomcat.new
  • 查看容器状态,并查看端口号,用浏览器对其进行测试

原文地址:https://www.cnblogs.com/tianzhendengni/p/14049160.html