Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Dockerfile与docker-compose.yml_Php_Linux_Apache_Docker_Docker Compose - Fatal编程技术网

Php Dockerfile与docker-compose.yml

Php Dockerfile与docker-compose.yml,php,linux,apache,docker,docker-compose,Php,Linux,Apache,Docker,Docker Compose,Dockerfile和docker compose.yml文件之间有什么关系 看起来我可以使用Dockerfile构建任何Linux设置,使用FROM,RUN(apt-get等)和CMD命令。但这似乎不太可重用(我可以重用整个映像,但服务是硬编码的,不能被其他项目重用) 我应该在新项目中使用这两个文件吗 假设我想要一个普通的灯组: Linux操作系统(debian:wheezy) Apache web服务器(httpd:2.2) MySQL(mariadb) PHP(PHP:5.6) 像在一

Dockerfile
docker compose.yml
文件之间有什么关系

看起来我可以使用
Dockerfile
构建任何Linux设置,使用
FROM
RUN
apt-get
等)和
CMD
命令。但这似乎不太可重用(我可以重用整个映像,但服务是硬编码的,不能被其他项目重用)

我应该在新项目中使用这两个文件吗

假设我想要一个普通的灯组:

  • Linux操作系统(
    debian:wheezy
  • Apache web服务器(
    httpd:2.2
  • MySQL(
    mariadb
  • PHP(
    PHP:5.6
像在一台普通机器上一样一起运行

在主机系统上的目录中:

  • 应用程序源文件的卷
  • vhost配置文件
  • apache日志
  • 数据库中的持久数据
我更喜欢使用官方的、基本的回购协议和图片,而不是预先配置的多功能图片

在这种情况下,配置文件应该是什么样子


我正在Ubuntu上使用
docker compose
v.1.8.1和
docker
v.1.12.3。

docker创建独立的机器(容器)。每个容器只包含一个进程(Apache或Mysql或其他进程);Dockerfile定义如何构建映像

Docker compose允许一起运行、链接和配置容器组

在您的例子中,apache需要知道mysql的“位置”,并且在运行apache容器之前需要唤醒mysql

Dockerfile
定义如何创建应用程序映像。应用程序映像包含应用程序和web浏览器

FROM apache:php5.6

ADD /src /var/www/awesome_project #add a project src code
ADD /config/apache/awesome_project.conf /etc/apache2/sites-available/ # add a configuration
# make any things
然后你需要构建镜像
docker build my_app:latest.

此时,您已经创建了映像,需要运行应用程序并将其链接到db

有两种方法可以做到这一点:

1) 本地docker方法。您运行数据库容器

docker run——命名一些mysql-e mysql\u ROOT\u PASSWORD=my secret pw-d mysql:latest

在您需要运行应用程序容器之后(图像是以前创建的)

docker run——命名我的应用程序——链接一些mysql:mysql-p-d我的应用程序

在这一点上,我们已经完成了应用程序。位这个简单的事情,使我们作出2长的命令。如果需要将应用程序复制到另一台机器,则需要准确地重复此命令

2) docker compose方式允许创建用于运行容器的配置。它描述了如何准确地运行容器

Simple
docker compose.yml
config说明了这种方法

db:
   image: mysql
   environment:
    - MYSQL_USER=root
    - MYSQL_PASSWORD=root

app:
   image: my_app:latest
   ports:
    - 80:80
   depends_on:
    - db
   environment:
    # Database
    - DB_USER_NAME=root
    - DB_USER_PASSWORD=root
此配置允许您一起运行2个容器,链接并配置它们


这是一个非常简单的例子。使用docker compose的优点并不明显,但如果您有5个以上的容器,那么在没有compose的情况下很难将它们一起运行

Dockerfile

  • 是一个Docker形象的配方
  • 仅支持可移植选项(其他选项必须在容器运行时指定)
docker compose.yaml

  • 是一组正在运行的服务的配方
  • 支持覆盖在
    Dockerfile
  • 支持非便携选项
  • 支持创建和配置网络和卷
  • 还可以使用
    build:
两者一起使用是很常见的

Dockerfile
几乎总是用于创建自定义图像。有些映像可能用于运行服务(长时间运行的进程),但有些映像可能用于运行短期交互进程(如运行单元测试)


当您想要运行一个或多个服务时,
docker compose.yaml
非常有用

基本上是关于关注点的分离,一种简单的设想方法是从什么vrs如何的角度思考

Dockerfile定义容器中发生的事情

Docker-compose.yml定义主机中如何运行该容器。这就是为什么他们在文档中说“服务只是生产中的容器”

容器不关心它如何运行或在哪里运行,它只关心它正在运行什么。主机不关心它在运行什么,只关心它是如何运行的。多个实例,这么多的RAM,那么多的CPU,确保在那个实例之前启动这个服务,等等


因此,我们为每一个目的创建了两个单独的配置文档。

所以根本不需要
Dockerfile
?如何仅使用
docker compose.yml
定义问题中描述的整个堆栈?Dockerfile是Docker配置的旧方法还是适合创建低级映像(如发行版克隆)的方法?您需要Dockerfile。Dockerfile定义如何创建特定docker映像(在低级别)。Docker compose定义了如何一起运行、链接和配置容器(从图像)您能否提供这两个文件的完整示例,关于我的问题中的设置?感谢更新,但我仍然看不到php和Apache连接在哪里。为什么来自apache:php5.6的
?在这个示例中,image
my_app
包含src代码、php和apache,因为基本映像是
apache:php5.6
,什么是可移植选项?可移植选项是所有主机上行为相同的选项。用于使用
ENV
公开环境变量的设置。一个不可移植的选项类似于主机绑定挂载,其中目录需要存在于主机上才能工作。谢谢。我一直在试图理解,例如,如果我想运行一个带有特定选项(端口映射和卷)的nginx容器,我是否要使用Dockerfile、docker-compose.yml或其他东西(比如bash脚本)来指定它。如果