以後想借助 docker 快速部署項目環境依賴,就整體瞭解並試用了 MySQL、Redis、MongoDB
整篇博客主要是爲了方便自己以後快速強化或恢復記憶,若能同時幫助到他人,那自然是再好不過了
爲什麼把它們三個放在一起,是因爲它們都是我要用的且均屬於 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