commit命令虽然很容易制作镜像,但其有局限性,遇到复杂的情况十分不方便。例如设在默认启动命令、设置环境变量、开放指定端口等。Dockerfile就算解决这些问题的方法
Dockerfile是一种强大的镜像制作方式,类似于编写脚本的的Dockerfile文件,通过该文件去制作镜像。它的步骤分为:
- 创建目录
- 创建编写Dokerfile文件(有关联文件也放在该目录下)
- 制作镜像(docker build -t 镜像名字:镜像标签 Docker所在目录)
Docker常用指令:
FROM 指定基础镜像
RUN 在容器执行命令
COPY 将文件拷贝到容器中
ADD 同上,会自动解压缩到容器里
WORKDIR 设置容器启动的默认目录(类似于cd)
USER 设置启动容器的用户(一般用户容器安全)
ENT 设置启动容器的环境变量
REPOSE 默认监听端口
CMD 默认启动参数(启动服务的命令,必须放在容器前台运行)
制作镜像(docker build -t 镜像名字:镜像标签 Docker所在目录)
验证:docker run -it --rm --name 别名 镜像名字:标签
拓展提高:1.多阶段镜像 2.容器安全(用普通用户启动容器)
案例:1.多阶段镜像
[root@docker ~]# rm -rf nginx/nginx
[root@docker ~]# mv /root/nginx-1.22.1.tar.gz nginx/
[root@docker ~]# vim nginx/Dockerfile
# 第一阶段编译程序
FROM mylinux:latest as builder
ADD nginx-1.22.1.tar.gz /
WORKDIR /nginx-1.22.1
RUN dnf install -y openssl-devel pcre-devel gcc make
RUN ./configure --prefix=/usr/local/nginx --with-pcre --with-http_ssl_module
RUN make && make install
RUN echo 'Nginx is running !' >/usr/local/nginx/html/index.html
# 第二阶段最终镜像
FROM mylinux:latest
RUN dnf install -y pcre openssl && dnf clean all
COPY --from=builder /usr/local/nginx /usr/local/nginx
ENV PATH=${PATH}:/usr/local/nginx/sbin
WORKDIR /usr/local/nginx/html
EXPOSE 80/tcp
CMD ["nginx", "-g", "daemon off;"]
[root@docker ~]# docker build -t nginx:latest nginx
案例:2.容器安全
# 编写 dockerfile 文件
[root@docker ~]# docker images php-fpm:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
php-fpm latest b2404bd119b0 48 seconds ago 275MB
[root@docker ~]# docker run -itd --name php php-fpm:latest
6eeff6af4a6469c298944b2bdd2ba69f32ebcbc6cb683a0a05af4eefbf90e8c1
# 验证服务
[root@docker ~]# docker exec -it php /bin/bash
# 验证用户
bash-4.4$ id
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
# 我们无法直接调用 php 服务,可以通过查看进程验证服务
bash-4.4$ ps -ef
UID PID PPID C STIME CMD
nobody 1 0 0 16:13 php-fpm: master process (/etc/php-fpm.conf)
nobody 7 1 0 16:13 php-fpm: pool www
nobody 8 1 0 16:13 php-fpm: pool www
nobody 17 0 0 16:13 /bin/bash
nobody 19 17 0 16:13 ps -ef
bash-4.4$ exit
[root@docker ~]# docker rm -f $(docker ps -aq)