Using Docker for development is a great way of ensuring that what you develop will be the same that you deploy in production. This is true for almost everything. If you develop on Linux, the above statement holds. If you develop on a different operating system (OSX or Windows) there are several restrictions.
I showed one of those issues in a recent article (MySQL and Docker on a Mac: networking oddity.) When you want to export a port from a service running in the container, the exported port is not available in your mac, but in the virtual machine that runs Docker services. This happens with any application that listens to a port.
The second limitation I found affects only MySQL, and it is related to using volumes. The proper way of achieving data persistence with containers is through volumes, i.e. telling the container to run the data directory in a virtual path that refers to some safe place in the host computer. That can't be done on a Mac, because the host computer is a virtual machine, and even though Docker can access a folder in your Mac, the server installation fails for lack of permissions.
Both the above restrictions are lifted if you use the beta release of Docker for Mac and Windows. It's a private beta: you need to apply and wait to be given an operational token, but once you are in, you notice the differences between the beta and the "old" Docker-Toolbox:
- The Docker app is a native app, which you install by copying its icon to the /Application folder;
- You don't need Virtualbox or VMware Fusion. It comes with its own lightweight VM based on xhyve.
- There is no need to run
docker-machine start xxxand
eval $(docker-machine env xxx). The new app is fully integrated with the OS.
- Ports exported from a container are available in your Mac.
- You can keep both the Docker Toolbox and the new Docker app in the same host, provided that you don't run them both in the same terminal session.
Back to our claim of lifted limitations: let's try a full installation on a Mac as we would do it on Linux.
$ docker run --name mybox -e MYSQL_ROOT_PASSWORD=secret -d \ -v ~/docker/mysql/single:/var/lib/mysql \ -p 5000:3306 mysql/mysql-server 72ca99918076ff0e5702514311cc706ffcc27f98917f211e98ed187dfda3b47b $ ls ~/docker/mysql/single/ auto.cnf client-key.pem ibdata1 mysql.sock.lock server-cert.pem ca-key.pem ib_buffer_pool ibtmp1 performance_schema server-key.pem ca.pem ib_logfile0 mysql private_key.pem sys client-cert.pem ib_logfile1 mysql.sock public_key.pem
We create a MySQL server container with the internal port 3306 exposed to the external port 5000, and the data directory running in the host directory $HOME/docker/mysql/single. It seems that the data directory was created correctly. Now we use a MySQL client on the Mac to connect to the container, using port 5000 on the local network address (Note: there is NO database server running on my mac. Only in the container).
$ sudo netstat -atn |grep LISTEN | grep 5000 tcp4 0 0 *.5000 *.* LISTEN $ ~/opt/mysql/5.7.12/bin/mysql -h 127.0.0.1 -u root -psecret -P 5000 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> create schema hello_docker; Query OK, 1 row affected (0.01 sec) mysql> use hello_docker Database changed mysql> create table i_am_here(id int); Query OK, 0 rows affected (0.03 sec) mysql> exit Bye $ ls ~/docker/mysql/single/hello_docker/ db.opt i_am_here.frm i_am_here.ibd
This is full integration! Using a Mac client we connected to the container, where we created a table, which then appeared inside the data directory in the Mac host!
It's still early to say if this beta is ready for more serious work, but the first impressions are really good!