So we have images for our application! Let's next create a docker-compose.yml file to spin up these containers, and any others we may need, to run our application and use commands such as composer install to get our PHP dependencies.
Docker Compose File
Create file docker-compose.yml in our project directory.
We cover the details of this in the video.
version: '2'
services:
app:
build:
context: ./docker/app
dockerfile: Dockerfile
image: shippingdocker.com/app
volumes:
- .:/var/www/html
ports:
- "80:80"
networks:
- sdnet
node:
build:
context: ./docker/node
dockerfile: Dockerfile
image: shippingdocker.com/node
volumes:
- .:/var/www/html
networks:
- sdnet
mysql:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "secret"
MYSQL_DATABASE: "homestead"
MYSQL_USER: "homestead"
MYSQL_PASSWORD: "secret"
volumes:
- mysqldata:/var/lib/mysql
networks:
- sdnet
redis:
image: redis:alpine
volumes:
- redisdata:/data
networks:
- sdnet
networks:
sdnet:
driver: "bridge"
volumes:
mysqldata:
driver: "local"
redisdata:
driver: "local"
Run the Composer Command
Now we can use this setup to run some commands against our application.
# Don't need to set networks, volume mounts or
# other config set for the `app` service in
# the docker-compose.yml file
docker-compose run --rm \
-w /var/www/html \
app \
composer install
Up and Running
Then we create a new .env file. Copy the original .env.example and change the following in .env:
DB_HOST=mysql
CACHE_DRIVER=redis
SESSION_DRIVER=redis
REDIS_HOST=redis
We'll need an APP_KEY as well for the .env file:
docker-compose run --rm \
-w /var/www/html \
app \
php artisan key:generate
Redis Library
Note that I already have the predis/predis PHP library, but if you're starting from a Laravel application that does NOT already have this library, you can include it here as well:
docker-compose run --rm \
-w /var/www/html \
app \
composer require predis/predis
Then we can spin up our containers to run this in development:
docker-compose up -d
This will run our app, mysql and redis containers defined. The Node container exists, we can use it, but it doesn't actively run (it's there just for one-off npm or gulp commands).
Check out our containers:
docker-compose ps