千家信息网

Dockerfile的介绍和使用方法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这期内容当中小编将会给大家带来有关Dockerfile的介绍和使用方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、DockerfileDockerfile是docker中镜
千家信息网最后更新 2026年11月02日Dockerfile的介绍和使用方法

这期内容当中小编将会给大家带来有关Dockerfile的介绍和使用方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、Dockerfile

Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。
例如:你在淘宝上买了一个衣架,但是卖家并没有给你发一个完整的衣架,而是一些组件和一张图纸,你按照这个图纸一步一步将衣架组装起来,就成了你所需要的样子。那么 Dockerfile 就是这张图纸,镜像文件就是你需要的这个衣架,Dockerfile 不建议随便命名,就用 Dockerfile。
因此,Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

Docker 执行 Dockerfile 的大致流程:

(1)docker从基础镜像运行一个容器;

(2)执行一条指令并对容器作出修改;

(3)执行类似docker commit的操作提交一个新的镜像层;

(4)docker再基于刚提交的镜像运行一个新容器;

(5)执行dockerfile中的下一条指令直到所有指令都执行完成。
不同阶段:
1、Dockerfile :是软件的原材料,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库等等;

2、Docker镜像 :是软件的交付品,用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

3、Docker容器 :则可以认为是软件的运行态,容器是直接提供服务的。
Dockerfile 各参数详解:
FROM:指明构建的新镜像是来自于哪个基础镜像;
MAINTAINER:指明镜像维护者及其联系方式;
RUN:执行什么命令;
CMD:指定一个容器启动时要运行的命令,Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换;
EXPOSE:声明容器运行的服务端口;
ENV:构建镜像过程中设置环境变量;
ADD:将宿主机上的目录或者文件拷贝到镜像中(会帮你自动解压,无需额外操作);
COPY:作用与ADD类似,但是不支持自动下载和解压;
ENTRYPOINT:指定一个容器启动时要运行的命令,用法类似于CMD,只是有由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序;
VOLUME:容器数据卷,指定容器挂载点到宿主机自动生成的目录或者其他容器(数据保存和持久化工作,但是一般不会在 Dockerfile 中用到,更常见的还是命令 docker run 的时候指定 -v 数据卷。);
WORKDIR:相当于cd命令,切换目录路径;

二、Dockerfile 实战:

(1)构建 sshd 镜像:
1、先创建一个目录:

[root@localhost ~]# cd /opt/[root@localhost opt]# mkdir sshd[root@localhost opt]# cd sshd/

2、编辑dockerfile文件

[root@localhost sshd]# vim DockerfileFROM centosMAINTAINER this is sshd RUN yum -y updateRUN yum -y install openssh* net-tools lsof telnet passwdRUN echo '123456' | passwd --stdin rootRUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_configRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_keyRUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshdRUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.sshEXPOSE 22CMD ["/usr/sbin/sshd" , "-D"]

3、创建镜像

[root@localhost sshd]# docker build -t sshd:new .89432272695ab560b18de75a064428e4a7c4a52dfce223afd2e85132ae6c3c72[root@localhost sshd]# docker ps -a  //查看最近状态CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS                   NAMES89432272695a        sshd:new            "/usr/sbin/sshd -D"   7 seconds ago       Up 6 seconds        0.0.0.0:32768->22/tcp   sad_fermi

4、启动容器;修改密码

[root@localhost sshd]# docker run -d -P sshd:new[root@localhost sshd]# ssh localhost -p 32768


(2)构建 Systemctl 镜像:
基于上面的 sshd:new 这个镜像,我们再创建一个 systemctl 镜像:

1、创建独立目录:

[root@localhost ~]# cd /opt/[root@localhost opt]# mkdir systemctl[root@localhost opt]# cd systemctl/

2、编辑dockerfile

[root@localhost systemctl]# vim DockerfileFROM sshd:newENV 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"]

3、创建镜像:

[root@localhost systemctl]# docker build -t systemd:lasted .

4、启动镜像:

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

docker ps -a 查看状态:

5、进入容器

[root@localhost ~]# docker exec -it 23a50d568c75 bash[root@23a50d568c75 /]# systemctl status sshd


此时可以使用systemctl和sshd两条命令
(3)构建 Nginx 镜像:
1、创建目录:

[root@localhost ~]# cd /opt/[root@localhost opt]# mkdir nginx[root@localhost opt]# cd nginx/

2、编辑 Dockerfile :

[root@localhost nginx]# vim DockerfileFROM centos:7MAINTAINER The is nginx RUN yum install -y proc-devel gcc gcc-c++ zlib zlib-devel make openssl-devel wgetRUN wget http://nginx.org/download/nginx-1.9.7.tar.gzRUN tar zxvf nginx-1.9.7.tar.gzWORKDIR nginx-1.9.7/RUN ./configure --prefix=/usr/local/nginx && make && make installEXPOSE 80EXPOSE 443RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.confWORKDIR /root/nginxADD run.sh /run.shRUN chmod 755 /run.shCMD ["/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:new228c1f5b8070d52c6f19d03159ad93a60d682a586c0b1f944dc651ee40576a3e[root@localhost nginx]# docker ps -aCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                                           NAMES228c1f5b8070        nginx:new           "/run.sh"                9 seconds ago       Up 8 seconds                  0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp   busy_booth

6、验证一下:浏览器访问:http://192.168.220.131:32769/

(4)构建 Tomcat 镜像:
需要用到 apache-tomcat-9.0.16 和 jdk1.8.0_91 这两个包,可以通过远程挂载到本地,再拷贝到tomcat文件夹中。

