使用 docker-compose.yml 部署
Deploy with docker-compose.yml
不确定这是否会是一个重复的问题,但我试图找出一些东西但不确定我是否和其他人有类似的情况。
所以我是 docker 的新手,正在尝试为一个小型网站设置部署。
到目前为止我有一个包含 3 个文件的文件夹。
index.html - has basic html
Dockerfile - which has
FROM ubuntu:16.04
COPY . /var/www/html/
- docker-compose.yml - which has
version: '2.1'
services:
app:
build: .
image: myname/myapp:1.0.0
nginx:
image: nginx
container_name: nginx
volumes:
- ./host-volumes:/cont-volumes
network_mode: "host"
phpfpm56:
image: php-fpm:5.6
container_name: phpfpm56
volumes:
- ./host-volumes:/cont-volumes
network_mode: "host"
mysql:
image: mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- mysql:/var/lib/mysql
volumes:
mysql:
现在我正在使用 jenkins 创建构建,将我的所有代码放入主机卷以使其可供容器使用,然后我会 运行
docker-compose build
现在它创建了一个图像,我将它推送到 docker hub
。
然后我登录到远程服务器并拉取图像和运行。但这行不通,因为我仍然需要 运行 docker-在容器内组合。
这是正确的方法还是我遗漏了什么?
docker-compose 不应 运行 在容器内,而应在 docker 主机上。因此,这可能是通过主机上的 sh 运行,但是无论您在哪里 运行 命令,都需要能够访问 composefile。
执行此操作的标准方法是将您的代码复制到图像中。不要绑定包含您的代码的主机文件夹;相反,使用 Dockerfile COPY
指令复制应用程序代码(在编译语言中,使用 RUN
命令来构建它)。例如,您的 PHP 容器可能有一个对应的 Docker 文件,看起来像 (referencing this base Dockerfile)
FROM php-fpm:5.6
# Base Dockerfile defines a sensible WORKDIR
COPY . .
# Base Dockerfile sets EXPOSE 9000
# Base Dockerfile defines ENTRYPOINT, CMD
然后你的 docker-compose.yml
会说,部分
version: '3'
service:
phpfpm56:
build: .
image: me/phpfpm56:2019-04-30
# No other settings
然后你的 nginx 配置会说,部分(使用 Docker Compose 服务名称作为主机名)
fastcgi_pass phpfpm56:9000
如果您在生产中使用它,您需要注释掉我认为的 build:
行。
如果您非常喜欢一个工作流程,其中除了 localhost
之外没有主机名,并且您不需要重建 Docker 图像来更新代码,您至少需要重新启动 (一些)你完成代码推送后的容器。
docker-compose stop app phpfpm56
docker-compose up -d
您可能会研究像 Ansible 或 Chef 这样的系统自动化工具来自动化代码推送机制。这些相同的工具也可以只安装 nginx 和 PHP,如果你想避免 Docker 图像构建序列,你可能有一个更简单的安装和部署系统直接在 运行 服务器上主持人
不确定这是否会是一个重复的问题,但我试图找出一些东西但不确定我是否和其他人有类似的情况。 所以我是 docker 的新手,正在尝试为一个小型网站设置部署。
到目前为止我有一个包含 3 个文件的文件夹。
index.html - has basic html
Dockerfile - which has
FROM ubuntu:16.04
COPY . /var/www/html/
- docker-compose.yml - which has
version: '2.1'
services:
app:
build: .
image: myname/myapp:1.0.0
nginx:
image: nginx
container_name: nginx
volumes:
- ./host-volumes:/cont-volumes
network_mode: "host"
phpfpm56:
image: php-fpm:5.6
container_name: phpfpm56
volumes:
- ./host-volumes:/cont-volumes
network_mode: "host"
mysql:
image: mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- mysql:/var/lib/mysql
volumes:
mysql:
现在我正在使用 jenkins 创建构建,将我的所有代码放入主机卷以使其可供容器使用,然后我会 运行
docker-compose build
现在它创建了一个图像,我将它推送到 docker hub
。
然后我登录到远程服务器并拉取图像和运行。但这行不通,因为我仍然需要 运行 docker-在容器内组合。
这是正确的方法还是我遗漏了什么?
docker-compose 不应 运行 在容器内,而应在 docker 主机上。因此,这可能是通过主机上的 sh 运行,但是无论您在哪里 运行 命令,都需要能够访问 composefile。
执行此操作的标准方法是将您的代码复制到图像中。不要绑定包含您的代码的主机文件夹;相反,使用 Dockerfile COPY
指令复制应用程序代码(在编译语言中,使用 RUN
命令来构建它)。例如,您的 PHP 容器可能有一个对应的 Docker 文件,看起来像 (referencing this base Dockerfile)
FROM php-fpm:5.6
# Base Dockerfile defines a sensible WORKDIR
COPY . .
# Base Dockerfile sets EXPOSE 9000
# Base Dockerfile defines ENTRYPOINT, CMD
然后你的 docker-compose.yml
会说,部分
version: '3'
service:
phpfpm56:
build: .
image: me/phpfpm56:2019-04-30
# No other settings
然后你的 nginx 配置会说,部分(使用 Docker Compose 服务名称作为主机名)
fastcgi_pass phpfpm56:9000
如果您在生产中使用它,您需要注释掉我认为的 build:
行。
如果您非常喜欢一个工作流程,其中除了 localhost
之外没有主机名,并且您不需要重建 Docker 图像来更新代码,您至少需要重新启动 (一些)你完成代码推送后的容器。
docker-compose stop app phpfpm56
docker-compose up -d
您可能会研究像 Ansible 或 Chef 这样的系统自动化工具来自动化代码推送机制。这些相同的工具也可以只安装 nginx 和 PHP,如果你想避免 Docker 图像构建序列,你可能有一个更简单的安装和部署系统直接在 运行 服务器上主持人