Mysql connection refused in docker-compose - mysql

I have a problem connecting to MySQL from my golang app in docker-compose. I can connect to db from console: mysql -u user -D data -h 0.0.0.0 -P3306 -p
But, I can't connect when using docker-compose.
My docker-compose.yml
version: '3'
services:
app:
build: ./
volumes:
- ./internal/app:/app
- ./logs:/var/log/parser
links:
- db
db:
image: mysql:8
container_name: mysqldb
ports:
- "3306:3306"
volumes:
- ./docker/mysql/conf:/etc/mysql/conf/conf.d
- ./docker/mysql/logs/:/var/log/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d
- ./docker/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: data
MYSQL_USER: user
MYSQL_PASSWORD: pass
In my app main.go
dbConfig := mysql.NewConfig()
dbConfig.User = "user"
dbConfig.Passwd = "pass"
dbConfig.Addr = "mysqldb"
dbConfig.DBName = "data"
dbConfig.Net = "tcp"
db, err := sql.Open("mysql", dbConfig.FormatDSN())
if err != nil {
panic(err.Error())
}
defer db.Close()
But I get this error:
panic: dial tcp 172.20.0.2:3306: connect: connection refused

I think your golang service starts before the MySQL service. so you have to start MySQL service first then golang service so, use depends_on to achieve that.
new docker-compose.yml with depends_on
version: '3'
services:
app:
build: ./
volumes:
- ./internal/app:/app
- ./logs:/var/log/parser
depends_on:
- mysqldb
links:
- db
db:
image: mysql:8
container_name: mysqldb
ports:
- "3306:3306"
volumes:
- ./docker/mysql/conf:/etc/mysql/conf/conf.d
- ./docker/mysql/logs/:/var/log/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d
- ./docker/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: data
MYSQL_USER: user
MYSQL_PASSWORD: pass

Related

trying to connect typeorm to mysql container in docker-compose but got this error Error: Access denied for user ''#'172.29.0.3' (using password: YES)

I am running node and mysql containers with docker compose and try to connect typeorm with mysql container but I got the same error over and over
this my docker-compose file
version: '3.8'
services:
db:
image: mysql
restart: always
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: password
app:
build: .
command: npm start
volumes:
- .:/usr/app/
ports:
- '8000:8000'
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_NAME: test
MYSQL_PASSWORD: password
this is my typeorm config file
import {DataSource} from 'typeorm';
import * as dotenv from 'dotenv';
dotenv.config();
export const appDataSource = new DataSource({
type: 'mysql',
host: process.env.MYSQL_HOST,
port: 3306,
password: process.env.MYSQL_PASSWORD,
entities:[
'src/entities/*.js'
],
synchronize: true,
logging: true
});
and this is my .env file
MYSQL_USER = root
MYSQL_PASSWORD = password
MYSQL_NAME = test
MYSQL_HOST = db
MYSQL_PASSWORD = password
Your MySQL and application container seems to be in two different networks.
Try with following docker-compose :
version: '3.8'
services:
db:
image: mysql
restart: always
network_mode: "host"
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: password
app:
build: .
command: npm start
network_mode: "host"
volumes:
- .:/usr/app/
ports:
- '8000:8000'
depends_on:
- db
environment:
MYSQL_HOST: db
MYSQL_NAME: test
MYSQL_PASSWORD: password
here both containers will run on host.
For fixing : > Error: getaddrinfo EAI_AGAIN
Try adding following to /etc/hosts file. (If you are on Linux destro)
0.0.0.0 db
0.0.0.0 app

Error database connect is not a function Nodejs with Mysql in docker

I have deployed my docker application (to DigitalOcean). Everything work's, but I can't connect mysql with nodejs.
When I run docker-compose up I get error database.connect is not a function.
My server.js file is look like this
const mysql = require("mysql");
const database = mysql.createPool({
host: process.env.MYSQL_HOST_IP,
user: "db_user",
password: "db_user_pass",
database: "guess-game",
port: 3306,
});
database.connect((err) => {
if (err) {
console.error("error connecting: " + err.stack);
return;
}
console.log("connected as id " + db.threadId);
});
module.exports = db;
I don't know what I need to write this line to make it work.
host: process.env.MYSQL_HOST_IP,
I tried to add droplet IP as host, but this is also don't work.
host: "http://46.101.162.111/",
Also, I try this.
host: "46.101.162.111",
My docker-compose.yml file
version: "3"
networks:
dbnet:
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin1
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
restart: always
links:
- db
ports:
- 8899:80
depends_on:
- db
networks:
- dbnet
api:
build: ./api
container_name: api1
command: npm run start
restart: unless-stopped
ports:
- "3005:3005"
environment:
- PORT=3005
- MYSQL_HOST_IP=172.18.0.2
depends_on:
- phpmyadmin
networks:
- dbnet
db:
image: mysql:latest
container_name: db
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_ROOT_PASSWORD=my_secret_password
- MYSQL_DATABASE=guess-game
- MYSQL_USER=db_user
- MYSQL_PASSWORD=db_user_pass
restart: always
ports:
- 6033:3306
networks:
- dbnet
Struggling almost 3 days. 😣
You just need to indicate a DB container name instead of IP like this:
MYSQL_HOST_IP=db