[root@localhost tomcat]# lsapache-tomcat-9.0.16  Dockerfile  jdk1.8.0_911、编辑 Dockerfile:FROM centos:7MAINTAINER this is tomcat# 安装JDK环境,设置其环境变量ADD jdk1.8.0_91 /usr/local/javaENV JAVA_HOME /usr/local/javaENV JAVA_BIN /usr/local/java/binENV JRE_HOME /usr/local/java/jreENV PATH $PATH:/usr/local/java/bin:/usr/local/java/jre/binENV CLASSPATH /usr/local/java/jre/bin:/usr/local/java/lib:/usr/local/java/jre/lib/charsets.jarADD apache-tomcat-9.0.16 /usr/local/tomcat8EXPOSE 80802、生成镜像:[root@localhost tomcat]# docker build -t tomcat:centos .3、生成容器:[root@localhost tomcat]# docker run --name tomcat01 -p 1234:8080 -it  tomcat:centos /bin/bash//指定端口号为12344、进入容器后,启动服务:[root@34682d7dc7b8 /]# cd /usr/local/tomcat8/bin/[root@34682d7dc7b8 bin]# ./startup.sh 


验证:浏览器访问 192.168.220.131:1234

(5)构建 Mysql 镜像:

mysql工作目录中包含以下文件:my.cnf  Dockerfile  mysql-boost-5.7.20.tar.gzvim my.cnf[client]port = 3306default-character-set=utf8socket = /usr/local/mysql/mysql.sock[mysql]port = 3306default-character-set=utf8socket = /usr/local/mysql/mysql.sock[mysqld]user = mysqlbasedir = /usr/local/mysqldatadir = /usr/local/mysql/dataport = 3306character_set_server=utf8pid-file = /usr/local/mysql/mysqld.pidsocket = /usr/local/mysql/mysql.sockserver-id = 1sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTESvim DockerfileFROM centos:7RUN yum -y install \ncurses \ncurses-devel \bison \cmake \make \gcc \gcc-c++RUN useradd -s /sbin/nologin mysqlADD mysql-boost-5.7.20.tar.gz /usr/local/srcWORKDIR /usr/local/src/mysql-5.7.20/RUN cmake \-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \-DSYSCONFDIR=/etc \-DSYSTEMD_PID_DIR=/usr/local/mysql \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_ci \-DWITH_INNOBASE_STORAGE_ENGINE=1 \-DWITH_ARCHIVE_STORAGE_ENGINE=1 \-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \-DMYSQL_DATADIR=/usr/local/mysql/data \-DWITH_BOOST=boost \-DWITH_SYSTEMD=1 && make && make installRUN chown -R mysql:mysql /usr/local/mysql/RUN rm -rf /etc/my.cnfADD my.cnf /etcRUN chown mysql:mysql /etc/my.cnfENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATHWORKDIR /usr/local/mysql/RUN bin/mysqld \--initialize-insecure \--user=mysql \--basedir=/usr/local/mysql \--datadir=/usr/local/mysql/dataRUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/EXPOSE 3306RUN echo -e "#!/bin/sh \nsystemctl enable mysqld" > /run.shRUN chmod 755 /run.shRUN sh /run.shCMD ["init"]

1、创建容器:

[root@localhost mysql]# docker build -t centos:mysql .

2、运行容器:

[root@localhost mysql]# docker run --name=mysql_server -d -P --privileged centos:mysql998dc97971022135b822b8b29154df3eaaf5dc977b2a91eaf8afc2b3cea7e

3、查看容器状态:

[root@localhost mysql]# docker ps -aCONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                     NAMES998dc9797102        centos:mysql        "init"              About a minute ago   Up About a minute   0.0.0.0:32768->3306/tcp   mysql_server

4、进行数据库提权:

[root@localhost mysql]# docker exec -it 998dc9797102 /bin/bash[root@998dc9797102 mysql]# mysqlmysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'abc123';

5、测试:打开另外一个虚拟机,用yum 安装mysql服务,并连接:

[root@localhost ~]# mysql -h 192.168.220.131 -u root -P 32768 -pabc123Welcome to the MariaDB monitor.  Commands end with ; or \g.Your MySQL connection id is 4Server version: 5.7.20 Source distributionCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]>

看完上述内容,你们对Dockerfile的介绍和使用方法有进一步的了解吗?如果还想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读。

镜像 容器 文件 运行 命令 指令 目录 内容 参数 环境 服务 就是 数据 衣架 变量 图纸 状态 软件 生成 使用方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技图片 湖北九亚互联网络科技有限公司 山东特亿宝互联网科技有限公司 互联网科技开发公司 互联网科技金融 迪茉互联网科技 西安互联网科技公司 狮子座互联网科技培训 互联网科技大会 互联网科技有限公司 翻译 互联网科技股午盘股票涨跌 青海省互联网新科技 老年人脱离互联网科技的作文 互联网科技博主是什么意思 字节跳动和互联网科技 互联网科技与大数据专业 南京一网一红互联网科技有限公司 艺电能源互联网科技有限公司招聘 互联网科技企业文化 科技发展第三阶段互联网时代 迪茉互联网科技 互联网科技ppt模板 汉立互联网科技有限公司联系电话 阿里互联网科技公司 互联网金融中的现代科技 昭通互联网科技选哪家 互联网在线教育科技创业 江苏苏星互联网科技有限公司 张召忠谈中国互联网科技 第三届互联网大会安防黑科技
0