linux12 - dockerfile01 -->构建镜像指令与编写案例

Dockerfile

Dockerfile就是构建docker镜像的构建文件,命令脚本

Dockerfile 由一行行命令语句构建docker镜像的配置文件。
# dokerfile是由三部分组成:
基础镜像(必须的)、运行指令、容器默认执行命令。

Dockerfile 构建镜像指令与编写案例

Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。

# 1、Docker 以从上到下的顺序运行 Dockerfile 的指令

# 2、为了指定基本映像,第一条指令必须是 FROM。

# 3、一个声明以#字符开头则被视为注释。

# 4、可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令(必须大写)。

# 5、指令后面跟shell、mysql等命令及语句即可

由三个部分组成

# 基础镜像信息(必须)
# 维护者信息
# 镜像操作指令
# 容器启动时执行指令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3NGSNO5S-1624551972082)(C:\Users\17155\Desktop\docker img\1623944274080.png)]

一、Dockerfile指令

1.FROM
#  指定基础镜像,目的是为了给构建镜像提供一个基础环境

格式:
FROM centos:7
# 实例
[root@docker docker]# cat Dockerfile  # 必须是大写
FROM nginx
2.MAINTAINER
# 指定维护者信息
格式:
MAINTAINER Peng
3.RUN
# 1、基于FROM指定的docker镜像运行一个指令,将结果反映到新生成的镜像
# 2、RUN指令后面执行的命令必须是镜像中已经存在了的命令。
# 3、反斜线 \ 还可用于续行、转义空格等特殊字符

格式:
RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666 -s /sbin/nologin -M
RUN mkdir /code/wordpress/ -p
RUN rm -rf /etc/nginx/conf.d/default.conf

[root@docker docker]# cat Dockerfile 
FROM nginx
RUN echo "Dockerfile" > /usr/share/nginx/html/index.html

# 实例:
[root@docker docker]# docker build -t nginx1 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> d1a364dc548d
Step 2/2 : RUN echo "Dockerfile" > /usr/share/nginx/html/index.html
 ---> Running in 13f690b45bae
Removing intermediate container 13f690b45bae
 ---> 001a32618043
Successfully built 001a32618043
Successfully tagged nginx1:latest
[root@docker docker]# docker run -it nginx1 bash #进入nginx1镜像中
root@f3bbfff11a8b:/# cd /usr/share/nginx/html/
root@f3bbfff11a8b:/usr/share/nginx/html# cat index.html 
Dockerfile
4.ADD
# 1、将本地文件添加到容器中,相当于cp命令,又强与cp命令

# 2、tar类型文件会自动解压到目标路径(仅支持解压 tar 包)

# 3、支持远程下载,但是不会解压下载内容
格式:
ADD nginx.conf /etc/nginx/
ADD /root/www.conf /etc/php-fpm.d/
ADD wordpress.tar.gz /code/
ADD /root/check* /test/
# 实例
[root@docker ~]# mkdir docker
[root@docker docker]# mkdir nginx
[root@docker nginx]# ll
total 1020
-rw-r--r-- 1 root root     112 Jun 21 16:18 Dockerfile
-rw-r--r-- 1 root root 1039530 Apr 18 11:27 nginx-1.18.0.tar.gz 
#下载文件尽量和Dockerfile放在同一个位置上
[root@docker nginx]# cat Dockerfile   #命令必须大写
FROM nginx
RUN echo "Dockerfile" > /usr/share/nginx/html/index.html
CMD /bin/bash 
ADD nginx-1.18.0.tar.gz /tmp/ 
[root@docker nginx]# docker build -t nginx3 . # 构建镜像
Successfully built e5140d6ba901               # 代表成功
Successfully tagged nginx4:latest
[root@docker nginx]# docker run -it nginx3 bash # 执行命令
root@3b3bc16a2682:/# cd /tmp/
root@3b3bc16a2682:/tmp# ls -l
total 0
drwxr-xr-x 8 1001 1001 158 Apr 21  2020 nginx-1.18.0  #自动解压
5.COPY
# 1、复制文件到镜像中,建议直接用ADD
# 2、功能类似 ADD,但不会自动解压文件,也不能访问网络资源

