I'm learning Docker and I've a problem trying to connect a Rails app on the passenger-full container and a mysql container. Both are linked in a compose file
app:
  build: ./rails
  ports:
    - "80:80"
  links:
    - database
  volumes:
    - ./rails:/home/app/webapp
database:
  image: mysql
  environment:
    - MYSQL_DATABASE="dockertest"
    - MYSQL_USER="dockertest"
    - MYSQL_PASSWORD="dockertest"
    - MYSQL_ROOT_PASSWORD="root"
So I added the apt-get install at the top of my Dockerfile like this
FROM phusion/passenger-full
RUN apt-get update && apt-get install libmysqlclient-dev mysql-client -y
# Set correct environment variables.
ENV HOME /root
# Use baseimage-docker's init process.
CMD ["/sbin/my_init"]
RUN rm -f /etc/service/nginx/down
RUN rm /etc/nginx/sites-enabled/default
ADD webapp.conf /etc/nginx/sites-enabled/webapp.conf
RUN mkdir /home/app/webapp
WORKDIR /home/app/webapp
ADD . /home/app/webapp
RUN cd /home/app/webapp && bundle install
RUN touch /home/app/webapp/tmp/restart.txt
# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
Also this is my database.yml in the Rails app.
default: &default
  adapter: mysql2
  database: dockertest
  host: <%= ENV['MYSQL_PORT_3306_TCP_ADDR'] %>
  port: <%= ENV['MYSQL_PORT_3306_TCP_PORT'] %>
  username: dockertest
  password: dockertest
development:
  <<: *default
production: 
  <<: *default
The problem is that I cant stop receiving the error
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
The webconf file is
# /etc/nginx/sites-enabled/webapp.conf:
server {
    listen 80;
    server_name localhost;
    root /home/app/webapp/public;
    passenger_enabled on;
    passenger_user app;
    passenger_ruby /usr/bin/ruby2.2;
}
Is that the right way to do this? As you can see I'm pretty new to docker.
The problem here is with the links directive in your docker-compose.yml file.  You have:
links:
  - database
That's basically saying that the link name:alias is database:database, according to the docker-compose.yml reference.
Also, if you read the linking container docs you can see that the environments exported to the source container are of the format ALIAS_XXX for example ALIAS_PORT_3306_TCP_PORT. So in essence in your database.yml what you want to do is something like this:
default: &default
  adapter: mysql2
  database: dockertest
  host: <%= ENV['DATABASE_PORT_3306_TCP_ADDR'] %>
  port: <%= ENV['DATABASE_PORT_3306_TCP_PORT'] %>
  username: dockertest
  password: dockertest
development:
  <<: *default
production: 
  <<: *default
If you want to use the MYSQL alias your links would have to look something like this in your docker-compose.yml file.
links:
  - database:mysql
The error:
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
is basically coming from your Rails app not being to see what's in your database.yml and defaulting to a local /var/run/mysqld/mysqld.sock connection.
Hope it helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With