Dockerfile
介绍
Dockerfile 是一个文本文件,其中包含一系列用于构建Docker 镜像的指令和配置。它定义了镜像的构建规则、运行环境,以及容器启动时需要执行的操作。通过Dockerfile,可以实现镜像构建的自动化和标准化,方便快速部署和管理应用程序。
常用命令
- 基础镜像和构建环境:
FROM <image>
:指定基础镜像,例如 FROM ubuntu:latest
或 FROM centos
WORKDIR <path>
:设置工作目录,所有后续指令都将在此目录下执行.
ENV <key> <value>
:设置环境变量,例如 ENV MYSQL_USER user
ARG <name>[=<default value>]
:定义构建参数,可以在构建镜像时传入.
- 文件操作:
COPY <src>... <dest>
:将文件从构建上下文复制到镜像中.
ADD <src>... <dest>
:类似于 COPY,但支持从URL下载文件和自动解压缩.
VOLUME <path>
:创建一个数据卷,用于持久化存储数据.
- 命令执行:
RUN <command>
:在镜像中执行命令,例如 RUN apt-get update
.
CMD ["executable","param1","param2"]
:指定容器启动时要运行的命令,这可以被运行时提供的参数覆盖.
ENTRYPOINT ["executable","param1","param2"]
:指定容器启动时要运行的命令,但不能被运行时提供的参数覆盖,通常与CMD结合使用.
- 其他指令
EXPOSE <port>
:声明容器运行时监听的端口,例如 EXPOSE 8080
.
USER <user>
:指定运行容器的用户,例如 USER appuser
.
LABEL <key>=<value>
:添加镜像元数据,例如 LABEL maintainer="John Doe"
.
ONBUILD <INSTRUCTION>
:定义在其他镜像构建时要执行的指令.
STOPSIGNAL signal
:定义容器停止时发送的系统调用信号.
ADD
和 COPY
的区别:
ADD
指令和 COPY
指令都可以用来复制文件到镜像中,但ADD
指令还支持从URL 下载文件,以及自动解压缩本地压缩文件。当需要从远程URL 下载文件或者解压缩本地文件时,应该使用 ADD
指令。其他情况下,推荐使用 COPY
指令,因为它更简单明了,更容易理解,并且在构建时会避免不必要的解压缩操作.
CMD
和 ENTRYPOINT
的区别:
CMD
指令和 ENTRYPOINT
指令都可以用来指定容器启动时要运行的命令,但 CMD
指令可以被运行时提供的参数覆盖,而 ENTRYPOINT
指令不能被运行时提供的参数覆盖。CMD
指令通常用来提供容器的默认命令,而 ENTRYPOINT
指令通常用来定义容器的可执行程序.
使用例子
dockerhub仓库有很多服务镜像,初学者不需要自己从零开始构建,只需要了解dockerfile运行机制和修改dockerfile即可。
后面用自己常用的技术栈举例子:PHP
- PHP dockerfile
1 2
| # 构建镜像的命令,dev-php7.4-fpm 是镜像的名称 docker build -t dev-php7.4-fpm .
|
有些扩展可能安装的时候有可能不维护了会出现找不到,也有的扩展参数变了会导致安装失败,具体情况根据安装错误提示做对应的修改。
扩展安装文档docker-php-extension-installer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
FROM php:7.4-fpm
RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext \ sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm
RUN apt-get update && \ apt-get install -y --no-install-recommends libbz2-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) bz2
RUN apt-get update && \ 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=/usr/include/ --with-jpeg=/usr/include/ && \ docker-php-ext-install -j$(nproc) gd
RUN apt-get update && \ apt-get install -y --no-install-recommends libgmp-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) gmp
RUN apt-get update && \ apt-get install -y --no-install-recommends libxml2-dev libtidy-dev libxslt1-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) soap xmlrpc tidy xsl
RUN apt-get update && \ apt-get install -y --no-install-recommends libzip-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) zip
RUN apt-get update && \ apt-get install -y --no-install-recommends libsnmp-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) snmp
RUN apt-get update && \ apt-get install -y --no-install-recommends libpq-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) pgsql pdo_pgsql
RUN apt-get update && \ apt-get install -y --no-install-recommends libpspell-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) pspell
RUN apt-get update && \ apt-get install -y --no-install-recommends firebird-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) pdo_firebird
RUN apt-get update && \ apt-get install -y --no-install-recommends freetds-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-configure pdo_dblib --with-libdir=lib/x86_64-linux-gnu && \ docker-php-ext-install -j$(nproc) pdo_dblib
RUN apt-get update && \ apt-get install -y --no-install-recommends libldap2-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-configure ldap --with-libdir=lib/x86_64-linux-gnu && \ docker-php-ext-install -j$(nproc) ldap
RUN apt-get update && \ apt-get install -y --no-install-recommends libc-client-dev libkrb5-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-configure imap --with-kerberos --with-imap-ssl && \ docker-php-ext-install -j$(nproc) imap
RUN apt-get update && \ apt-get install -y --no-install-recommends libicu-dev && \ rm -r /var/lib/apt/lists/* && \ docker-php-ext-install -j$(nproc) intl
RUN apt-get update && \ apt-get install -y --no-install-recommends libmcrypt-dev && \ rm -r /var/lib/apt/lists/* && \ pecl install mcrypt-1.0.9 && \ docker-php-ext-enable mcrypt
RUN export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" && \ apt-get update && \ apt-get install -y --no-install-recommends libmagickwand-dev && \ rm -rf /var/lib/apt/lists/* && \ pecl install imagick && \ docker-php-ext-enable imagick
RUN apt-get update && \ apt-get install -y --no-install-recommends zlib1g-dev libmemcached-dev && \ rm -r /var/lib/apt/lists/* && \ pecl install memcached && \ docker-php-ext-enable memcached
RUN pecl install redis && docker-php-ext-enable redis
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache
RUN set -ex; \ docker-php-source extract; \ { \ echo '# https://github.com/docker-library/php/issues/103#issuecomment-271413933'; \ echo 'AC_DEFUN([PHP_ALWAYS_SHARED],[])dnl'; \ echo; \ cat /usr/src/php/ext/odbc/config.m4; \ } > temp.m4; \ mv temp.m4 /usr/src/php/ext/odbc/config.m4; \ apt-get update; \ apt-get install -y --no-install-recommends unixodbc-dev; \ rm -rf /var/lib/apt/lists/*; \ docker-php-ext-configure odbc --with-unixODBC=shared,/usr; \ docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr; \ docker-php-ext-install odbc pdo_odbc; \ docker-php-source delete
RUN pecl install xdebug-3.1.5 && docker-php-ext-enable xdebug
LABEL Author="yanjenlew" LABEL Version="dev-php-fpm" LABEL Description="PHP-FPM 7.4 image. All extensions."
|
Docker-compose 使用
Docker Compose 常用命令主要用于管理多个容器化应用程序。核心命令包括 up, down, ps, logs, exec, build, restart, stop, rm 和 scale。它们分别用于启动/停止容器、查看状态、获取日志、执行命令、构建镜像、重启、停止、删除容器和调整容器副本数量。
docker-compse.yml 常用参数
- 顶级字段
version
: 定义 Docker Compose 文件格式的版本。
解释: 指定 Compose 文件的版本(如 ‘3.8’),决定了支持的语法和功能。建议使用最新版本以获得最佳兼容性。
示例:
services
: 定义应用程序中的各个服务(容器)。
解释: 每个服务对应一个容器,web
和 db
是服务名称,可自定义。
示例:
1 2 3 4 5
| services: web: image: nginx:latest db: image: mysql:8.0
|
networks
: 定义网络,用于服务之间的通信。
解释: 指定网络类型(如 bridge
、overlay
),容器可以通过网络互相通信。
示例:
1 2 3
| networks: my-network: driver: bridge
|
volumes
: 定义持久化存储卷。
解释: 创建命名的卷(如 db-data
)用于持久化数据,支持不同驱动(如 local
)。
示例:
1 2 3
| volumes: db-data: driver: local
|
services
下的常用配置
以下参数通常在 services
下的具体服务(如 web
或 db
)中配置。
image
:指定服务使用的 Docker 镜像。
解释: 使用 Docker Hub 或私有仓库中的镜像。如果镜像不存在,Compose 会尝试拉取。
示例:
build
: 指定构建镜像的上下文路径或 Dockerfile。
解释: context
指定构建上下文目录,dockerfile
指定 Dockerfile
文件名。
示例:
1 2 3
| build: context: . dockerfile: Dockerfile
|
container_name
: 自定义容器名称。
解释: 默认情况下,容器名称由项目名和服务名生成,设置此参数可自定义名称。
示例:
1
| container_name: my-web-container
|
ports
:映射容器端口到宿主机。
解释: 格式为 “宿主机端口:容器端口
“,将容器的端口暴露到宿主机。
示例:
1 2 3
| ports: - "80:80" - "8080:8080"
|
volumes
:挂载宿主机路径或命名卷到容器。
解释: 第一个示例将宿主机的 ./data 挂载到容器的 /app/data,第二个示例使用命名卷 db-data。
示例:
1 2 3
| volumes: - ./data:/app/data - db-data:/var/lib/mysql
|
environment
:设置容器内的环境变量。
解释: 定义环境变量,供容器内的应用程序使用。
示例:
1 2 3
| environment: - MYSQL_ROOT_PASSWORD=secret - APP_ENV=production
|
env_file
:从文件中加载环境变量。
解释: 从指定的 .env
文件中读取环境变量,适合管理多个变量。
示例:
depends_on
: 定义服务之间的依赖关系。
解释: 确保 db
和 redis
服务在当前服务启动前已启动(但不保证服务完全就绪)。
示例:
networks
:指定服务连接的网络。
解释: 将服务连接到指定的网络,允许容器之间通信。
示例:
restart
:定义容器的重启策略。
解释: 可选值包括 no
(不重启)、always
(总是重启)。
示例:
command
:覆盖容器默认的启动命令。
解释: 指定容器启动时执行的命令,覆盖 Dockerfile
中的 CMD
。
示例:
1
| command: ["nginx", "-g", "daemon off;"]
|
healthcheck
:定义容器的健康检查。
解释: 设置健康检查命令、间隔、超时时间和重试次数,确保容器运行正常。
示例:
1 2 3 4 5
| healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3
|
- networks 下的常用配置
driver
:指定网络驱动类型。
解释: 常用驱动包括 bridge(默认,单主机网络)、overlay(多主机网络)、host(使用宿主机网络)。
示例:
1 2 3
| networks: my-network: driver: bridge
|
name
:自定义网络名称。
解释: 设置网络的实际名称,避免默认生成的项目名前缀。
示例:
1 2 3
| networks: my-network: name: custom-network
|
- volumes 下的常用配置
driver
:指定卷的存储驱动。
解释: 默认驱动为 local
,支持其他驱动如 nfs
或 tmpfs
。
示例:
1 2 3
| volumes: db-data: driver: local
|
driver_opts
:设置存储驱动的选项。
解释: 为特定驱动(如 NFS)配置选项。
示例:
1 2 3 4 5 6 7
| volumes: db-data: driver: local driver_opts: type: nfs o: addr=192.168.1.1,rw device: /path/to/nfs
|
- 其他常用字段
deploy
:定义部署相关的配置(主要用于 Docker Swarm)。
解释: 指定副本数量、重启策略等,适用于 Swarm 模式。
示例:
1 2 3 4
| deploy: replicas: 3 restart_policy: condition: on-failure
|
logging
:配置日志行为。
解释: 设置日志驱动(如 json-file
)和选项(如最大文件大小和数量)。
示例:
1 2 3 4 5
| logging: driver: json-file options: max-size: "10m" max-file: "3"
|
- 完整示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| version: '3.8' services: web: image: nginx:latest container_name: web-server ports: - "80:80" volumes: - ./html:/usr/share/nginx/html environment: - NGINX_PORT=80 depends_on: - app networks: - my-network app: build: context: . dockerfile: Dockerfile environment: - APP_ENV=production volumes: - app-data:/app/data restart: always networks: - my-network db: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORD=secret volumes: - db-data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s retries: 3 networks: - my-network networks: my-network: driver: bridge volumes: app-data: driver: local db-data: driver: local
|
常用指令
- 启动/停止容器:
docker-compose up
: 启动或重新启动所有在 docker-compose.yml
文件中定义的容器。默认情况下,它会构建镜像(如果需要),创建容器,然后启动它们。
docker-compose up -d
: 以分离模式(后台运行) 启动容器。
docker-compose down
: 停止并删除容器、网络和卷。使用 -v 选项可以同时删除数据卷。
docker-compose start [SERVICE...]
: 启动已停止的容器。
docker-compose stop [SERVICE...]
: 停止正在运行的容器。
docker-compose restart [SERVICE...]
: 重启容器。
docker-compose pause [SERVICE...]
: 暂停一个或多个服务容器。
docker-compose unpause [SERVICE...]
: 恢复一个或多个暂停的服务容器。
- 查看容器状态/日志:
docker-compose ps
: 列出所有容器的状态。可以添加服务名称来查看特定服务的容器状态。
docker-compose logs [SERVICE...]
: 查看服务的日志输出。使用 -f
选项可以实时跟踪日志。
docker-compose top [SERVICE...]
: 显示容器中运行的进程。
- 构建/删除镜像:
docker-compose build [SERVICE...]
: 构建或重新构建镜像。
docker-compose pull [SERVICE...]
: 拉取服务镜像。
docker-compose push [SERVICE...]
: 推送服务镜像。
docker-compose rm [SERVICE...]
: 删除已停止的容器。
docker-compose down --rmi all
: 删除容器、网络和镜像。
- 执行命令:
docker-compose exec [OPTIONS] SERVICE COMMAND [ARGS...]
: 在正在运行的容器中执行命令。
例如: docker-compose exec web bash
会在 web
服务的容器中启动一个 bash
终端。
- 其他命令:
docker-compose config
: 验证和查看 docker-compose.yml
文件的配置。
docker-compose scale SERVICE=NUM
: 调整指定服务的容器副本数量。
- 命令选项:
-f, --file FILE
: 指定使用的Compose 模板文件,默认为 docker-compose.yml
,可以指定多个文件。
-p, --project-name NAME
: 指定项目名称,默认使用目录名。
--verbose
: 输出更多调试信息。
docker-compose 实例
这个实例比较简单,目前就搭建了php74,ngnix,mysql。后面有时间在继续补充。
GitHub地址
总结
暂时就用着一个php-fpm的例子,其他的服务比如ngnix,MySQL,PgSQL这些直接拉去官方就行使用就行了.
一般基础镜像官方都有维护直接拉取使用即可,有些扩展可能需要手动安装,使用dockerfile引用官方镜像安装一下就行了,其他基本不需要怎么修改。开发环境可以不用知道太多也可以使用的很流畅,相关知识一边用一边学即可。如果是生产环境需要自己有把握以后在使用。


Rainbow Bubbles
I have seen through it, but not to the end.