1、Dockerfile是由一组指令组成的文件
2、Dockerfile结构四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
3、Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”号开头的注释
4、Dockerfile操作指令
指令
|
含义
|
FROM 镜像
|
指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
|
MAINTAINER 名字
|
说明新镜像的维护人信息
|
RUN 命令
|
在所基于的镜像上执行命令,并提交到新的镜像中
|
CMD [“要运行的程序”,“参数”]
|
指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行
|
EXPOSE 端口号
|
指定新镜像加载到Docker时要开启的端口
|
ENV 环境变量 变量值
|
设置一个环境变量的值,会被后面的RUN使用
|
ADD 源文件/目录 目标文件/目录
|
将主机的文件拷贝到容器中,源文件要与Dockerfile位于相同目录中,或者是一个URL,自动进行解压操作,不需要手动解压
|
COPY 源文件/目录 目标文件/目录
|
将容器中的文件拷贝到容器的其他目录中
|
VOLUME [“目录”]
|
再容器中创建一个挂载点
|
USER 用户名/UID
|
指定运行容器时的用户
|
WORKDIR 路径
|
为后续的RUN、CMD、ENTRYPOINT指定工作目录
|
ONBUILD 命令
|
指定所生成的镜像作为一个基础镜像时所要运行的命令
|
HEALTHCHECK
|
健康检查
|
5、CMD与ENTRYPOINT 指令对比:
CMD指令可以指定容器启动时默认执行的命令,但它可以被docker run命令的参数覆盖掉。
ENTRYPOINT 指令和CMD类似,它也是用户指定容器启动时要执行的命令,但如果dockerfile中也有CMD指令,CMD中的参数会被附加到ENTRYPOINT指令的后面。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。这样当容器启动后,会执行ENTRYPOINT 指令的参数部分。可以看出,相对来说ENTRYPOINT指令优先级更高。
一、构建SSH镜像
创建目录
创建Dockerfile文件

生成镜像

启动容器并登录



二、构建systemctl镜像
创建目录
[root@server1 ~]# mkdir systemctl
[root@server1 ~]# cd systemctl/
生成Dockerfile文件
[root@server1 systemctl]# vim Dockerfile
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"]
生成镜像
[root@server1 systemctl]# docker build -t systemd:new .
运行容器并进入容器
[root@server1 systemctl]# docker run --privileged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:new /sbin/init
[root@server1 systemctl]# docker exec -it d50e6d032ab0 /bin/bash
[root@d50e6d032ab0 /]# systemctl start sshd
[root@d50e6d032ab0 /]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2020-11-27 05:20:26 UTC; 2s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 85 (sshd)
CGroup: /docker/d50e6d032ab0256218bf9a27eb28ddbc48a0bd10071208e43e1a1c1b27d87a99/system.slice/sshd.service
└─85 /usr/sbin/sshd -D
Nov 27 05:20:26 d50e6d032ab0 systemd[1]: Starting OpenSSH server daemon...
Nov 27 05:20:26 d50e6d032ab0 sshd[85]: WARNING: ‘UsePAM no‘ is not supported in Red ...ms.
Nov 27 05:20:26 d50e6d032ab0 sshd[85]: Server listening on 0.0.0.0 port 22.
Nov 27 05:20:26 d50e6d032ab0 sshd[85]: Server listening on :: port 22.
Nov 27 05:20:26 d50e6d032ab0 systemd[1]: Started OpenSSH server daemon.
Hint: Some lines were ellipsized, use -l to show in full.
三、构建nginx镜像
创建目录
[root@server1 ~]# mkdir nginx
[root@server1 ~]# cd nginx/
生成Dockerfile文件
[root@server1 nginx]# vim Dockerfile
FROM centos:7
MAINTAINER nginx
RUN yum -y update
RUN yum -y install gcc gcc-c++ make pcre-devel zlib-devel
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
RUN useradd -M -s /sbin/nologin nginx
ENV PATN /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
RUN echo ‘daemon off;‘ >> /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
编写run.sh脚本
[root@server1 nginx]# vi run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
将需要的软件包放在同一级目录下
构建镜像
[root@server1 nginx]# docker build -t nginx:new .
运行并查看
[root@server1 nginx]# docker run -d -P nginx:new
[root@server1 nginx]# docker ps -a
5483c1716b91 nginx:new "/run.sh" 2 hours ago Up 2 hours 0.0.0.0:32775->80/tcp, 0.0.0.0:32774->443/tcp funny_easley

四、构建tomcat镜像
创建目录
[root@server1 ~]# mkdir tomcat
[root@server1 ~]# cd tomcat/
生成Dockerfile文件
[root@server1 tomcat]# vi Dockerfile
FROM centos:7
MAINTAINER tomcat
ADD jdk-8u91-linux-x64.tar.gz /usr/local
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
ADD apache-tomcat-8.5.16.tar.gz /usr/local
WORKDIR /usr/local
RUN mv apache-tomcat-8.5.16 /usr/local/tomcat8
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat8/bin/catalina.sh","run"]
将软件包放入同一级目录下
构建镜像
[root@server1 tomcat]# docker build -t tomcat:new .
运行容器并查看
[root@server1 tomcat]# docker build -t tomcat:new .
[root@server1 tomcat]# docker run -dit --name tomcat -p 2222:8080 tomcat:new
cf957aa211f9cdc9e57e901edfdac4a644f7f5ca7d81baa8a972d1cd9cef8f4f
[root@server1 tomcat]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf957aa211f9 tomcat:new "/usr/local/tomcat8/…" 7 seconds ago Up 6 seconds 0.0.0.0:2222->8080/tcp tomcat
网页测试

Docker构建镜像实例
原文:https://www.cnblogs.com/Xing88/p/14058906.html