1.获取mysql镜像
从docker hub的仓库中拉取mysql镜像
sudo docker pull mysql
查看镜像
sudo docker images
mysql latest 18f13d72f7f0 2 weeks ago 383.4 MB
2.挂载volume资料卷
在docker所在主机上创建mysql的俩个文件夹:config
和db
,在config
下创建my.cnf
cd /
mkdir docker/mysql
cd docker/mysql
mkdir config
mkdir db
my.cnf内容:
[mysqld]
user=mysql
3.运行一个mysql容器
若执行第2步,则执行第一条指令:
sudo docker run --name first-mysql -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -v=/docker/mysql/config/my.cnf:/etc/my.cnf -v=/docker/mysql/data:/var/lib/mysql -d mysql
若没做第2步,则可以直接执行下面指令:
sudo docker run --name first-mysql -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql
上述命令各个参数含义:
run 运行一个容器
--name 后面是这个镜像的名称
-p 3306:3306 表示在这个容器中使用3306端口(第二个)映射到本机的端口号也为3306(第一个)
-d 表示使用守护进程运行,即服务挂在后台
查看当前运行的容器状态:
[root@localhost yum.repos.d]# sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f49bc29733f mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp first-mysql
[root@localhost yum.repos.d]#
4.进入容器 :
sudo docker exec -it first-mysql bash
# sudo docker exec -it [service name] bash
使用root登录mysql :
mysql -u root -p
访问结果如下:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
5.运行第二个mysql实例
使用docker相对于虚拟机而言的原因是耗费很少的资源,可以"开辟"非常多的隔离的环境,所以我们继续运行第二个mysql实例,还用之前的镜像,名字为second-mysql。
sudo docker run --name second-mysql -p 3306:3307 -e MYSQL\_ROOT\_PASSWORD=123456 -d
mysql2de4ddb5bfb9b9434af8e72368631e7f4c3f83ee354157328049d7d0
f5523661docker: Error response from daemon: driver failed programming external connectivity on endpoint second-mysql (33aa29d891a1cb540de250bcbbbe9a0a41cd98f61a4e9f129a2ad5db69da4984): Bind for 0.0.0.0:3306 failed: port is already allocated.
为了验证第一个是本机的端口号,就仍然使用了3306这个端口,那么创建如上所示,发生了错误,但是产生了一个容器id,当我们修改端口后还会报错,因为名字冲突了,也即这次失败的创建会占用这个名字:
sudo docker run --name second-mysql -p 3307:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d
mysqldocker: Error response from daemon: Conflict. The name "/second-mysql" is already in use by container 2de4ddb5bfb9b9434af8e72368631e7f4c3f83ee354157328049d7d0f5523661.
You have to remove (or rename) that container to be able to reuse that name..
为了验证second-mysql这个容器还在docker的进程中,我们使用ps -a这个命令,我们可以观察到first-mysql的状态为Up 34 minutes,说明已经工作了34分钟,而second-mysql只是刚刚创建的。
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2de4ddb5bfb9 mysql "docker-entrypoint.sh" About a minute ago Created second-mysql
5b6bf6f629bf mysql "docker-entrypoint.sh" 34 minutes ago Up 34 minutes 0.0.0.0:3306->3306/tcp first-mysql
我们用rm命令删除这个容器,如下面命令所示:
maintain@maintain-dev1:~$ sudo docker rm second-mysql
maintain@maintain-dev1:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b6bf6f629bf mysql "docker-entrypoint.sh" 42 minutes ago Up 42 minutes 0.0.0.0:3306->3306/tcp first-mysql
重新建立second-mysql这个容器,占用物理机的3307端口:
sudo docker run --name second-mysql -p 3307:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql
5404fb11f29cba07b991f34056d6b40ed0888aa905a45e637e396d071bd7f331
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5404fb11f29c mysql "docker-entrypoint.sh" 12 seconds ago Up 11 seconds 0.0.0.0:3307->3306/tcp second-mysql
5b6bf6f629bf mysql "docker-entrypoint.sh" 43 minutes ago Up 43 minutes 0.0.0.0:3306->3306/tcp first-mysql
参考:https://www.jianshu.com/p/c24e3e5f5b58