获取镜像
可以通过运行以下命令实现:
# 查看镜像的版本
$ 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容器通信,可以看下面这张图:
# 挂在数据卷到容器
mysql官方给出的挂载点主要包括:
Docker | Description |
---|---|
/var/lib/mysql | MySQL data dir |
/var/log/mysql | MySQL log dir |
/var/sock/mysqld | MySQL socket dir |
/etc/mysql/conf.d | MySQL configuration directory (used to overwrite MySQL config) |
/etc/mysql/docker-default.d | MySQL 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 4月 5 18:29 .
drwxr-xr-x 35 kangbb kangbb 4096 4月 5 23:16 ..
-rw-r----- 1 999 999 56 4月 4 23:37 auto.cnf
-rw------- 1 999 999 1675 4月 4 23:37 ca-key.pem
-rw-r--r-- 1 999 999 1107 4月 4 23:37 ca.pem
-rw-r--r-- 1 999 999 1107 4月 4 23:37 client-cert.pem
-rw------- 1 999 999 1679 4月 4 23:37 client-key.pem
-rw-r----- 1 999 999 398 4月 5 18:29 ib_buffer_pool
-rw-r----- 1 999 999 79691776 4月 5 18:29 ibdata1
-rw-r----- 1 999 999 50331648 4月 5 18:29 ib_logfile0
-rw-r----- 1 999 999 50331648 4月 4 23:37 ib_logfile1
drwxr-x--- 2 999 999 4096 4月 4 23:37 mysql
drwxr-x--- 2 999 999 4096 4月 4 23:37 performance_schema
-rw------- 1 999 999 1675 4月 4 23:37 private_key.pem
-rw-r--r-- 1 999 999 451 4月 4 23:37 public_key.pem
-rw-r--r-- 1 999 999 1107 4月 4 23:37 server-cert.pem
-rw------- 1 999 999 1675 4月 4 23:37 server-key.pem
drwxr-x--- 2 999 999 12288 4月 4 23:37 sys
drwxr-x--- 2 999 999 4096 4月 5 04:47 test
drwxr-x--- 2 999 999 4096 4月 5 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