序:需要准备两台安装好Docker环境的虚拟机。此文主要是介绍Dockerfile及常用指令,利用centos:7基础镜像,在centos:7基础镜像上安装SSHD服务,利用Dockerfile来实现构建镜像。
安装Docker可参考:https://blog.csdn.net/2301_82085712/article/details/147140694?spm=1011.2415.3001.5331
目录
一、Dockerfile的概述
Dockerfile文件是一个文本文件,也是一个Docker可以解释的脚本文件,在这个脚本文件中记录着用户创建镜像过程中需要执行的所有命令。Dockerfile从FROM命令开始,紧接着是各种方法、命令和参数。其产出为一个新的可以用于创建容器的镜像。当Docker读取并执行Dockerfile 中所定义的指令时,这些指令将会产生些临时文件层,并会用一个名称来标记这些临时层。
Dockerfile是容器化应用的核心工具,通过代码化定义镜像构建流程,实现高效、可移植的部署方案。
二、Dockerfile的常用指令
1、基础指令
- FROM
指定基础镜像,必须是第一条非注释指令,支持多阶段构建时用AS定义别名
示例:FROM ubuntu:22.04 AS builder
- ARG
定义构建时的变量,可在FROM之前使用,作用域仅在构建阶段
示例:ARG version=1.0
- LABEL
添加元数据(如作者、版本),替代已废弃的MAINTAINER
示例:LABEL maintainer="dev@example.com"
2、文件操作
- COPY
复制宿主机文件到镜像,不支持URL和解压,目标路径需以斜杠结尾
示例:COPY ./src /app/
- ADD
类似COPY,但支持URL下载和自动解压压缩包(仅限.tar, .gz, .zip等格式)
示例:ADD https://example.com/file.tar.gz /app/
3、构建配置
- RUN
执行命令并创建镜像层,支持shell和exec格式,推荐合并命令减少镜像层数
示例:RUN apt update && apt install -y python3
- ENV
设置容器运行时的环境变量,可通过docker run -e覆盖
示例:ENV PYTHONPATH=/app
- WORKDIR
设置工作目录,后续指令基于此路径执行,若目录不存在则自动创建
示例:WORKDIR /app
- USER
指定运行命令的用户(需提前在基础镜像中创建该用户)
示例:USER appuser
4、容器配置
- EXPOSE
声明容器运行时监听的端口,需通过docker run -p映射到宿主机端口
示例:EXPOSE 8080
- VOLUME
创建数据卷挂载点,用于持久化存储
示例:VOLUME/data
- HEALTHCHECK
定义容器健康检查策略,通过命令返回值判断状态
示例:HEALTHCHECK --interval=30s CMD curl -f http://localhost/
5、启动指令
- CMD
指定容器默认启动命令,可被docker run的参数覆盖,通常以exec格式编写。
示例:CMD ["python3", "app.py"]
- ENTRYPOINT
配置容器主命令,不可被覆盖,常与CMD配合使用(CMD作为参数)
示例:ENTRYPOINT ["nginx"] + CMD ["-g", "daemon off;"]
6、高级特性
- ONBUILD
定义子镜像构建时触发的指令,适用于基础镜像的扩展场景
示例:ONBUILD COPY . /app
- SHELL
覆盖默认的Shell程序(如SHELL ["/bin/bash", "-c"])
- 多阶段构建
通过FROM ... AS和COPY --from=减少最终镜像体积
三、利用Dockerfile构建镜像
1、拉取centos:7镜像
[root@docker01 ~]# docker pull centos:7
Using default tag: 7
7: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:7
docker.io/library/centos:latest
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 5d0da3dc9764 3 years ago 204MB
2、新建目录
[root@docker01 ~]# mkdir -p /user/docker
[root@docker01 ~]# cd /user/docker/
[root@docker01 docker]#
3、新建并编辑Dockerfile文件
[root@docker01 docker]# vi Dockerfile
FROM centos:7
MAINTAINER tt
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo && \
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.huaweicloud.com|g' /etc/yum.repos.d/CentOS-*.repo
RUN yum install openssh-server net-tools -y
RUN mkdir /var/run/sshd
RUN echo 'root:hbliti' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
ENV HISTTIMEFORMAT "%F %T "
RUN ssh-keygen -A
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
4、使用docker build编译命令,生成新的镜像版本
[root@docker01 docker]# docker build -t centos_sshd:1.0 .
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_sshd 1.0 dcac13ab501a 11 seconds ago 464MB
centos 7 5d0da3dc9764 3 years ago 204MB
5、查看镜像是否构建成功,并利用新镜像生成容器
[root@docker01 docker]# docker run -dit --name my_centos_sshd centos_sshd:1.0
472df1394d3b899f498236e16b92111ddf2677bea84db979054e8c23afcda39e
[root@docker01 docker]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
472df1394d3b centos_sshd:1.0 "usr/sbin/ssd -D" 5 seconds ago Up 4 seconds 22/tcp my_centos_sshd
6、查看新容器的IP地址
[root@docker01 docker]# docker exec -it my_centos_sshd /bin/bash
[root@472df1394d3b /]# ifconfig
7、验证SSH是否配置成功
# 使用另外一台虚拟机docker02远程连接docker01
[root@docker02 ~]# ssh root@172.17.0.2
root@172.17.0.2's password: ## hbliti