[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./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>