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 手工创建
- 创建文件夹
mkdir -p /usr/local/docker_nginx/{conf,html,log,ssl}
- 创建html/index.html
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
test
</body>
</html>
- 创建基础配置 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 \