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