Dockerfile-定制

397 阅读4分钟

1.常用配置

指令内容
FROM基础库 FROM nginx:tag
MAINTAINER作者
WORKDIR工作文件夹,等价于cd效果
ENV添加环境变量-可多条
COPY从宿主机器复制到容器 ,不支持自动解压和url下载
ADD从宿主机器复制到容器 ,如果是压缩文件,会自动解压。支持URL路径下载源文件,但下载方式不能自动解压。
EXPOSE导出的端口
RUN构建镜像时的执行脚本,建议多个指令 \ 换行,用&&隔开在一个run中执行。
ENTRYPOINT容器启动时作为根入口程序,多条以最后一条为主
CMD容器启动时候执行脚本 ,当与ENTRYPOINT配合时,作为参数处理, 多条以最后一条为主
ARG定义编译镜像时,可以传入的参数
VOLUMN设置挂载卷
LABEL定义变量
USER指定运行的用户 默认root

.dockerignore 用于排除当前Dockerfile不需要的文件。

daemon off 参数来强制 Nginx 进程前台启动

每次执行 run 和 cmd 都会生成一层layer

cmd命令与entrypoint的区别

cmd

定义的命令会被 启动的命令所覆盖, (推荐使用,便于后面临时扩展,不用重新编译)

# Dockerfile
FROM centos 
CMD ["ls","-s"]

docker build -t mytest -f Dockerfile .

# 启动命令
docker run mytest ls -l
可以看到 原来定义的 CMD ["ls","-s"] 被 ls -l 覆盖了

entrypoint

# Dockerfile
FROM centos 
ENTRYPOINT ["ls","-s"]

docker build -t mytest -f Dockerfile .

# 启动命令
docker run mytest  -s -l # 命令在前面的基础上 累加了, 变成 ls -s -l
docker run mytest ls -sl # 会提示报错
#可以看到 原来定义的 ENTRYPOINT  原有的  ["ls","-s"] 被保留,追加了  -l

#当然 我们可以使用 --entrypoint  覆盖原有的
docker run -itd --entrypoint ls -l   mytest

2. 定制nginx

方案1- 全部走web

Dockerfile

