Docker Official Images 部署 MySQL、Redis、MongoDB

本文介绍了如何使用Docker官方镜像快速部署MySQL、Redis和MongoDB,包括常用命令如`docker run`的OPTIONS详解,如-d、-p、-v等,并探讨了数据持久化、端口映射以及目录挂载等问题。同时,文章提到了在挂载目录时遇到的特殊情况,如MySQL的日志文件挂载问题。
摘要由CSDN通过智能技术生成

以后想借助 docker 快速部署项目环境依赖,就整体了解并试用了 MySQLRedisMongoDB

整篇博客主要是为了方便自己以后快速强化或恢复记忆,若能同时帮助到他人,那自然是再好不过了

为什么把它们三个放在一起,是因为它们都是我要用的且均属于 Docker Official Images,都主要由 the Docker Community 维护,因为几乎是由相同技术开发,所以它们每个版本都是由两个文件 Dockerfile、docker-entrypoint.sh 组成,我们甚至都可以下载这两个文件加以修改然后 docker build 出更适合自己使用的 image

这里详细说下 docker run 常用的 OPTIONS

  • -d, --detach
    Run container in background and print container ID

  • -e, --env list
    Set environment variables

-e MYSQL_ROOT_PASSWORD=my-secret-pw
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin
-e MONGO_INITDB_ROOT_PASSWORD=secret
  • -p, --publish list
    Publish a container’s port(s) to the host

主要用来宿主机与容器之间的端口映射

例如 -p 3308:3306

宿主机将监听3308端口作为容器3306端口的代理

与 Dockerfile 中 EXPOSE 有本质区别

EXPOSE 仅是暴露该端口,有点像容器自身的防火墙规则

想更深的了解,找几篇文章看看?

例如 -p 192.168.8.88:6379:6379

宿主机所在的局域网也能访问容器内的服务

  • -v, --volume list
    Bind mount a volume

主要用来宿主机与容器之间的目录(文件)挂载

例如 -v /docker/mysql/data:/var/lib/mysql

宿主机上的 data 目录将挂载到容器内 /var/lib/mysql 用来存放 MySQL 的数据文件

与 Dockerfile 中 VOLUME 有明显区别

VOLUME 指定的目录均会由宿主机上的目录挂载进容器,-v 则是你可以指定宿主机中对应的目录,否则将由 docker 管理(创建 Volume 并挂载进容器)

想更深的了解,找几篇文章看看?

可以通过 docker inspect CONTAINER 中 Mounts 查看挂载详情

一般容器运行时会有大量数据写入的目录会用 VOLUME 声明,譬如数据库的数据文件,这样不占用容器大小,即便容器被释放,数据仍然在

  • --name string
    Assign a name to the container

  • -i, --interactive
    Keep STDIN open even if not attached

  • -t, --tty
    Allocate a pseudo-TTY

  • --rm
    Automatically remove the container when it exits

以上三个经常这样组合使用

docker exec -it redis bash
docker run -it --network container:redis --rm redis redis-cli

三款数据库我是如此 docker run

docker run --name mysql -p 3306:3306 -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/mysqld.cnf:/etc/mysql/conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.30
docker run --name redis -p 6379:6379 -v /docker/redis/data:/data -v /docker/redis/redis.conf:/etc/redis.conf -d redis redis-server /etc/redis.conf
docker run --name mongo -p 27017:27017 -v /docker/mongo/data:/data/db -v /docker/mongo/mongod.conf:/etc/mongod.conf -d mongo --config /etc/mongod.conf

补充以下几点

假如你想在宿主机上看 MySQL 的日志文件,你可能会想到挂载宿主机目录到 /var/log/mysql,令人奇怪的是,这样做之后宿主机目录中并未出现 error.log,容器中 /var/log/mysql 也成了空目录,若按正常不执行挂载则是能在 /var/log/mysql 中看到 error.log,反复试验研究后我是这样理解这个现象的,用到这个目录时它是否已经被挂载

但是你可能会说为啥 /var/lib/mysql 就可以呢?我是有明确看到 Dockerfile 中 MySQL 安装完成后执行了 rm -rf /var/lib/mysql,而在 docker-entrypoint.sh 中又有 docker_init_database_dir 的逻辑,大致就是目录挂载后重新生成数据文件

docker 命令的 COMMAND 大多会有相似,譬如多个命令都会有 prune

docker system prune
docker image prune
docker volume prune
docker container prune
docker network prune
docker builder prune

可通过 docker logs CONTAINER 看日志

可通过 docker cp mongod.conf CONTAINER:/tmp/ 宿主机与容器之间拷贝文件

我还注意到一个小细节

docker run -it --rm mongo --help
docker run -it --rm mysql:5.7.30 --verbose --help

而 Redis 在文档中则是会主动带上 redis-server,然而事实好像不带也是可以的,只需要在你不是要执行默认程序的时候才需要带

docker run -it --rm redis --help
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值