格式:
COPY nginx.conf /etc/nginx/
COPY /etc/passwd /etc/
COPY /root/check* /test/
# 实例
[root@docker nginx]# cat Dockerfile 
FROM nginx
RUN echo "Dockerfile" > /usr/share/nginx/html/index.html
CMD /bin/bash
COPY nginx-1.18.0.tar.gz /tmp/                #命令必须大写
[root@docker nginx]# docker build -t nginx3 . # 构建镜像
Successfully built e5140d6ba901               # 代表成功
Successfully tagged nginx4:latest
[root@docker nginx]# docker run -it nginx4 bash
root@f2eaef9ece41:/# cd /tmp/
root@f2eaef9ece41:/tmp# ls -l
total 1016
drwxr-xr-x 8 1001 1001     158 Apr 21  2020 nginx-1.18.0
-rw-r--r-- 1 root root 1039530 Apr 18 03:27 nginx-1.18.0.tar.gz  # 不解压

# 注
dockerfile执行是安装从上到下
如果构建的上一个执行过这个步骤,下一个则可以使用缓存(Using cache)
1、从互联网下载内容不会使用缓存
2、添加文件的内容(ADD COPY)
如果上一步修改过,则下面的dockerfile步骤全部不使用缓存
6.LABEL
# 1、用于为镜像添加元数据,不常用
# 2、一个LABEL指定一层,尽量合并为一个指令,同名覆盖
格式:
LABEL <key>=<value> <key>=<value> <key>=<value>
LABEL version="1.0"
7.ENV
# 设置环境变量
# 1、key 之后的所有内容均会被视为 value 的组成部分,因此一次只能设置一个变量
# 2、如果 中包含空格,可以使用 \ 来进行转义,也可以通过""来进行标示
# 3、反斜线 \ 还可用于续行

格式:
ENV <key> <value>
ENV name john
ENV name John Alex		# 变量值则为John Alex
ENV name "john Alex"	# 变量值则为John Alex
ENV name john \Alex		# 变量值则为John Alex
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
#实例
[root@docker nginx]# cat Dockerfile 
FROM centos:7

COPY epel.repo /etc/yum.repos.d/

RUN yum -y install nginx
ENV SCHOOL=MMM
CMD nginx -g "daemon off;"
[root@docker nginx]# docker build -t nginx8 . #构建镜像
[root@docker nginx]# docker run -it nginx8 bash # 查看环境变量
[root@f592a7c07f9b /]# printenv 
SCHOOL=MMM

8.CMD
# 指定容器运行的默认命令

格式:
CMD nginx -g "daemon off;"
CMD ["nginx","-g","daemon off;"]

[root@docker docker]# cat Dockerfile 
FROM nginx
RUN echo "Dockerfile" > /usr/share/nginx/html/index.html
CMD /bin/bash
# 实例
[root@docker docker]# docker run -it nginx2 
root@830b8d6fec2f:/#   #默认是运行的bash
root@830b8d6fec2f:/# exit
exit

9.EXPOSE
# 1、指定与外界交互的端口
# 2、EXPOSE 并不会让容器的端口访问到主机
# 3、指定容器需要向外界暴露的端口,实际上没有暴露,只有指定了EXPOSE才能够使用-p(大P), 可以指定多个端口
格式:
EXPOSE <port> <port> ...
EXPOSE 80 443 8080 #可以指定多个端口
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp 
# 实例
[root@docker nginx]# cat Dockerfile 
FROM centos:7

COPY epel.repo /etc/yum.repos.d/