FROM centos:7
MAINTAINER JASON.YANG
# 切换yum源为阿里云 可以忽略
RUN yum install wget -y && cd /etc/yum.repos.d/ && rm -rf ./* && \
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
wget  -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum makecache
# 安装第三方库
RUN yum install -y gcc gcc-c++ make \
    openssl-devel pcre-devel pcre gd-devel \
    iproute net-tools telnet curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*
# 下载nginx与配置插件    
RUN wget http://nginx.org/download/nginx-1.22.0.tar.gz && \
    tar zxf nginx-1.22.0.tar.gz && \
    cd nginx-1.22.0 && \
    ./configure --prefix=/usr/local/nginx \
    #--add-module=/usr/local/echo-nginx-module \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_gzip_static_module \
    --with-pcre \
    --with-http_stub_status_module && \
    # 安装执行
    make -j 4 && make install && \
    # 删除nginx生成文件
    rm -rf /usr/local/nginx/html/* && \
    cd / && rm -rf nginx-1.22.0* && \
    # 设置系统时间
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV PATH $PATH:/usr/local/nginx/sbin
#COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
# 暴露80端口
EXPOSE 80
# nginx前台运行,不然docker运行完就结束任务了
CMD ["nginx", "-g", "daemon off;"]

准备测试1 cp复制

#1. 先创建 html conf logs 文件夹
mkdir -p /usr/local/docker_nginx/{conf,html,log,ssl}
#2. 先启动一下nginx 
docker run --name nginx -p 8818:80 -d nginx
#3. 通过命令复制关键 信息到本地
docker cp nginx:/usr/local/nginx/conf.d  /usr/local/docker_nginx/conf/
docker cp nginx:/usr/local/nginx/nginx.conf /usr/local/docker_nginx/conf/nginx.conf
docker cp nginx:/usr/local/nginx/html/index.html /usr/local/docker_nginx/html/index.html

准备测试2 手工创建

  1. 创建文件夹
mkdir -p /usr/local/docker_nginx/{conf,html,log,ssl}
  1. 创建html/index.html
<!DOCTYPE html>
<html>
<head>
	<title>test</title>
</head>
<body>
	test
</body>
</html>
  1. 创建基础配置 conf/nginx.conf
worker_processes  1; 
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index2.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        } 
    }
}

测试执行 dockerfile

docker build -t nginx:v1 -f Dockerfile .
docker images
docker run --name nginx-v1 -d -p 8837:80 --restart=always --privileged=true \
  -v /usr/local/docker_nginx/html:/usr/local/nginx/html \
  -v /usr/local/docker_nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
  -v /usr/local/docker_nginx/logs:/usr/local/nginx/logs \
 nginx:v1 
 
# 测试生效
curl 127.1.0.0.1: 8837
# 测试生效 https
curl -v --insecure https://127.1.0.0.1: 8837
# 修改配置
vim /usr/local/docker_nginx/conf/nginx.conf

# 重启 nginx
docker restart nginx-v1

# 停止+删除 nginx
docker stop nginx-v1
docker rm nginx-v1

方案2 本地nginx拷贝

Dockerfile2

# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM ansible/centos7-ansible
#MAINTAINER 维护者信息
MAINTAINER JASON.YANG
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.18.0.tar.gz /usr/local/
#RUN 执行以下命令 
#RUN yum makecache fast
RUN yum install -y epel-release
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
#执行创建用户的命令 创建权限www用户
RUN useradd -s /sbin/nologin -M www
#WORKDIR相当于cd
WORKDIR /usr/local/nginx-1.18.0 
# 这里给用户www 启动nginx的权限
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
#EXPOSE映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx","-g","daemon off;"]

执行测试

docker build -t nginx:v2 -f Dockerfile2 .
docker images
docker run --name nginx-v2 -d -p 8837:80 --restart=always --privileged=true \
  -v /usr/local/docker_nginx/html:/usr/local/nginx/html \
  -v /usr/local/docker_nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
  -v /usr/local/docker_nginx/logs:/usr/local/nginx/logs \
 nginx:v2

3.定制node

1.搭建简单node项目

mkdir myNodeDocker
cd myNodeDocker
npm init -y 
npm i koa -s
touch app.js
vim app.js
//app.js代码
const Koa = require('koa') const app = new Koa() app.use(ctx => {
   ctx.body = 'Hello Docker' })
   app.listen(3000, () => {
   console.log('app started at http://localhost:3000/')
})

2.创建Dockerfile 文件

touch Dockerfile
vim Dockerfile
#制定node镜像的版本
FROM node:10-alpine #移动当前目录下面的文件到app目录下 
ADD . /app/ 
#进入到app目录下面,类似cd 
WORKDIR /app
#安装依赖
RUN npm install
#对外暴露的端口
EXPOSE 3000
#程序启动脚本
CMD ["node", "app.js"]

3.构建镜像

$ docker build -t myNodeImages .

4.运行镜像

$ docker run -p 3000:3000 -d myNodeImages

定制php

1. PHP 7.3.7

Dockerfile

# 从官方基础版本构建
FROM php:7.3.7-fpm
# 官方版本默认安装扩展: 
# Core, ctype, curl
# date, dom
# fileinfo, filter, ftp
# hash
# iconv
# json
# libxml
# mbstring, mysqlnd
# openssl
# pcre, PDO, pdo_sqlite, Phar, posix
# readline, Reflection, session, SimpleXML, sodium, SPL, sqlite3, standard
# tokenizer
# xml, xmlreader, xmlwriter
# zlib

# 更新为国内镜像
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
    && echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \
    && echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \
    && echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \
    && echo 'deb http://security.ubuntu.com/ubuntu xenial-security main' >> /etc/apt/sources.list \
    && apt-get update 

# bcmath, calendar, exif, gettext, sockets, dba, 
# mysqli, pcntl, pdo_mysql, shmop, sysvmsg, sysvsem, sysvshm 扩展
RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv
 
# GD 扩展
 RUN apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
 	&& rm -r /var/lib/apt/lists/* \
     && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
     && docker-php-ext-install -j$(nproc) gd

# imagick 扩展
 RUN export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \
     && apt-get install -y --no-install-recommends libmagickwand-dev \
 	&& rm -r /var/lib/apt/lists/* \
     && pecl install imagick-3.4.4 \
     && docker-php-ext-enable imagick

# mcrypt 扩展 
RUN apt-get install -y --no-install-recommends libmcrypt-dev \
	&& rm -r /var/lib/apt/lists/* \
    && pecl install mcrypt-1.0.2 \
    && docker-php-ext-enable mcrypt

# Memcached 扩展 
RUN apt-get install -y --no-install-recommends libmemcached-dev zlib1g-dev \
	&& rm -r /var/lib/apt/lists/* \
    && pecl install memcached-3.1.3 \
    && docker-php-ext-enable memcached

# redis 扩展
RUN pecl install redis-5.0.0 && docker-php-ext-enable redis

# opcache 扩展 
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache

# xdebug 扩展
RUN pecl install xdebug-2.7.2 && docker-php-ext-enable xdebug

# swoole 扩展
RUN pecl install swoole-4.4.0 && docker-php-ext-enable swoole

# 镜像信息
LABEL Author="mydockerfile"
LABEL Version="1.0"
LABEL Description="PHP 7.3.7 开发环境镜像."

2. php:7.0-fpm 指定镜像源文件

touch apt-list

deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib

Dockerfile

FROM php:7.0-fpm

ADD apt-list /opt/

RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak \ 
	&& cat /opt/apt-list >/etc/apt/sources.list \ 
	&& apt-get update \ 
	&& apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev

RUN docker-php-ext-install -j$(nproc) iconv mcrypt \
    	&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    	&& docker-php-ext-install -j$(nproc) gd \
   	&& docker-php-ext-install pdo_mysql \
   	&& docker-php-ext-install zip
		

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
    	&& composer config -g repo.packagist composer https://packagist.phpcomposer.com \