- Remark
- Installation
- Quick Start
- Command-line arguments
- Setting a specific password for the admin account
- Creating Database at Launch
- Persistence
- Backuping
- Checking backup
- Restore from backup
- Replication - Master/Slave
- Environment variables
- Logging
- Out of the box
Based on https://github.com/romeOz/docker-mysql
Difference:
Adapted for using with docker-compose:
- MYSQL_USER and MYSQL_RESTORE take effect only on database creation. So you can safely set these variables in
docker-compose.ymland safely re-create container with persistent data.
- Install Docker or askubuntu
- Pull the latest version of the image.
docker pull ruslangetmansky/docker-mysqlAlternately you can build the image yourself.
git clone https://github.com/ruslangetmansky/docker-mysql.git
cd docker-mysql
docker build -t="$USER/mysql" .Run the mysql image:
docker run --name mysql -d ruslangetmansky/docker-mysqlThe simplest way to login to the mysql container is to use the docker exec command to attach a new process to the running container and connect to the MySQL Server over the unix socket.
docker exec -it mysql mysql -urootYou can customize the launch command of mysql by specifying arguments to mysqld on the docker run command. For example, to run mysql using lower case table name, you can do:
docker run --name db -d \
ruslangetmansky/docker-mysql \
--lower_case_table_names=1If you want to use a preset password instead of a random generated one, you can
set the environment variable MYSQL_PASS to your specific password when running the container:
docker run --name db -d -e 'MYSQL_PASS=mypass' ruslangetmansky/docker-mysqlYou can now test your deployment:
docker exec -it db mysql -uadmin -pmypassThe admin username can also be set via the MYSQL_USER environment variable.
Remember that the
rootuser has no password, but it's only accessible from within the container.
If you want a database to be created inside the container when you start it up
for the first time you can set the environment variable DB_NAME to a string
that names the database.
docker run --name mysql -d -e 'DB_NAME=dbname' ruslangetmansky/docker-mysqlYou may also specify a comma separated list of database names in the DB_NAME variable. The following command creates two new databases named dbname1 and dbname2 (p.s. this feature is only available in releases greater than 9.1-1).
docker run --name mysql -d \
-e 'DB_NAME=dbname1,dbname2' \
ruslangetmansky/docker-mysqlIf this is combined with importing SQL files, those files will be imported into the created database.
For data persistence a volume should be mounted at /var/lib/mysql.
SELinux users are also required to change the security context of the mount point so that it plays nicely with selinux.
mkdir -p /to/path/data
sudo chcon -Rt svirt_sandbox_file_t /to/path/dataThe updated run command looks like this.
docker run --name mysql -d \
-v /host/to/path/data:/var/lib/mysql \
ruslangetmansky/docker-mysqlThis will make sure that the data stored in the database is not lost when the image is stopped and started again.
The backup all databases is made over a regular MySQL connection (used mysqldump).
Create a temporary container for backup:
docker run -it --rm \
--link mysql:mysql \
-e 'MYSQL_MODE=backup' \
-e 'DB_REMOTE_HOST=mysql' -e 'DB_REMOTE_USER=admin' -e 'DB_REMOTE_PASS=pass' \
-v /host/to/path/backup:/tmp/backup \
ruslangetmansky/docker-mysqlArchive will be available in the /host/to/path/backup.
Algorithm: one backup per week (total 4), one backup per month (total 12) and the last backup. Example:
backup.last.tar.bz2,backup.1.tar.bz2and/backup.dec.tar.bz2.
To pass additional settings to mysqldump, you can use command-line arguments:
docker run -it --rm \
--link mysql-master:mysql-master \
-e 'MYSQL_MODE=backup' \
-e 'DB_REMOTE_HOST=mysql' -e 'DB_REMOTE_USER=admin' -e 'DB_REMOTE_PASS=pass' \
-v /host/to/path/backup:/tmp/backup \
ruslangetmansky/docker-mysql \
--master-data --single-transactionCheck-data is the name of database DB_NAME.
docker run -it --rm \
-e 'MYSQL_CHECK=default' \
-e 'DB_NAME=foo' \
-v /host/to/path/backup:/tmp/backup \
ruslangetmansky/docker-mysqlDefault used the /tmp/backup/backup.last.bz2.
docker run --name='db_restore' -d \
-e 'MYSQL_RESTORE=default' \
-v /host/to/path/backup:/tmp/backup \
ruslangetmansky/docker-mysqlAlso see "Replication".
You may use the MYSQL_MODE variable along with REPLICATION_HOST, REPLICATION_PORT, REPLICATION_USER and REPLICATION_PASS to enable replication.
Your master database must support replication or super-user access for the credentials you specify. The MYSQL_MODE variable should be set to master, for replication on your master node and slave for replication or a point-in-time snapshot of a running instance.
Create a master instance with database dbname
docker run --name='mysql-master' -d \
-e 'MYSQL_MODE=master' \
-e 'DB_NAME=dbname' \
-e 'MYSQL_USER=dbuser' -e 'MYSQL_PASS=dbpass' \
ruslangetmansky/docker-mysqlor import backup
docker run --name='mysql-master' -d \
-e 'MYSQL_MODE=master' \
-e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' \
-e 'MYSQL_USER=dbuser' -e 'MYSQL_PASS=dbpass' \
-v /host/to/path/backup:/tmp/backup \
ruslangetmansky/docker-mysqlCreate a slave instance + fast import backup from master
docker run --name='mysql-slave' -d \
--link mysql-master:mysql-master \
-e 'MYSQL_MODE=slave' -e 'MYSQL_PASS=pass' \
-e 'REPLICATION_HOST=mysql-master' \
-e 'DB_REMOTE_USER=dbuser' -e 'DB_REMOTE_PASS=dbpass' \
ruslangetmansky/docker-mysqlVariables DB_REMOTE_USER and DB_REMOTE_PASS is master settings.
or import as backup file
docker run --name='mysql-slave' -d \
--link mysql-master:mysql-master \
-e 'MYSQL_MODE=slave' -e 'MYSQL_PASS=pass' \
-e 'REPLICATION_HOST=mysql-master' \
-e 'MYSQL_RESTORE=/tmp/backup/backup.last.bz2' \
-v /host/to/path/backup:/tmp/backup \
ruslangetmansky/docker-mysqlProtection against unauthorized inserting records
docker exec -it mysql-slave mysql -uroot -e 'GRANT SELECT ON *.* TO "web"@"%" WITH GRANT OPTION;'
MYSQL_USER: Set a specific username for the admin account (default 'admin').
MYSQL_PASS: Set a specific password for the admin account.
MYSQL_MODE: Set a specific mode. Takes on the values master, slave or backup.
MYSQL_BACKUP_DIR: Set a specific backup directory (default '/tmp/backup').
MYSQL_BACKUP_FILENAME: Set a specific filename backup (default 'backup.last.bz2').
MYSQL_CHECK: Defines one SQL script/dump to initialize the database. Note that the dump must be inside the container, so you may need to mount them. You can specify as default that is equivalent to the /tmp/backup/backup.last.bz2
MYSQL_RESTORE: Defines one or more SQL scripts/dumps separated by spaces to initialize the database. Note that the scripts must be inside the container, so you may need to mount them. You can specify as default that is equivalent to the /tmp/backup/backup.last.bz2
MYSQL_ROTATE_BACKUP: Determines whether to use the rotation of backups (default "true").
REPLICATION_PORT: Set a specific replication port for the master instance (default '3306').
REPLICATION_USER: Set a specific replication username for the master instance (default 'replica').
REPLICATION_PASS: Set a specific replication password for the master instance (default 'replica').
All the logs are forwarded to stdout and sterr. You have use the command docker logs.
docker logs mysql####Split the logs
You can then simply split the stdout & stderr of the container by piping the separate streams and send them to files:
docker logs mysql > stdout.log 2>stderr.log
cat stdout.log
cat stderr.logor split stdout and error to host stdout:
docker logs mysql > -
docker logs mysql 2> -####Rotate logs
Create the file /etc/logrotate.d/docker-containers with the following text inside:
/var/lib/docker/containers/*/*.log {
rotate 31
daily
nocompress
missingok
notifempty
copytruncate
}
Optionally, you can replace
nocompresstocompressand change the number of days.
- Ubuntu 14.04.3 (LTS)
- MySQL 5.5/5.6
MySQL container image is open-sourced software licensed under the MIT license