RUN yum -y install nginx
ENV SCHOOL=MMM
EXPOSE 80
CMD nginx -g "daemon off;"
[root@docker nginx]# docker build -t nginx10 . #构建镜像
[root@docker nginx]# docker run -d nginx10 #启动镜像
1d09d64c25c1eda45e62f3bf2370ee268a725685b87c6f9400e7e2d462d88775
[root@docker nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
1d09d64c25c1   nginx10   "/bin/sh -c 'nginx -…"   4 seconds ago    Up 2 seconds    80/tcp 

10.VOLUME
# 设置需要挂载的目录。没有实现挂载

# 1、用于指定持久化目录
# 2、一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能
# 3、卷可以容器间共享和重用
# 4、容器并不一定要和其它容器共享卷
# 5、修改卷后会立即生效
# 6、对卷的修改不会对镜像产生影响
# 7、卷会一直存在,直到没有任何容器在使用它
格式:
VOLUME ["/path/to/dir"]
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
# 实例
[root@docker nginx]# cat Dockerfile 
FROM centos:7

COPY epel.repo /etc/yum.repos.d/

RUN yum -y install nginx
#ENV SCHOOL=MMM
#EXPOSE 80
CMD nginx -g "daemon off;"
ARG USER=root
RUN echo $USER
VOLUME ["/var/www/html"]
[root@docker nginx]# docker build -t nginx13 . #构建镜像
[root@docker nginx]# docker inspect nginx13 |grep /var/ #查看挂载
                "VOLUME [/var/www/html]"
                "/var/www/html": {}
                "/var/www/html": {}
                
# 挂载
[root@docker nginx]# docker run -d -v /root/docker/nginx/:/usr/share/nginx/html -P nginx#需要挂载的目录
[root@docker nginx]#  docker ps
[root@docker nginx]#  echo 11 > index.html  #如果报403执行这个
# 通过IP加端口访问

11.WORKDIR
# 工作目录

# 1、进入容器的最初目录/程序运行的开始目录工作,类似于 cd 命令回车后的主路径

# 2、通过 WORKDIR 设置工作目录后,Dockerfile 中的其他命令都会在该目录下执行

# 3、在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。
格式:
WORKDIR /path/to/workdir
WORKDIR /a		# 这时工作目录为/a
WORKDIR /a/b 	# 这时工作目录为/a/b
[root@docker nginx]# cat Dockerfile 
FROM centos:7

COPY epel.repo /etc/yum.repos.d/

RUN yum -y install nginx
#ENV SCHOOL=MMM
#EXPOSE 80
CMD nginx -g "daemon off;"
ARG USER=root
RUN echo $USER

WORKDIR /usr/share/nginx/html
VOLUME ["/var/www/html"]

12.ARG
# 指定用于制定传递给构建运行时的变量  --build-arg==USER=root
格式:
ARG <name>[=<default value>]
ARG site
ARG build_user=www
[root@docker nginx]# cat Dockerfile 
FROM centos:7

COPY epel.repo /etc/yum.repos.d/

RUN yum -y install nginx
#ENV SCHOOL=MMM
#EXPOSE 80
CMD nginx -g "daemon off;"
ARG USER=root
RUN echo $USER
ARG COMMONR=XXX
RUN yum -y $COMMOMD -y

[root@docker nginx]# docker build --build-arg=USER=XXX --build-arg=COMMOND=wegt -t nginx11 .

13.ONBUILD
# 构建触发器: 当当前镜像作为基础镜像时触发

# 1、用于设置镜像触发器
# 2、当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
# 3、ONBUILD 后面跟的是Dockerfile指令不是linux命令

格式: ONBUILD [INSTRUCTION]
ONBUILD ADD /var/log
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

二、Dockerfile 启动nginx

[root@docker nginx]# ll
total 1024
-rw-r--r-- 1 root root     103 Jun 21 16:48 Dockerfile
-rw-r--r-- 1 root root     664 Jun 21 16:53 epel.repo
[root@docker nginx]# cat Dockerfile   # 编写配置文件
FROM centos:7

COPY epel.repo /etc/yum.repos.d/

RUN yum -y install nginx

CMD nginx -g "daemon off;"

# 启动nginx
[root@docker nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
a4b4af544a9a   nginx6    "/bin/sh -c 'nginx -…"   3 minutes ago    Up 3 minutes    0.0.0.0:122->80/tcp, :::122->80/tcp     keen_hugle
5fee6c17e45e   nginx6    "/bin/sh -c 'nginx -…"   5 minutes ago    Up 5 minutes  
[root@docker nginx]# docker build -t nginx7 .  #构建镜像
[root@docker nginx]#  docker run -d nginx7
[root@docker nginx]#   docker run -d -p 8088:80 nginx7
# 再次进入nginx6的镜像文件
[root@docker nginx]# docker exec -it 5fee6c17e45e bash  # 镜像ID(镜像名称)
 # 访问 192.168.15.30:8088

三、Dockerfile 编写案例

# 1、Dockerfile 指令是按照从上到下执行的
# 2、如果构建的上一个镜像执行过此步骤,下一个则可以使用缓存(Using cache)
# 3、从互联网下载内容不会使用缓存
# 4、添加文件的内容(ADD、COPY)
# 5、如果上一步修改过,则下面的dockerfile步骤全部不使用缓存。

lnmp案例
# 1、创建网桥
[root@docker lnmp]# docker network create lnmp
4d328e543e7edc0c6a960be47b8255fa7ce05b0c49ccdf63b2943537a46fc5c1
[root@docker lnmp]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
91fc3b1f34df   bridge    bridge    local
78c7eb1884a2   host      host      local
4d328e543e7e   lnmp      bridge    local
55fea18f04d0   mm        bridge    local
442fc1b858a6   none      null      local
# 2、拷贝nginx默认文件
[root@docker lnmp]# docker cp 4d65fb85c610:/etc/nginx/conf.d/default.conf .
[root@docker lnmp]# ll
total 1032
-rw-r--r-- 1 root root    1072 May 25 21:30 default.conf

1.Nginx
# 1、配置nginx的Dockerfile文件
[root@docker nginx]# cat Dockerfile 
FROM nginx
ADD default.conf /etc/nginx/conf.d/
EXPOSE 80
WORKDIR /root
CMD nginx -g "daemon off;"

[root@docker nginx]# ll
total 8
-rw-r--r-- 1 root root 445 Jun 21 19:46 default.conf
-rw-r--r-- 1 root root  98 Jun 21 19:49 Dockerfile
# 2、修改配置配置文件
[root@docker nginx]# cat default.conf 
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    root   /usr/share/nginx/html;
    
    location / {
        index  index.php index.html index.htm;
    }

    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}
# 修改nginx.conf
user www;

# 3、构建镜像并启动
[root@docker nginx]# docker build -t lnmp-nginx1 .
[root@docker nginx]# docker run -d lnmp-nginx1
# 4、查看日志  ---> 报错
[root@docker php]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                      PORTS     NAMES
c1ae64032fa9   lnmp-nginx1   "/docker-entrypoint.…"   28 seconds ago   Exited (1) 27 seconds ago             kind_gagarin
  
[root@docker php]# docker logs kind_gagarin
2021/06/21 11:55:05 [emerg] 7#7: host not found in upstream "php" in /etc/nginx/conf.d/default.conf:13
nginx: [emerg] host not found in upstream "php" in /etc/nginx/conf.d/default.conf:13

# 如果容器内部启动了,本机可以访问 但是浏览器不可以访问,原因是
[root@docter nginx]# cat Dockerfile  #Dockerfile文件
FROM nginx

RUN groupadd www -g 666
RUN useradd www -u 666 -g 666 

ADD default.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx/

EXPOSE 80

WORKDIR /root
CMD nginx -g "daemon off;"
[root@docter nginx]# docker build -t nginx . #构建镜像
[root@docter nginx]# docker run -d -p 1234:80 nginx nginx #启动容器
22c7bc4b33a8a1c9b8c8594f1f08566fa7afc0c820e50135befd4eac134d64b5
[root@docter nginx]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                       NAMES
22c7bc4b33a8   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:1234->80/tcp, :::1234->80/tcp 
[root@docter nginx]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    6bed39221e28   2 minutes ago   133MB
tomcat       latest    6654503f1940   30 hours ago    667MB
nginx        <none>    4f380adfc10f   2 days ago      133MB
IP访问成功
# 192.168.15.30:1234
2.MySQL
# 1、配置mysql的Dockerfile文件
[root@docker1 code]# cat mysql/Dockerfile 
FROM mysql:5.7
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ADD setup.sh /mysql/setup.sh
ADD schema.sql /mysql/schema.sql
ADD privileges.sql /mysql/privileges.sql
CMD ["sh", "/mysql/setup.sh"]

# 2、构建镜像并启动
[root@docker mysql]# docker build -t lnmp-mariadb .
[root@docker mysql]#  docker run -it lnmp-mariadb bash
[root@docker mysql]#   docker rm -f mysql && docker run -d --network=lnmp -e  MYSQL_ROOT_PASSWORD=123 --name mysql mysql

3.PHP
# 1、配置php的Dockerfile文件
[root@docker php]# cat Dockerfile 
FROM centos:7
RUN yum install php php-devel php-fpm -y
EXPOSE 9000
CMD ["php-fpm"]
# 2、修改php的www.conf配置文件
listen  =9000
;listen.allowed_clients = 127.0.0.1
user = www
group = www
request_terminate_timeout = 0

# 3、构建镜像并启动
[root@docker php]#  docker build -t lnmp-php1 .
[root@docker php]#  docker run -d lnmp-php1

lnmp2 案例
# 1、nginx
[root@docker1 code] cat nginx/Dockerfile 
FROM nginx
RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666 -s /sbin/nologin -M
ADD linux.wp.com.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx/
RUN mkdir /code/wordpress/ -p
RUN rm -rf /etc/nginx/conf.d/default.conf
EXPOSE 80
WORKDIR /root
CMD ["nginx","-g","daemon off;"]
# 2、mysql
[root@docker1 code]# cat mysql/Dockerfile 
FROM mysql:5.7
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
ADD setup.sh /mysql/setup.sh
ADD schema.sql /mysql/schema.sql
ADD privileges.sql /mysql/privileges.sql
CMD ["sh", "/mysql/setup.sh"]
# 3、php
[root@docker1 code]# cat php/Dockerfile 
FROM centos:7
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN yum -y install wget \
 && wget https://www.php.net/distributions/php-7.4.16.tar.gz
RUN yum -y install gcc \
gcc-c++ \
make \
libxml2-devel \
openssl-devel \
curl-devel \
libjpeg-devel \
libpng-devel \
libicu-devel \
sqlite-devel \
freetype-devel \
openldap-devel \
openldap \
openldap-devel

RUN tar -zxvf php-7.4.16.tar.gz
WORKDIR /php-7.4.16
RUN ./configure --prefix=/usr/local/php \
       --with-config-file-scan-dir=/usr/local/php/etc/ \
       --with-mhash --with-pdo-mysql \
       --with-openssl --with-mysqli \
       --with-iconv --with-zlib \
       --enable-inline-optimization \
       --disable-debug --disable-rpath \
       --enable-shared --enable-xml \
       --enable-bcmath --enable-shmop \
       --enable-sysvsem --enable-sysvshm --enable-mbregex \
       --enable-ftp \
       --enable-pcntl --enable-sockets \
       --with-xmlrpc --enable-soap \
       --without-pear --with-gettext \
       --enable-session --with-curl \
       --enable-opcache --enable-fpm \
       --without-gdbm --enable-fast-install \
       --disable-fileinfo
RUN make && make install
RUN groupadd www -g 666 && \
    useradd www -u 666 -g 666 -s /sbin/nologin -M
ADD www.conf /usr/local/php/etc/php-fpm.d/
ADD php.ini /usr/local/php/etc/
ADD php-fpm.conf /usr/local/php/etc/
EXPOSE 9000
CMD ["/usr/local/php/sbin/php-fpm","-F"]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FikL-09-19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值