[root@localhost ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io /centos latest 67591570dd29 3 months ago 191.8 MB 启动容器,进入容器内编译安装mysql [root@localhost ~] # docker run -t -i docker.io/centos /bin/bash [root@2ccd29e52286 /] # rpm -qa | grep mysql //确保没有自带安装mysql,有的话就卸载 [root@2ccd29e52286 /] # yum -y install make gcc-c++ cmake bison-devel ncurses-devel [root@2ccd29e52286 /] # groupadd mysql [root@2ccd29e52286 /] # useradd -g mysql mysql -M -s /sbin/nologin [root@2ccd29e52286 /] # cd /usr/local/src [root@2ccd29e52286 src] # wget -c http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-5.6/mysql-5.6.34.tar.gz [root@2ccd29e52286 src] # tar -zxvf mysql-5.6.34.tar.gz [root@2ccd29e52286 src] # cd mysql-5.6.34/ [root@2ccd29e52286 mysql-5.6.34] # cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci [root@2ccd29e52286 mysql-5.6.34] # make && make install [root@2ccd29e52286 mysql-5.6.34] # mkdir -p /data/mysql/data [root@2ccd29e52286 mysql-5.6.34] # chown -R mysql:mysql /usr/local/mysql [root@2ccd29e52286 mysql-5.6.34] # chown -R mysql:mysql /data/mysql/data 初始化mysql [root@2ccd29e52286 mysql-5.6.34] # cd /usr/local/mysql [root@2ccd29e52286 mysql] # ./scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql ------------------------------------------------------------------------------------------- 如果报错:FATAL ERROR: please install the following Perl modules before executing . /scripts/mysql_install_db : Data::Dumper 解决办法: [root@2ccd29e52286 mysql] # yum install -y perl-Module-Install.noarch ------------------------------------------------------------------------------------------ 启动mysql,并设置密码 [root@2ccd29e52286 mysql] # cp support-files/mysql.server /etc/init.d/mysql [root@2ccd29e52286 mysql] # /etc/init.d/mysql start [root@2ccd29e52286 mysql] # mysql -uroot ..... 修改root密码,执行命令如下 mysql> SET PASSWORD = PASSWORD( '123456' ); 若要设置root用户可以远程访问,执行 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root' @ '%' IDENTIFIED BY 'password' WITH GRANT OPTION; 使授权立即生效 mysql> FLUSH PRIVILEGES; 提交为新镜像 [root@localhost ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2ccd29e52286 docker.io /centos "/bin/bash" 3 hours ago Up 3 hours modest_bose [root@localhost ~] # docker commit 2ccd29e52286 mysql sha256:3b965b11e7a01b9422c8d82a8352c60c83545698309d9511b4df6371bcfcd6a1 [root@localhost ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 3b965b11e7a0 6 minutes ago 4.511 GB docker.io /centos latest 67591570dd29 3 months ago 191.8 MB 根据新提交的镜像,启动mysql容器 [root@localhost ~] # docker stop 2ccd29e52286 2ccd29e52286 [root@localhost ~] # docker rm 2ccd29e52286 //当然这个之前启动的容器也可以不删除,忽略就行。 2ccd29e52286 [root@localhost ~] # docker run -t -i -d --name=my_mysql -p 33061:3306 mysql /bin/bash a02f56c3e7313733bcd58414d5dcd5501f8504352206ee321e9e2aeab15d6269 [root@localhost ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a02f56c3e731 mysql "/bin/bash" 7 seconds ago Up 6 seconds 0.0.0.0:33061->3306 /tcp my_mysql 启动容器的mysql服务方法(也可以在上面创建容器的时候直接启动,即将 /bin/bash 命令换成mysql启动命令): 1)直接在宿主机上通过docker exec 命令启动 [root@localhost ~] # docker exec my_mysql /etc/init.d/mysql start //如果启动后出现卡的情况,就ctrl+c,不影响启动结果 Starting MySQL SUCCESS! 2)登陆容器内启动 [root@localhost ~] # docker attach my_mysql [root@a02f56c3e731 /] # /etc/init.d/mysql start Starting MySQL SUCCESS! 查看容器启动的进程 [root@localhost ~] # docker top my_mysql UID PID PPID C STIME TTY TIME CMD root 7340 28948 0 14:21 pts /1 00:00:00 /bin/bash root 8595 7340 0 14:28 pts /1 00:00:00 /bin/sh /usr/local/mysql//bin/mysqld_safe --datadir= /data/mysql/data --pid- file = /data/mysql/data/mysql .pid mysql 9376 8595 0 14:28 pts /1 00:00:00 /usr/local/mysql/bin/mysqld --basedir= /usr/local/mysql/ --datadir= /data/mysql/data --plugin- dir = /usr/local/mysql//lib/plugin --user=mysql --log-error= /data/mysql/data/mysql-error .log --pid- file = /data/mysql/data/mysql .pid --socket= /usr/local/mysql/var/mysql .sock --port=3306 登陆容器查看 [root@a02f56c3e731 /] # netstat -tunlp //首先yum安装net-tools Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID /Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN - 在容器内的mysql里写入一些数据 [root@a02f56c3e731 /] # /usr/local/mysql/bin/mysql -p123456 Warning: Using a password on the command line interface can be insecure. ERROR 2002 (HY000): Can 't connect to local MySQL server through socket ' /var/lib/mysql/mysql .sock' (111) [root@a02f56c3e731 /] # ln -s /usr/local/mysql/var/mysql.sock /var/lib/mysql/mysql.sock ln : failed to create symbolic link '/var/lib/mysql/mysql.sock' : File exists [root@a02f56c3e731 /] # rm -f /var/lib/mysql/mysql.sock [root@a02f56c3e731 /] # ln -s /usr/local/mysql/var/mysql.sock /var/lib/mysql/mysql.sock [root@a02f56c3e731 /] # /usr/local/mysql/bin/mysql -p123456 ....... mysql> create database wangshibo; Query OK, 1 row affected (0.00 sec) mysql> use wangshibo; Database changed mysql> create table hehe( -> id int(3), -> name varchar(10) -> ); Query OK, 0 rows affected (0.03 sec) mysql> insert into hehe values(1, "wanglei" ); Query OK, 1 row affected (0.01 sec) mysql> insert into hehe values(2, "zhaomin" ); Query OK, 1 row affected (0.01 sec) 查看容器ip,可以登陆容器内 ifconfig 查看(首先要yum安装net-tools) [root@a02f56c3e731 /] # ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link> ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 117 bytes 319373 (311.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 102 bytes 7042 (6.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 或者在宿主机使用docker inspect命令查看容器ip [root@localhost ~] # docker inspect my_mysql|grep IPAddress "SecondaryIPAddresses" : null, "IPAddress" : "172.17.0.2" , "IPAddress" : "172.17.0.2" , 在宿主机本地连接容器的mysql [root@localhost ~] # mysql -u root -h 172.17.0.2 -p123456 ERROR 1130 (HY000): Host '172.17.0.1' is not allowed to connect to this MySQL server 出现错误的原因: 容器的网络ip是根据宿主机的虚拟桥接网卡docker0自动分配的,而docker0的ip默认是172.17.0.1. 容器的mysql内需要给这个ip授权。 [root@localhost ~] # ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 .......... 登陆容器内的mysql,进行授权 [root@a02f56c3e731 /] # /usr/local/mysql/bin/mysql -p123456 ....... mysql> select host,user,password from mysql.user; +--------------+------+-------------------------------------------+ | host | user | password | +--------------+------+-------------------------------------------+ | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | 2ccd29e52286 | root | | | 127.0.0.1 | root | | | ::1 | root | | | localhost | | | | 2ccd29e52286 | | | +--------------+------+-------------------------------------------+ 6 rows in set (0.00 sec) mysql> grant all privileges on *.* to root@ '%' identified by "123456" ; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> select host,user,password from mysql.user; +--------------+------+-------------------------------------------+ | host | user | password | +--------------+------+-------------------------------------------+ | localhost | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | | 2ccd29e52286 | root | | | 127.0.0.1 | root | | | ::1 | root | | | localhost | | | | 2ccd29e52286 | | | | % | root | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +--------------+------+-------------------------------------------+ 8 rows in set (0.00 sec) 再次在宿主机本机尝试连接容器的mysql,发现可以正常连接! [root@localhost ~] # mysql -u root -h 172.17.0.2 -p123456 ....... MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | wangshibo | +--------------------+ 5 rows in set (0.01 sec) MySQL [(none)]> select * from wangshibo.hehe; +------+---------+ | id | name | +------+---------+ | 1 | wanglei | | 2 | zhaomin | +------+---------+ 2 rows in set (0.00 sec) --------------------------------------------------------------------------------------------------- 也可以再创建一个容器,使用--link进行容器链接。 这里需要特别注意一下 "--link=my_mysql:mydb" (中间可以使用=,也可以空格隔开),这个参数是告诉容器需要使用my_mysql容器,并将其别名命名为mydb,这样在这两个容器里就可以使用mydb来作为提供mysql数据库服务的机器名。 [root@localhost ~] # docker run --rm -it --name mymysql2 --link my_mysql:mydb docker.io/centos /bin/bash [root@f1534ad473f4 /] # cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 mydb 33d784ee3121 my_mysql 172.17.0.4 f1534ad473f4 [root@f1534ad473f4 /] # mysql -u root -h mydb -p123456 ...... MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | wangshibo | +--------------------+ 5 rows in set (0.00 sec) MySQL [(none)]> select * from wangshibo.hehe; +------+---------+ | id | name | +------+---------+ | 1 | wanglei | | 2 | zhaomin | +------+---------+ 2 rows in set (0.00 sec) ------------------------------------------------------------------------------------------------ 在外部连接my_mysql容器内的mysql,就需要通过映射到宿主机的33061端口了(首先在宿主机的iptables里开放33061端口的访问) [root@localhost ~] # vim /etc/sysconfig/iptables ...... -A INPUT -p tcp -m state --state NEW -m tcp --dport 33061 -j ACCEPT [root@localhost ~] # systemctl restart iptables.service 这样在远程,就可以使用宿主机的映射端口33061访问容器mysql (使用-P指定端口进行mysql的连接) [root@huanqiu_web1 ~] # mysql -uroot -h103.10.86.23 -P33061 -p123456 ....... mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | wangshibo | +--------------------+ 5 rows in set (0.00 sec) mysql> select * from wangshibo.hehe; +------+---------+ | id | name | +------+---------+ | 1 | wanglei | | 2 | zhaomin | +------+---------+ 2 rows in set (0.00 sec) mysql> |