文章目录
- Dockerfile
- Dockerfile 构建镜像指令与编写案例
- 一、Dockerfile指令
- 1.FROM
- 2.MAINTAINER
- 3.RUN
- 4.ADD
- 5.COPY
- 6.LABEL
- 7.ENV
- 8.CMD
- 9.EXPOSE
- 10.VOLUME
- 11.WORKDIR
- 12.ARG
- 13.ONBUILD
- 二、Dockerfile 启动nginx
- 三、Dockerfile 编写案例
- lnmp案例
- 1.Nginx
- 2.MySQL
- 3.PHP
- lnmp2 案例
Dockerfile
Dockerfile就是构建docker镜像的构建文件,命令脚本
Dockerfile 由一行行命令语句构建docker镜像的配置文件。
# dokerfile是由三部分组成:
基础镜像(必须的)、运行指令、容器默认执行命令。
Dockerfile 构建镜像指令与编写案例
Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。
# 1、Docker 以从上到下的顺序运行 Dockerfile 的指令
# 2、为了指定基本映像,第一条指令必须是 FROM。
# 3、一个声明以#字符开头则被视为注释。
# 4、可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令(必须大写)。
# 5、指令后面跟shell、mysql等命令及语句即可
由三个部分组成
# 基础镜像信息(必须)
# 维护者信息
# 镜像操作指令
# 容器启动时执行指令
一、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"]