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)