Docker关于mysql镜像的使用

获取镜像

可以通过运行以下命令实现:

# 查看镜像的版本
$ sudo docker search mysql
# 获取最新版本的mysql镜像
$ sudo docker pull mysql:latest

了解镜像mysql镜像

# docker history [OPTIONS] IMAGE查看镜像分层
$ sudo docker history mysql
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5195076672a7        3 weeks ago         /bin/sh -c #(nop)  CMD ["mysqld"]               0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  EXPOSE 3306/tcp              0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-ent...   0 B                 
<missing>           3 weeks ago         /bin/sh -c ln -s usr/local/bin/docker-entr...   34 B                
<missing>           3 weeks ago         /bin/sh -c #(nop) COPY file:05922d368ede30...   5.92 kB             
<missing>           3 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0 B                 
<missing>           3 weeks ago         /bin/sh -c {   echo mysql-community-server...   256 MB              
<missing>           3 weeks ago         /bin/sh -c echo "deb http://repo.mysql.com...   56 B                
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_VERSION=5.7.2...   0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_MAJOR=5.7          0 B                 
<missing>           3 weeks ago         /bin/sh -c set -ex;  key='A4A9406876FCBD3C...   23 kB               
<missing>           3 weeks ago         /bin/sh -c apt-get update && apt-get insta...   44.7 MB             
<missing>           3 weeks ago         /bin/sh -c mkdir /docker-entrypoint-initdb.d    0 B                 
<missing>           3 weeks ago         /bin/sh -c set -x  && apt-get update && ap...   4.44 MB             
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV GOSU_VERSION=1.7         0 B                 
<missing>           3 weeks ago         /bin/sh -c apt-get update && apt-get insta...   10.2 MB             
<missing>           3 weeks ago         /bin/sh -c groupadd -r mysql && useradd -r...   329 kB              
<missing>           3 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0 B                 
<missing>           3 weeks ago         /bin/sh -c #(nop) ADD file:e3250bb9848f956...   55.3 MB
# 进入docker镜像
% mysql自带"sh"可以直接使用
$ docker run -it --rm mysql "sh"
# ls
bin   dev             entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint-initdb.d  etc        lib   media  opt  root  sbin  sys  usr

% 或者使用bash
$ docker run -it --rm mysql /bin/bash
root@f01cadf4887c:/# ls
bin   dev             entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint-initdb.d  etc        lib   media  opt  root  sbin  sys  usr
# 进入运行的镜像(容器)

对于已经运行的镜像(应该称为容器),可以通过docker attach命令进入它。不过,当你退出时,这个容器也就退出了。例如:

$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                  NAMES
845e18ddfe3d        golang:latest                      "bash"                   3 seconds ago       Up 2 seconds                               mygo
$ docker attach 845e18ddfe3d
root@845e18ddfe3d:/go# 
# 和运行的镜像(容器)交互

当然也可以通过docker exec命令和容器交互。它后面常用参数有两个:-i-t。只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。当 -i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。例如:

$ docker run -p 3308:3306 --rm --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
$ docker exec -i -t mysql mysql -h127.0.0.1 -P3306 -uroot -proot
# 释放/导出容器
$ docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                    NAMES
818545fe0eae        mysql:latest                       "docker-entrypoint..."   35 minutes ago      Up 35 minutes       0.0.0.0:3308->3306/tcp   mysql
$ docker export 818545fe0eae > mysql.tar

上面这条命令最终会和mysql这个容器建立连接。

mysql镜像的使用

#启动一个mysql镜像的容器
$ docker run -p 3308:3306 --rm --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

-p:设置宿主和和容器的端口映射,格式宿主机port:容器port。设置后,在宿主机的对应端口,可以直接访问容器。
--rm:容器停止后,自动删除一切容器运行的配置文件及产生的数据。。
--name:指定容器的明名称。
-e:设置环境变量。这里指定mysql的登录密码为root,用户名默认为root。登录密码也可以设置为其他。
-d:后台运行容器,也称为守护态运行。

#让容器支持中文输入
$ docker run -p 3308:3306 --rm --name mysql -e MYSQL_ROOT_PASSWORD=root -e LANG=C.UTF-8 -d mysql:latest

-e:设置环境变量。这里指另外设置了LANG=C.UTF-8,即设置容器语言为C.UTF-8

# 连接mysql容器

启动一个新的mysql容器,进入容器后,利用这个容器连接前面运行起来的容器。mysql连接的命令和正常的一样,由于docker都和宿主机桥连,所以需要通过宿主机的ip和端口与另一个容器相连接。

$ sudo docker run -it --rm --net host mysql:5.7 "sh"
# mysql -h127.0.0.1 -P3308 -uroot -proot
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 7
Server version: 5.7.20 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, 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> 

-------------------------------使用下面的命令同样可以----------------------------
$ sudo docker run -it --rm --net host mysql:5.7 /bin/bash

关于docker容器通信,可以看下面这张图:
docker容器通信

# 挂在数据卷到容器

mysql官方给出的挂载点主要包括:

DockerDescription
/var/lib/mysqlMySQL data dir
/var/log/mysqlMySQL log dir
/var/sock/mysqldMySQL socket dir
/etc/mysql/conf.dMySQL configuration directory (used to overwrite MySQL config)
/etc/mysql/docker-default.dMySQL configuration directory (used to overwrite MySQL config)

官方的镜像说明文档:cytopia/mysql-5.7
来自github的说明文档:https://github.com/docker-library/docs
挂载入的命令为:

$ docker run -p 3308:3306 --rm --name mysql -v $HOME/mysql/data:/var/lib/mysql -v $HOME/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

上面的命令将本地$HOME/mysql/data$HOME/mysql/log分别挂载到了容器的/var/lib/mysql/var/log/mysql位置。
通过挂载的方式,可以将容器的数据同步到本地,防止容器因为被清理而丢失所有数据;同样,也可以通过挂载,将本地的一些数据加载到容器。总之,它实现了宿主机和容器之间的数据共享。

# 定制mysql镜像

在使用了挂载之后,你会发现和容器共享的空间是没有编辑权限的,在unbantu上目录和文件的权限为999

kangbb@udo:~/mysql$ ls -al
total 176204
drwxrwxr-x  7    999    999     4096 45 18:29 .
drwxr-xr-x 35 kangbb kangbb     4096 45 23:16 ..
-rw-r-----  1    999    999       56 44 23:37 auto.cnf
-rw-------  1    999    999     1675 44 23:37 ca-key.pem
-rw-r--r--  1    999    999     1107 44 23:37 ca.pem
-rw-r--r--  1    999    999     1107 44 23:37 client-cert.pem
-rw-------  1    999    999     1679 44 23:37 client-key.pem
-rw-r-----  1    999    999      398 45 18:29 ib_buffer_pool
-rw-r-----  1    999    999 79691776 45 18:29 ibdata1
-rw-r-----  1    999    999 50331648 45 18:29 ib_logfile0
-rw-r-----  1    999    999 50331648 44 23:37 ib_logfile1
drwxr-x---  2    999    999     4096 44 23:37 mysql
drwxr-x---  2    999    999     4096 44 23:37 performance_schema
-rw-------  1    999    999     1675 44 23:37 private_key.pem
-rw-r--r--  1    999    999      451 44 23:37 public_key.pem
-rw-r--r--  1    999    999     1107 44 23:37 server-cert.pem
-rw-------  1    999    999     1675 44 23:37 server-key.pem
drwxr-x---  2    999    999    12288 44 23:37 sys
drwxr-x---  2    999    999     4096 45 04:47 test
drwxr-x---  2    999    999     4096 45 05:26 item

所以,可以通过重新构建mysql镜像,完成自己的一些配置。例如,我想要本地的mysql可以被远程访问,例如我需要开启mysql的log-bin日志功能,那么可以通过修改my.cnf文件实现。
my.cnf文件一般位于/etc/mysql/目录下。官方给出的文档显示在/etc/目录下面,所以可能会有些出入。通过进入容器,获得文件内容,进行修改。修改完成后如下:

!includedir /etc/mysql/conf.d/
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
#log-error=/var/log/mysql/error.log
# By default we only accept connections from localhost
# 可注释,这样远程机可以访问
#bind-address    = 127.0.0.1
#开启log-bin日志
log-bin=/var/log/mysql/mysql-bin.index
# 服务器唯一id,默认为1,一般取IP最后一段
server-id=1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

完成后,构建如下目录结构:

mysql
|_____my.cnf
|_____Dockerfile

其中,Dockerfile文件如下:

FROM mysql:latest
EXPOSE 3306
ADD my.cnf /etc/mysql/
CMD ["mysqld"]

最后,执行命令:

$ docker build -t my_mysql:latest .

完成了mysql镜像的定制。

更多关于docker的官方文档请参考:Docker Documentation|Docker Documentation
一本参考书:

$ docker pull dockerpracticecn/docker_practice:latest
$ docker run -it -p 8080:80 dockerpracticecn/docker_practice
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kiloveyousmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值