Laravel and Docker setup
I’m creating an exciting new app which cannot be mentioned right now. Unlike most other client projects, I have a blank slate for tech. These became my main considerations:
- I need to spin up something ASAP
- I’ve used CodeIgniter and Cake before and I’m more familiar with PHP than Ruby or python at this point
- Laracasts are hecking great
And Laravel is where I landed.
So far I’ve spent a bunch of time configuring things and noodling around with Docker and Composer, which are both wholly new to me. I ran through Laravel’s installation tutorial and quickly discovered that I have to disable MySQL and Apache for Laravel’s sail up
to work properly:
$ sudo service mysqld stop && sudo service apache2 stop
(Which I’ll have to do every time I restart unless I go and fix that permanently, but I don’t want to do that right this moment)
I also got tired of typing ./vendor/bin/sail
so I made a bash alias:
alias sail='./vendor/bin/sail'
Since Docker is entirely self-contained, when the container sails up its services are not accessible outside of Docker unless ports get forwarded. I got tripped up here a bit and couldn’t get TablePlus to work (it looked so easy in the Laracast, but alas), so I went with trusty ol’ phpMyAdmin does. The main things to pay attention to are under MySQL, you need to forward the ports properly:
mysql: ports: - '3356:3306'
And then for PMA, you need to make sure it’s on the correct network (as well as forwarding the ports properly):
phpmyadmin: ports: - "8080:80" networks: - sail
Here’s the relevant section in my docker-compose.yml
:
mysql: image: 'mysql:8.0' ports: - '3356:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_TCP_PORT: '${DB_PORT}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' volumes: - 'sailmysql:/var/lib/mysql' networks: - sail healthcheck: test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"] retries: 3 timeout: 5s phpmyadmin: image: 'phpmyadmin/phpmyadmin:latest' restart: always environment: PMA_HOST: mysql PMA_USER: '${DB_USERNAME}' PMA_PASSWORD: '${DB_PASSWORD}' ports: - "8080:80" networks: - sail
The next time I sailed up, the Docker image for PMA was automatically downloaded and installed. :thumbsup:
Next challenge was running migrate
in the Docker because I don’t want to manually do this — Laravel’s Eloquent is just so, well, eloquent. Turns out, of course, you can execute things from within running containers, with docker exec
or docker-compose exec
, by giving it the name of the container:
$ docker-compose exec test-app php artisan migrate
And of course, a new bash alias to go with that:
alias de='docker-compose exec'
That way, I can easily run de test-app php artisan tinker
to get to the tinker shell interface.
That’s all for now! Now I’m ready to noodle some more with actual Laravel stuff.