Node.js able to connect to MySQL container when app is ran locally but unable to connect when app is ran in a container

Docker-Compose file:
version: '3.8'
networks:
app-tier:
driver: bridge
services:
mysql_node:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'sample_db'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 'password'
MYSQL_ROOT_PASSWORD: 'password'
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- mysql_db:/var/lib/mysql
app:
depends_on:
- mysql_node
build: .
ports:
- 3000:3000
environment:
- MYSQL_HOST=mysql_node
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_NAME=sample_db
- MYSQL_PORT=3306
- MYSQL_HOST_IP=mysql_node
networks:
- app-tier
volumes:
- .:/app
volumes:
mysql_db:
docker file:
FROM node:latest
RUN mkdir app
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "app.js"]
Sourcecode:
const http = require('http')
var mysql = require('mysql');
const hostname = '0.0.0.0'
const port = 3000
console.log(process.env.MYSQL_HOST_IP)
console.log(process.env.MYSQL_PORT)
var con = mysql.createConnection({
host: "process.env.MYSQL_HOST_IP",
user: "user",
password: "password",
port: 3306
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
When I run docker-compose up the MySQL container successfully launches. But the app exits, with error code Error: connect ETIMEDOUT.
When I run the app locally via node app.js I end up getting a successful "Connected!" message output to my console.
I'm able to connect to the database via MySQLWorkbench as well. It's just the app is unable to connect to the db when the app is ran as a container.
You've specified that the app should be on a named network and the database shouldn't. Then the database service goes on the default network and the two containers can't talk to each other.
I'd remove the named network from the app, since it's probably not needed.
app:
depends_on:
- mysql_node
build: .
ports:
- 3000:3000
environment:
- MYSQL_HOST=mysql_node
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_NAME=sample_db
- MYSQL_PORT=3306
- MYSQL_HOST_IP=mysql_node
volumes:
- .:/app

Error while connecting to MySQL on local docker container: ERROR 2002 (HY000): Can't connect to MySQL server on '127.0.0.1' (115)

I try to connect to MySQL database which is run as a docker service (created from mysql:5.7 image) on my local docker. When I try:
mysql -u myuser -p mydb -h 127.0.0.1
I get the following error: ERROR 2002 (HY000): Can't connect to MySQL server on '127.0.0.1' (115)
My docker settings for MySQL service is as the following:
networks:
front-tier:
name: front-tier
attachable: true
ipam:
config:
- subnet: 70.28.0.0/16
back-tier:
name: back-tier
attachable: true
services:
mysql:
image: mysql
hostname: mysql
deploy:
restart_policy:
condition: on-failure
placement:
replicas: 1
labels:
com.dgyar.description: "Data node"
com.dgyar.department: "IT"
command: --sql_mode=""
environment:
MYSQL_ROOT_PASSWORD: ******
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: ******
MYSQL_ROOT_HOST: '%'
networks:
- back-tier
volumes:
- "/mnt/mysql:/var/lib/mysql"
You need to map a port from your MySQL container onto your host in order to access it from your command.
For example
networks:
front-tier:
name: front-tier
attachable: true
ipam:
config:
- subnet: 70.28.0.0/16
back-tier:
name: back-tier
attachable: true
services:
mysql:
image: mysql
hostname: mysql
deploy:
restart_policy:
condition: on-failure
placement:
replicas: 1
labels:
com.dgyar.description: "Data node"
com.dgyar.department: "IT"
command: --sql_mode=""
environment:
MYSQL_ROOT_PASSWORD: ******
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: ******
MYSQL_ROOT_HOST: '%'
networks:
- back-tier
volumes:
- "/mnt/mysql:/var/lib/mysql"
ports:
- "5000:3306"
mysql -u myuser -p mydb -h 127.0.0.1 -P 5000

ER_NOT_SUPPORTED_AUTH_MODE: while dockerize sails.js app with mysql

I am trying to dockerize a sails.js app which is using mysql image, but I am getting an error. I tried many solutions from stackoverflow and github but non have worked. And I dont have any experience with docker. Its my client requirement to work with it. Here is the code of my docker-compose.yml
version: '3'
services:
sailsjs:
build:
context: .
dockerfile: Dockerfile
ports:
- 80:1337
volumes:
- .:/usr/src/app
mysqlsails:
image: mysql
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE: pricing_engine
MYSQL_USER: root
MYSQL_PASSWORD:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
And datastores.js
module.exports.datastores = {
default: {
adapter: require('sails-mysql'),
host: 'mysqlsails',
user: 'root',
password: '',
database: 'pricing_engine',
insecureAuth : true
},
};