Difference between running docker and docker compose - php

I am working with an docker image nanoninja/php-fpm:8.1.
When I run the image manually, the PHP works.
docker container run --rm --name phpfpm -v $(pwd):/var/www/html -p 3000:3000 nanoninja/php-fpm php -S="0.0.0.0:3000" -t="/var/www/html"
But when I try to run the same image with docker-compose.yml file, I don't get a connection to PHP.
Here is my very simple docker-compose.yml file:
version: '3'
services:
php:
image: nanoninja/php-fpm:8.1
restart: always
ports:
- 3000:9000
stdin_open: true
tty: true
I'm not using a Dockerfile.
Question: How to run PHP without Nginx using only docker-compose.yml file?
Image link: https://github.com/nanoninja/php-fpm

The docker-compose file equivalent to your docker container run command would be something like
version: "3"
services:
php:
image: nanoninja/php-fpm:8.1
container_name: phpfpm
restart: always
ports:
- 3000:3000
command: php -S="0.0.0.0:3000" -t="/var/www/html"
volumes:
- ./:/var/www/html
The -v option becomes the volumes: section. The part after the image name becomes the command:. The -p option becomes the ports: section. --name becomes container_name:, etc.

Related

WSL2 docker-compose - unable to prepare context

I am using the Docker Engine running on WSL2 which is running on Windows 10 computer. My goal is to create a service using the Docker-compose that uses the php:fpm image and install the mysqli extension to it. Here is my docker-compose.yaml
version: "3"
services:
nginx:
image: "nginx"
restart: 'always'
ports:
- '3030:80'
volumes:
- ./src:/src
- ./config/site.conf:/etc/nginx/conf.d/default.conf
networks:
- code-network
php:
build:
context: .
dockerfile: Dockerfile
image: php:fpm
volumes:
- ./src:/src
networks:
- code-network
mariadb:
image: "mariadb:10.3.24"
restart: 'always'
volumes:
- "/var/lib/mysql/data:/data"
- "/var/lib/mysql/logs:/logs"
- /var/docker/mariadb/conf:/etc/mysql
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: "T05CNCitk2020#"
MYSQL_USER: "user"
MYSQL_PASSWORD: "Heslo123"
networks:
- code-network
networks:
code-network:
driver: bridge
And here is my Dockerfile:
FROM php:fpm
RUN docker-php-ext-install mysqli
When I run the command docker-compose up --build which forces the container to rebuild. I ran into the following problem:
Building php
unable to prepare context: path "\\\\?\\\\\\wsl$\\Ubuntu-20.04\\home\\vendasky\\Projects\\sql-gui" not found
ERROR: Service 'php' failed to build : Build failed
I do not see the reason why the path should be wrong when all the files are located in the Linux subsystem. Any hints, how to solve this problem?
are you runnning this with docker desktop for windows?
If thats the case try enabling the Docker Compose V2 option under the experimental settings. This should fix your problem.
Docker is unable to find the path to that project, map your ubuntu correctly so it can easily locate the project, that should fix your issue.

Docker "/usr/bin/php" not found in container

I am using docker for my app that includes freeradius,nginx and php.
I want to use "program = "/usr/bin/php " this command in container freeradius but it is not working.
In freeradius container I want to run this command "/usr/bin/php" but it says command not found.
Can anyone help me in this ?
version: '3.2'
services:
freeradius:
image: "ronakzenexim/2stacks_freeradius:v1"
environment:
- RAD_DEBUG=yes
depends_on:
- mysql
- php
links:
- mysql
restart: always
networks:
- backend
php:
image: "ronakzenexim/phpfpm72_mycrypt"
restart: always
volumes:
- "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
- "./web:/var/www/html"
networks:
- backend
networks:
backend:
ipam:
config:
- subnet: 10.0.0.0/24
Create a extension of the freeradius docker image for example
FROM ronakzenexim/2stacks_freeradius:v1
# Now install php
RUN apk update && apk upgrade
RUN apk add php7 php7-fpm php7-opcache
In this container you can run php.

How to install PHP Composer on a Limesurvey Docker image

