用docker提供mysql数据库服务
最近我的ubuntu一关机,重启后mysqld就无法启动了,现在决定使用docker来管理mysql服务。希望可以稳定下来。
安装docker及mysql
sudo apt-get install docker.io
service docker start
sudo docker pull mysql/mysql-server
运行mysql
docker run --expose 3306 --name my-container-name -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql/mysql-server:tag
my-container-name 是怎么随便取的名字
my-secret-pw 是自已设置mysql的root密码
tag是要运行的mysql版本号,可以用latest,也可以用一个真正的版本号,支持的版本列表在
https://hub.docker.com/r/mysql/mysql-server/tags/
我的命令是:
sudo docker run --name mysql_docker -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:latest
创建数据库:
sudo docker exec -it mysql_docker bash
mysql -uroot -p
create table zhangfuwen;
exit
exit
把docker的3306端口与主机的3306端口绑定
By default Docker containers can make connections to the outside world, but the outside world cannot connect to containers. Each outgoing connection will appear to originate from one of the host machine’s own IP addresses thanks to an iptables masquerading rule on the host machine that the Docker server creates when it starts:
$ sudo iptables -t nat -L -n
... Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 ... The Docker server creates a masquerade rule that let containers connect to IP addresses in the outside world.
If you want containers to accept incoming connections, you will need to provide special options when invoking docker run. There are two approaches.
First, you can supply -P or --publish-all=true|false to docker run which is a blanket operation that identifies every port with an EXPOSE line in the image’s Dockerfile or --expose
Mapping can be specified explicitly using -p SPEC or --publish=SPEC option. It allows you to particularize which port on docker server - which can be any port at all, not just one within the ephemeral port range – you want mapped to which port in the container.
Either way, you should be able to peek at what Docker has accomplished in your network stack by examining your NAT tables.
What your NAT rules might look like when Docker is finished setting up a -P forward:
$ iptables -t nat -L -n
... Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80
What your NAT rules might look like when Docker
is finished setting up a -p 80:80 forward:
Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80 You can see that Docker has exposed these container ports on 0.0.0.0, the wildcard IP address that will match any possible incoming port on the host machine. If you want to be more restrictive and only allow container services to be contacted through a specific external interface on the host machine, you have two choices. When you invoke docker run you can use either -p IP:host_port:container_port or -p IP::port to specify the external interface for one particular binding.
Or if you always want Docker port forwards to bind to one specific IP address, you can edit your system-wide Docker server settings and add the option --ip=IP_ADDRESS. Remember to restart your Docker server after editing this setting.
保存状态
dean@dean-Aspire-4740:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
406dfe63d729 mysql/mysql-server:latest "/entrypoint.sh mysql" 11 minutes ago Up 11 minutes 3306/tcp, 33060/tcp mysql_docker
dean@dean-Aspire-4740:~$ sudo docker commit 406dfe63d729 mysql/mysql-server
sha256:89860fe30160148d5305a529996fd8bda1d57c20325b0129fb0f9e5b60e0f4a8
dean@dean-Aspire-4740:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
406dfe63d729 65f6760a2eef "/entrypoint.sh mysql" 13 minutes ago Up 13 minutes 3306/tcp, 33060/tcp mysql_docker
commit并加tag
dean@dean-Aspire-4740:~$ sudo docker commit 406dfe63d729 mysql/mysql-server:version1
sha256:0ca5485937accdc4a90037427ea2ab7feb38f22d3898e6a2b823c0b1e6536cc2
关闭docker
dean@dean-Aspire-4740:~$ sudo docker stop mysql_docker
运行修改后的docker
dean@dean-Aspire-4740:~$ sudo docker run -p 3306:3306 --name mysql_docker1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:version1
dean@dean-Aspire-4740:~$ sudo docker stop mysql_docker1
mysql_docker1
dean@dean-Aspire-4740:~$ sudo docker start mysql_docker1
mysql_docker1
查看是否已有暴出这个端口:
sudo docker port mysql_docker1 3306
或
sudo docker inspect mysql_docker1
grant access:
sudo docker exec -it mysql_docker1 bash
mysql -uroot -p
GRANT ALL PRIVILEGES
ON *.*
TO 'root'@'%'
IDENTIFIED BY '123456';
登入:
mysql -uroot -p -h127.0.0.1 -P 3306