命令缩略
命令 | 作用 |
---|---|
FROM | 镜像基础来源镜像 |
RUN | 构建镜像执行的命令,每一次RUN都会构建一层 |
CMD | 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数 |
VOLUME | 定义数据卷,如果没有定义则使用默认 |
USER | 指定后续执行的用户组和用户 |
WORKDIR | 切换当前执行的工作目录 |
HEALTHCHECH | 健康检测指令 |
ARG | 变量属性值,但不在容器内部起作用 |
EXPOSE | 暴露端口 |
ENV | 变量属性值,容器内部也会起作用 |
ADD | 添加文件,如果是压缩文件也解压 |
COPY | 添加文件,以复制的形式 |
ENTRYPOINT | 容器进入时执行的命令 |
build
docker build -t nginx:v3 .
示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签),最后的 . 代表本次执行的上下文路径。
ADD与COPY
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,从上下文目录中复制文件或者目录到容器里指定路径。不同之处如下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
ENTRYPOINT
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
VOLUME
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
格式:
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
EXPOSE
EXPOSE <端口1> [<端口2>...]
仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
WORKDIR
WORKDIR <工作目录路径>
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
错误汇总
拉取不到镜像
[internal] load metadata for docker.io/library/centos7:alpine:
failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head “https://mirror.baidubce.com/v2/library/centos7/manifests/alpine?ns=docker.io”: unable to connect to 106.39.162.224:443. Do you need an HTTP proxy?
找不到镜像
pull access denied for centos7, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied
写法错误
# 原来的写法
FROM centos7
# 更正后的写法
FROM centos:centos7
PHP + Nginx环境编写
Dockerfile
FROM centos:centos7
LABEL author="TUTU"
# 暴露端口
EXPOSE 80 443
# 安装工具
# 切换目录
WORKDIR /usr/local/src
# 设置变量,执行命令时,就可以省略前缀目录了
ENV PATH /usr/local/nginx/sbin:$PATH
# 拷贝本地目录
COPY ./nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf
COPY ./nginx/vhost /usr/local/nginx/conf/conf.d
# 项目目录
COPY ./codes /usr/local/nginx/html
# 添加远程文件
ADD http://nginx.org/download/nginx-1.17.0.tar.gz .
RUN yum -y update && \
tar zxvf nginx-1.17.0.tar.gz && cd nginx-1.17.0 && \
# 安装扩展
yum -y install wget net-tools gcc gcc-c++ glibc make autoconf zlib zlib-devel pcre pcre-devel openssl openssl-devel && \
yum -y install nginx libxslt-devel -y gd gd-devel GeoIP GeoIP-devel epel-release php php-fpm && \
# 添加nginx用户
useradd -M -s /sbin/nologin nginx && \
# 编译
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_degradation_module --with-http_stub_status_module && make && make install
# 运行php和nginx
CMD /usr/sbin/php-fpm -D && /usr/local/nginx/sbin/nginx -g "daemon off;"
./nginx/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 index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
include ./conf.d/*.conf;
}
./vhost/default.conf
server {
listen 80;
server_name 127.0.0.1;
location / {
root /usr/local/nginx/html;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/nginx/html;
}
location ~ \.php$ {
root /usr/local/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
./codes/index.php
<?php
phpinfo();
构建运行
docker build -t php-test:v1 .
docker run --name php-env -d -p 80:80 -p 443:443 php-test:v1
访问:127.0.0.1