Docker Official Images 部署 MySQL、Redis、MongoDB

以后想借助 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章