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 '/^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服务 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
- 查看容器状态,并查看端口号,用浏览器对其进行测试