Docker使用小结
Docker 挂载本地目录
Docker可以把一个宿主机上的目录挂载到镜像里。
docker run -it -v /localpath:/images/path images /bin/bash
通过 -v 参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。
目录挂载最主要的使用场景就是通过docker镜像使用mysql数据库。
Docker 镜像方式使用mysql,当mysql容器重启后,操作的镜像mysql数据库的数据就会丢失,所以此时需要通过挂载Volume的方式来避免这种情况
1、下载mysql镜像
[root@localhost /]# docker pull mysql
拉去完成之后如下所示:
2、通过docker volume create创建一个本地数据卷
[root@localhost semon]# docker volume create --name mysql_data
创建完成后,通过以下命令查询卷是否创建成功
通过find命令找到创建的mysql_data文件的位置
通过docker inspect 命令查看mysql镜像的工作卷路径
确定了以上条件之后,启动mysql镜像
通过docker ps 查询到MySQL容器,那么久启动成功,每次操作数据库之后,数据都会保存到宿主机,重启MySQL数据镜像,数据不丢失—MySQL数据持久化
3、docker link
通过docker run命令的–link参数可以让容器之间通过连接系统进行交互。
参数格式:–link name:alias ,name是要链接的容器名称, alias是此连接的别名。
3.1、docker的link机制
同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信,前者会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip,后者的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信。通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。其使用方式如下:
- 我们使用上面启动了的MySQL容器作为source container
- 再启动一个Nginx容器作为接收容器(received container):
上面通过–link连接名为learn_mysql的容器,并为其设置了别名为db,完成了上面的两个步骤后,在nginx的容器中就可以使用learn_mysql或者db作为连接地址来连接mysql服务,即使容器重启了,地址发生了变化,不会影响两个容器之间的连接。
3.2、link机制的连接信息传递
虽然通过使用link机制nginx可以和mysql进行通信了,但是如何知道mysql的端口是多少呢,虽然说是固定的是 3306,但是也不排除更改端口号的问题,并且对应一些非固定端口的应用来说,只要要连接的容器的端口信息也是尤为重要的,link机制通过环境变量的方式提供了这些信息,除此之外像db的密码这些信息也会通过环境变量提供,docker将source container中定义的环境变量全部导入到received container中,在received container中可以通过环境变量来获取连接信息。
3.2.1、下面是db中提供的环境变量:
通过"docker exec learn_mysql env" 命令查看received container 的环境变量信息
[root@localhost xxxx]# docker exec learn_mysql env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=57b677aa6ad5
MYSQL_ROOT_PASSWORD=123456
GOSU_VERSION=1.12
MYSQL_MAJOR=8.0
MYSQL_VERSION=8.0.20-1debian10
HOME=/root
[root@localhost xxxx]#
3.2.2、下面我们来看看在web这个容器中,这些变量是如何被导入的
[root@localhost xxxx]# docker exec web env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=96a44898bb48
DB_PORT=tcp://172.17.0.4:3306
DB_PORT_3306_TCP=tcp://172.17.0.4:3306
DB_PORT_3306_TCP_ADDR=172.17.0.4
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
DB_PORT_33060_TCP=tcp://172.17.0.4:33060
DB_PORT_33060_TCP_ADDR=172.17.0.4
DB_PORT_33060_TCP_PORT=33060
DB_PORT_33060_TCP_PROTO=tcp
DB_NAME=/web/db
DB_ENV_MYSQL_ROOT_PASSWORD=123456
DB_ENV_GOSU_VERSION=1.12
DB_ENV_MYSQL_MAJOR=8.0
DB_ENV_MYSQL_VERSION=8.0.20-1debian10
NGINX_VERSION=1.19.0
NJS_VERSION=0.4.1
PKG_RELEASE=1~buster
HOME=/root
上面的变量被分成了五个部分:
- 第一个部分是web容器自身提供的一些环境变量,如NGINX_VERSION,HOSTNAME,HOME,PATH等.
- 第二个部分则是ALIASDB_ENV开头的变量,这些都是从source container中导入的,变量来源于Dockerfile中使用ENV命令定义的变量,或者是docker run的时候通过-e 添加的环境变量。
- 第三个部分是ALIASDB_NAME 这个变量,这变量记录了link的两个容器的组合,这里就是/web/db
- 第四个部分就是ALIASDB_PORT开头的一系列变量,这些变量会有很多组,每组变量的命名格式如下:
<alias>_PORT_<port>_<protocol>
<alias>_PORT_<port>_<protocol>_PORT
<alias>_PORT_<port>_<protocol>_PROTO
<alias>_PORT_<port>_<protocol>_ADDR
其中是在Dockerfile中使用EXPOSE导出的端口,还有docker run 的时候使用-p导出的端口。则是这些端口对应的协议。
- 第五个部分就是ALIASDB_PORT这个变量,这个变量是EXPOSE导出端口中的第一个端口对应的连接url, 如果有EXPOSE导出的端口,还有docker run -p指定导出的端口,那么通过-p指定的端口是第一个被导出的端口