Forgive me if this is an obvious question. I am fairly new to docker and I am having trouble understanding the installation instructions here:
https://hub.docker.com/_/composer/
I want to use PHP Composer in my Limesurvey docker image that was generated with the following docker-compose "yml" file:
limesurvey-md:
image: mariadb
restart: always
ports:
- "32805:3306"
environment:
MYSQL_DATABASE: limesurvey
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: limesurvey
MYSQL_PASSWORD: password
volumes:
- limesurvey-db:/var/lib/mysql
- limesurvey-dblog:/var/log/mysql
- limesurvey-dbetc:/etc/mysql
limesurvey:
image: fjudith/limesurvey
restart: always
ports:
- "32705:80"
volumes:
- limesurvey-upload:/var/www/html/upload
links:
- limesurvey-md:mysql
What do I need to add to my yml file to accomplish this? If it helps, there is a directory called "application" in the Limesurvey image:
/var/www/html/application
And how do I give this composer a command while it is in the container? I am using Windows 10 and the docker container is running the default linux environment. fjudith's Limesurvey container is using the last 2.X branch of Limesurvey (the one right before 3.X) and it is running PHP 7.2
You can create a custom image with a dockerfile build, yo can specify the dockerfile name in the build section, the docker-compose.yml and dockerfile are in the same folder here i attach and example:
docker-compose.yml:
version: '3.1'
services:
limesurvey-md:
image: mariadb
restart: always
ports:
- 32805:3306
environment:
MYSQL_DATABASE: limesurvey
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: limesurvey
MYSQL_PASSWORD: password
volumes:
- limesurvey-db:/var/lib/mysql
- limesurvey-dblog:/var/log/mysql
- limesurvey-dbetc:/etc/mysql
limesurvey:
build:
context: .
dockerfile: dockerfile
restart: always
ports:
- 32705:80
volumes:
- limesurvey-upload:/var/www/html/upload
links:
- limesurvey-md:mysql
volumes:
limesurvey-db:
driver: local
limesurvey-dblog:
driver: local
limesurvey-dbetc:
driver: local
limesurvey-upload:
driver: local
dockerfile:
FROM "fjudith/limesurvey:latest"
LABEL maintainer="ing.brayan.cm#gmail.com"
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Thanks Brayan! I just (10 minutes ago) figured out another way, you can also do a bash command. Since I was in Windows the two lines I had to do in my command prompt were
docker exec -it <my_container_name> bash
Then it put me into "/var/www/html#" where I did the following command:
$sudo curl -o /tmp/composer-setup.php https://getcomposer.org/installer && curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig && php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" && php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot && rm -f /tmp/composer-setup.*
I adapted the second line from here: Get composer (php dependency manager) to run on a docker image build
From there it's easy! You can just do
composer
and it guides you through the possible commands. It suggests not using the "root" administrator. I'll have to look into creating another user in the docker image.

How to build a docker image with PHP-fpm and nginx using docker-compose

I'm trying to deploy my dockerized application using docker-compose. I have an application service running with php-fpm and an nginx service running with the latest nginx image. Now I would like to build an image that can run my PHP application using Nginx. I'm not sure how to accomplish that. I have seen some images that are pre build for it, but nothing seemed promising.
Would the correct way to do it be to install nginx on a php based imaged and use that? I'm not sure.
version: "3"
services:
application:
networks:
- mynetwork
container_name: the-application
image: the-application:latest
build:
context: ./
dockerfile: ./docker/application.dockerfile
volumes:
- ./backend/:/backend
backend-server:
container_name: the-backend-server
image: the-backend-server:latest
build:
context: ./
dockerfile: ./docker/server.dockerfile
volumes:
- ./backend/:/backend
- ./configs/nginx/nginx.backend-prod.conf:/etc/nginx/conf.d/default.conf
ports:
- 80:80
networks:
- mynetwork
networks:
mynetwork:

Issue with docker compose: container command not found

I'm having an issue when trying to start multiple containers with docker-compose:
Dockerfile:
FROM nginx:1.9
ADD ./nginx-sites/default /etc/nginx/sites-available/default
docker-compose.yml:
version: "2"
services:
web:
build: .
ports:
- "80:80"
volumes:
- ./src:/var/www
links:
- fpm
fpm:
image: php:7-fpm
volumes:
- ./src:/var/www
When I use docker-compose up to start the application, I get the following error:
ERROR: Container command not found or does not exist.
Would love some help with this issue.
Like mentioned in the comments to the original question the php:fpm image requires for it's volume to be set to /var/www/html.
If you want to use a different dir you can work around that by using your own Dockerfile (based on php:fpm). That Dockerfile would like this:
FROM php:fpm
WORKDIR /var/www
It seems like setting the workdir to the desired dir does the trick.
Then in your docker-compose.yml you would build with that Dockerfile instead of using the php:fpm image directly.
version: "2"
services:
# ...
fpm:
build: ./path/to/dockerfile
volumes:
- ./src:/var/www

Categories