Dockerfile
构建镜像
原理
Dockerfile是由一行行指令语句构成的一个创建docker镜像的配置文件。Dockerfile是由三个部分组成:基础镜像(必须的)、运行指令、容器默认执行命令。
# Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM
指令
1.1 FROM
FROM 指定基础镜像,目的是为了给构建镜像提供一个基础环境。
# 注:第一条必须是FROM,且只能有一个
1.2 MAINTAINER
指定维护者信息,创建日期
1.3 RUN
基于FROM指定的docker镜像运行一个指令,将结果反映到新生成的镜像。
# 注:RUN指令后面执行的命令必须是镜像中已经存在了的命令。
1.4 CMD
指定容器运行的默认命令
案列:
CMD php-fpm -F
# 注:只能有一个
1.5 ADD与COPY
ADD:将本地文件添加到镜像
ADD支持自动解压,但仅仅支持解压tar包
ADD支持远程下载,但不会解压下载内容
COPY:将文件复制到镜像
但是COPY不会解压文件,也不能访问网络
1.6 ENV
设置一个容器的环境变量
1.7 EXPOSE
指定容器需要向外界暴露的端口,实际上没有暴露,只有指定了EXPOSE才能够使用-P, 可以指定多个端口
1.8 ARG
指定运行时参数,用于构建docker镜像时传入参数
1.9 VOLUME
设置需要挂载的目录,没有实现挂载
2.0 WORKDIR
设置工作目录
1、程序运行的开始目录
2、进入容器的最初目录
2.1 ONBUILD
用于设置镜像触发器
# 作用保护镜像内数据安全
案列(构建nginx)
FROM centos:7 # 基础镜像文centos7
ADD nginx.repo /etc/yum.repos.d/ # 将官方源添加进容器
RUN yum install -y nginx # 下载nginx
RUN useradd www # 创建nginx
ADD default.conf /etc/nginx/conf.d/ # 修改完站点文件添加进容器
ADD nginx.conf /etc/nginx # 修改过的配置文件添加进容器
EXPOSE 80 # 设置对外的端口
CMD nginx -g "daemon off;" # nginx前台启动的命令
# 注:添加前台启动的命令是因为要想运行容器必须要有一个进程运行在前台
自构建镜像搭建wordpress
# 镜像准备nginx、PHP、MySQL因为不容易构建所以直接用官方镜像
# 创建目录
[root@docker ~]# mkdir {nginx,php}
# 自构建镜像下载需要源下载还需要修改配置
# 准备源与配置文件
[root@docker ~]# cd php
[root@docker php]# cat php.repo
[php-webtatic]
name = PHP Repo
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
enable = 1
[root@docker php]# cat www.conf
[www]
user = www
group = www
listen = 9000
request_terminate_timeout = 0
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcach
# 编写Dockerfile
[root@docker php]# cat Dockerfile
FROM centos:7
ADD www.conf /etc/php-fpm.d/www.conf
ADD php.repo /etc/yum.repos.d/
RUN useradd www
RUN yum install -y php72w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb php71w-bcmath --skip-broken
EXPOSE 9000
CMD php-fpm -F
# 注:添加文件进容器时,容器内部的目录位置一定不能出错!!!!!
# 构建PHP镜像
[root@docker php]# docker build -t php .
Sending build context to Docker daemon 4.096kB
Step 7/7 : CMD php-fpm -F
---> Running in daa2664570c4
Removing intermediate container daa2664570c4
---> c8c863a4e54b
Successfully built c8c863a4e54b
Successfully tagged php:latest
# 构建nginx镜像
[root@docker php]# cd ../nginx/
# 修改nginx.conf配置(只需修改www用户)
[root@docker nginx]# cat nginx.conf
user www;
worker_processes auto;
# 准备站点配置文件
[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$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 编写Dockerfile
[root@docker nginx]# cat Dockerfile
FROM centos:7
ADD nginx.repo /etc/yum.repos.d/
RUN yum install -y nginx
RUN useradd www
ADD default.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx
EXPOSE 80
CMD nginx -g "daemon off;"
# 注:添加文件进容器时,容器内部的目录位置一定不能出错!!!!!
# 构建nginx镜像
[root@docker nginx]# docker build -t nginx .
Sending build context to Docker daemon 5.632kB
Removing intermediate container 3582348d6233
---> fb425911b532
Successfully built fb425911b532
Successfully tagged nginx:latest
# 拉取数据库镜像
[root@docker nginx]# docker pull mysql:5.7
5.7: Pulling from library/mysql
Digest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
# 建立网桥
[root@docker ~]# docker network create gjl
# 创建映射文件
[root@docker ~]# mkdir /mnt/html
# 下载并解压wordpress安装包
[root@docker html]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@docker html]# tar -xf latest-zh_CN.tar.gz
[root@docker html]# chmod -R 777 wp-content
# 因为nginx需要依赖PHP所以先启动PHP镜像
[root@docker ~]# docker run -d --name php --network gjl -v /mnt/html/:/usr/share/nginx/html php
# 启动nginx镜像连接网桥
[root@docker ~]# docker run -d --name nginx --network gjl -v /mnt/html/:/usr/share/nginx/html -p 80:80 nginx
# 启动MySQL连接网桥
[root@docker ~]# docker run -e MYSQL_ROOT_PASSWORD='123' -e MYSQL_DATABASE=wordpress --network gjl --name mysql mysql:5.7

浙公网安备 33010602011771号