DockerFile详细学习
目录
1.DockerFile介绍
2.DockerFile常用指令
3.指令详细讲解
4.实例
构建Node-Exporter
构建Alertmanager
构建Mariadb
1.DockerFile介绍
什么是 Dockerfile?
Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。
2.DockerFile常用指令
FROM | 指定基础镜像,用于后续的指令构建 |
RUN | 在构建镜像中执行的命令 |
CMD | 指定创建容器时的默认命令(可以被覆盖) |
ENTRYPOINT | 设置容器创建时的主要命令(不可以被覆盖) |
EXPOSE | 声明容器运行时监听的特定网络端口 |
ENV | 在容器内设置环境变量 |
ADD | 将文件或目录远程URL复制到镜像内 |
COPY | 将文件或目录复制到镜像中 |
VOLUME | 为容器创建挂载点或声明卷 |
WORKDIR | 设置后续指令的工作目录 |
USER | 指定后续指令的用户上下文 |
ARG | 定义在构建过程中传递给构建器的变量 |
3.指令详细讲解
FROM
说明: 指定基础镜像,Docker镜像的构建是从这个基础镜像开始的。它是 Dockerfile 中必须的第一条指令。比如,FROM ubuntu:20.04 指定了使用 Ubuntu 20.04 作为基础镜像。
RUN
说明: 在镜像构建过程中执行命令。常用于安装软件包、配置文件、环境等。比如,RUN apt-get update 会在镜像构建时更新软件包列表。
CMD
说明: 设置容器启动时的默认命令。CMD 只是一个默认值,可以通过 docker run 时指定其他命令来覆盖。如果 CMD 没有指定,容器将无法运行。比如,CMD ["echo", "Hello World"]。
ENTRYPOINT
说明: 设置容器启动时的主命令。与 CMD 不同,ENTRYPOINT 设置的命令不可被覆盖。通常与 CMD 一起使用来指定默认参数。比如,ENTRYPOINT ["python3"] 设置容器启动时执行 python3。
EXPOSE
说明: 声明容器在运行时监听的端口。EXPOSE 不会实际开放端口,而是作为一种文档和提醒用途,用来告知其他开发者容器监听了哪些端口。比如,EXPOSE 8080 声明容器在运行时监听端口 8080。
ENV
说明: 设置环境变量。环境变量可以在容器内使用,常用于配置文件或程序。比如,ENV APP_ENV=production 设置了一个名为 APP_ENV 的环境变量。
ADD
说明: 将文件、目录或远程URL复制到镜像中。除了复制本地文件,还可以解压归档文件,甚至从 URL 下载文件。比如,ADD ./app /usr/src/app 会将本地的 app 目录复制到镜像中的 /usr/src/app。
COPY
说明: 与 ADD 类似,用于将本地文件或目录复制到镜像中。但不同的是,COPY 不会解压归档文件,也不支持从 URL 下载文件。比如,COPY ./app /usr/src/app。
VOLUME
说明: 在容器中创建挂载点,并声明挂载卷。这个指令帮助你在容器和宿主系统或其他容器之间共享数据。比如,VOLUME ["/data"] 创建了一个挂载点,容器的 /data 目录可以作为挂载卷使用。
WORKDIR
说明: 设置后续指令的工作目录。所有后续指令都会在这个目录下执行。如果目录不存在,WORKDIR 会创建它。比如,WORKDIR /app 设置当前工作目录为 /app。
USER
说明: 设置后续指令的用户上下文。可以用来指定某个用户来执行后续的命令或运行容器。比如,USER appuser 指定容器在执行后续指令时使用 appuser 用户。
ARG
说明: 定义在构建过程中传递给构建器的变量。这些变量只能在构建阶段使用,不能在容器运行时使用。可以在 docker build 时通过 --build-arg 传递值。比如,ARG VERSION=1.0 定义了一个变量 VERSION,可以在构建时使用。
4.实例
构建Node-Exporter
编写Dockerfile文件构建exporter镜像,要求基于centos完成Node-Exporter服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)
(1)基础镜像:centos:centos7.9.2009;
(2)使用二进制包node_exporter-0.18.1.linux-amd64.tar.gz安装node-exporter服务;
(3)声明端口:9100;
(4)设置服务开机自启。
请使用docker build命令进行构建镜像monitor-exporter:v1.0并使用 docker run 命令运行该容器。
DockerFile:
#基础镜像
FROM centos:centos7.9.2009
#添加文件并自动解压
ADD node_exporter-0.18.1.linux-amd64.tar.gz /opt/
#将启动命令放在/usr/local/bin下
RUN mv /opt/node_exporter-0.18.1.linux-amd64/node_exporter /usr/local/bin
#声明端口
EXPOSE 9100
#容器启动命令
CMD ["node_exporter"]
构建镜像:
[root@docker dockerfile]# docker build -t monitor-exporter:v1.0 -f Dockerfile .
指令最后一个 . 是上下文路径,上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
验证开机自启生效:
[root@docker dockerfile]# docker run -d --name exporter-test monitor-exporter:v1.0 && sleep 5 && docker exec exporter-test ps -aux && docker rm -f exporter-test
36d5abb13c32b8fcfd05e19fb1ffe697fa847ac1d1e0d735f80d7f79a0bc588b
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.3 0.1 114828 8228 ? Ssl 11:29 0:00 node_exporter
root 10 0.0 0.0 51732 1700 ? Rs 11:29 0:00 ps -aux
exporter-test
构建Alertmanager
编写Dockerfile文件构建alert镜像,要求基于centos完成Alertmanager服务的安装与配置,并设置服务开机自启。(需要的包在Technology_packageV1.0.iso中Monitor.tar.gz)
(1)基础镜像:centos:centos7.9.2009
(2)使用提供的二进制包alertmanager-0.19.0.linux-amd64.tar.gz安装Alertmanager服务;
(3)声明端口:9093、9094;
(4)设置服务开机自启。
请使用docker build命令进行构建镜像monitor-alert:v1.0并使用 docker run 命令运行该容器。
DockerFile:
#基础镜像
FROM centos:centos7.9.2009
#工作目录
WORKDIR /usr/local/bin
#将文件复制并解压
COPY alertmanager-0.19.0.linux-amd64.tar.gz .
RUN tar -xzf alertmanager-0.19.0.linux-amd64.tar.gz && rm -f alertmanager-0.19.0.linux-amd64.tar.gz
#切换了工作木录
WORKDIR /usr/local/bin/alertmanager-0.19.0.linux-amd64
#声明端口
EXPOSE 9093 9094
#容器启动命令
CMD ["./alertmanager"]
构建镜像并查看是否启动:
[root@docker dockerfile]# docker build -t monitor-alert:v1.0 -f Dockerfile .
[root@docker dockerfile]# docker run -d --name alert-test monitor-alert:v1.0 && sleep 5 && docker exec alert-test ps -aux && docker rm -f alert-test
fa503911026354e3b97910fe53039359d945d4d5fc7e8180de0717e2eef4d586
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 1.2 0.2 123152 21024 ? Ssl 11:46 0:00 ./alertmanager
root 15 0.0 0.0 51732 1704 ? Rs 11:46 0:00 ps -aux
alert-test
构建Mariadb
编写 Dockerfile-mariadb 文件构建 blog-mysql:v1.0 镜像,要求基于 centos完成MariaDB 服务的安装与配置,并设置服务开机自启。
1)基础镜像:centos:7.9.2009;
2)安装 MariaDB 服务并设置 root 用户的密码为 root;
3)创建数据库 djangoblog 并将 sqlfile.sql 导入该数据库;
4)声明端口:3306;并设置开机自启动。
DockerFile:
FROM centos:centos7.9.2009
#yum源操作
RUN rm -rf /etc/yum.repos.d/*
COPY yum/ /root/yum
COPY yum.repo /etc/yum.repos.d/
# 安装 MariaDB
RUN yum -y install mariadb mariadb-server && yum clean all
# 复制 SQL 文件
COPY sqlfile.sql /root/sqlfile.sql
# 初始化 MariaDB
RUN mysql_install_db --user=root && \
mysqld_safe --user=root & \
sleep 8 && \
mysqladmin -u root password 'root' && \
mysql -uroot -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;" && \
mysql -uroot -proot -e "CREATE DATABASE djangoblog; USE djangoblog; SOURCE /root/sqlfile.sql;"
# 开放 3306 端口
EXPOSE 3306
# 启动 MariaDB
CMD ["mysqld_safe", "--user=root"]
检查是否可用:
[root@docker dockerfile]# docker run -d --name mariadb-test blog-mysql:v1.0 && sleep 15 && docker exec mariadb-test mysql -uroot -proot -e "use djangoblog;show tables" && docker ps | grep mariadb-test && docker rm -f mariadb-test
bc4e13d1a7555f3a15e5dad5b99390593f594c6fd6dcc16b70d4aa0bf8196e1e
Tables_in_djangoblog
accounts_bloguser
accounts_bloguser_groups
accounts_bloguser_user_permissions
auth_group
auth_group_permissions
auth_permission
blog_article
blog_article_tags
blog_blogsettings
blog_category
blog_links
blog_sidebar
blog_tag
comments_comment
django_admin_log
django_content_type
django_migrations
django_session
django_site
oauth_oauthconfig
oauth_oauthuser
owntracks_owntracklog
servermanager_commands
servermanager_emailsendlog
bc4e13d1a755 blog-mysql:v1.0 "mysqld_safe --user=…" 16 seconds ago Up 15 seconds 3306/tcp mariadb-test
mariadb-test