HOWTO Percona Server with Docker for DBAs

Starting Percona 5.7 docker container and other tricks.

- 3 mins read

Series: Docker

docker

Before starting the container

This article is not an introductory explanation of docker,however it’s scope if for docker’s beginners. You can consider it as an extension of the well documented Percona docker hub doc. For the source code of the image, the repository is at github.

Here is the all what you need to do for start:

docker run --name percona57 -e MYSQL_ROOT_PASSWORD=<a_password>  -d percona:5.7

For checking the container status log, you can execute docker logs percona57.

Additional MySQL logs

To start the container is pretty easy, but if you are not very used to Docker, you will find a bit lost if you want to enable logging or other features.

For example, a full logging container will be started with this:

docker run --name percona57  -v /var/log/mysql:/var/log/mysql  -e MYSQL_ROOT_PASSWORD=mysql  -d percona:5.7 --general-log=1 --slow-query-log=1 --long-query-time=0  --log_slow_verbosity='full, profiling, profiling_use_getrusage'

Note that the log_slow_verbosity is only applicable for the Percona release, and adds extra output that turns very useful when doing complex query reviews. As you can appreciate, all the options are passed after the image name (percona:5.7).

Now, the question is: where are the logs? Generally, you can access the container using docker exec -it percona57 bash and view the logs inside it, although this is not the most comfortable way to do this.

In the example bellow, we’ll use jq (a very handy json parser).

3laptop ~ # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cb740be0743c        percona:5.7         "docker-entrypoint.sh"   35 minutes ago      Up 35 minutes       3306/tcp            percona57

3laptop ~ # docker inspect percona57 | jq .[].Mounts
[
  {
    "Propagation": "rprivate",
    "RW": true,
    "Mode": "",
    "Destination": "/var/log/mysql",
    "Source": "/var/log/mysql"
  },
  {
    "Propagation": "",
    "RW": true,
    "Mode": "",
    "Driver": "local",
    "Destination": "/var/lib/mysql",
    "Source": "/var/lib/docker/volumes/ceda51de62dac317fcafe9dd9e8f9b6f1dc5d70874466b3faf7cdfbcbbc91154/_data",
    "Name": "ceda51de62dac317fcafe9dd9e8f9b6f1dc5d70874466b3faf7cdfbcbbc91154"
  }
]

3laptop ~ # ls -l /var/lib/docker/volumes/ceda51de62dac317fcafe9dd9e8f9b6f1dc5d70874466b3faf7cdfbcbbc91154/_data
...
-rw-r----- 1 maxscale docker  26886023 Jul  2 19:10 cb740be0743c.log
-rw-r----- 1 maxscale docker 268834670 Jul  2 19:10 cb740be0743c-slow.log
...

The logs (general and slow) are using the container id in the file name, which can be appreciated when executing docker ps.

Access through network

Obviously, when using docker in production, you don’t want to access it locally. For getting the host of our container (and all the running containers), we can do the following commands:

3laptop ~ # docker network ls
NETWORK ID          NAME                DRIVER
5fddd2e1a80a        bridge              bridge              
e4e0c655e1aa        host                host                
565f4a23d95a        none                null  

3laptop ~ # docker network inspect 5fddd2e1a80a | jq .[].Containers
{
  "cb740be0743cd662c700f73586fe481dc25e4eb27ef94e075c4668a5421eca13": {
    "IPv6Address": "",
    "IPv4Address": "172.17.0.2/16",
    "MacAddress": "02:42:ac:11:00:02",
    "EndpointID": "6dbd28900efe2c6f6edffcbbec0ac7d6446b4336e6e31f018f18d00f1005a812",
    "Name": "percona57"
  }
}

We can see that our container percona57 is running over 172.17.0.2 IP address. To access it, you only need to do as usual:

3laptop ~ # mysql -h 172.17.0.2 -p
....
mysql>

comments powered by Disqus