- COPY 和 ADD 命令具有相同的特點(diǎn):只復(fù)制目錄中的內(nèi)容而不包含目錄自身麻蹋。
比如 backend 目錄的結(jié)構(gòu)如下:
--- backend
-- model
-- controller
如果執(zhí)行
WORKDIR /app
COPY backend .
容器內(nèi)app底下會是model和controller目錄,并不是backend目錄忙芒。
如果要拷貝整個目錄铅搓,應(yīng)該:
COPY backend ./backend
- 如果修改了 Dockerfile计福,記得要重新執(zhí)行build概作,即生成新的鏡像沪袭。這樣啟動后才能看到效果田度。
- 打包node項(xiàng)目中的node_modules問題妒御。
某node項(xiàng)目結(jié)構(gòu):
src
node_modules
package.json
package-lock.json
dockerfile部分代碼
FROM node:8.12-alpine
RUN mkdir -p /app
WORKDIR /app
COPY package.json .
COPY package-lock.json .
RUN npm install
...
我們在容器內(nèi)生成了項(xiàng)目所依賴的node_modules文件。這是docker的build階段镇饺。
之后在run啟動階段時乎莉,在mouted共享目錄時要特別小心,如果掛載整個項(xiàng)目奸笤,容器內(nèi)的node_modules會被項(xiàng)目中的覆蓋惋啃。
最好把需要掛載的文件單獨(dú)放到一個目錄中。
- 關(guān)于項(xiàng)目目錄是掛載好监右,還是COPY ADD好边灭,stackoverflow上有人也問過
- COPY/ADD 文件是鏡像的一部分,在docker構(gòu)建階段執(zhí)行健盒。比較適合項(xiàng)目的生產(chǎn)環(huán)境绒瘦,比如自動化。對于成熟穩(wěn)定的項(xiàng)目扣癣,把編譯后的可以直接運(yùn)行的代碼打包進(jìn)鏡像內(nèi)也利于分發(fā)惰帽。
- volumn 是在docker運(yùn)行階段,本地文件變化能方便的反應(yīng)到容器中父虑,比較適合項(xiàng)目的開發(fā)階段该酗。
要根據(jù)實(shí)際情況,掛載可以節(jié)省空間频轿,便于修改垂涯。如果是想文件COPY到容器,每次修改文件都需要重新制作鏡像航邢。
- 關(guān)于 docker-compose,對于鏡像的版本骄蝇,數(shù)據(jù)庫密碼等不建議直接寫死到 docker-compose.yml 中膳殷,可以新建.env文件。
docker-compose部分
mysql:
build: ./docker-build/mysql
ports:
- "33060:3306"
volumes:
- ./docker-build/mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${DOCKER_MYSQL_PASSPORD-123456}
.env文件
DOCKER_MYSQL_PASSPORD=mypassord
比如下面的${DOCKER_MYSQL_PASSPORD-123456}
表示優(yōu)先去.env
文件找定義的key值,如果沒有則使用默認(rèn)值赚窃,即123456册招。
docker-compose.yml 受版本控制,.env不受勒极。更多細(xì)節(jié)參考
- 在 Laravel 項(xiàng)目中是掰,如果數(shù)據(jù)庫跑在容器里,在宿主機(jī)直接執(zhí)行
php aritsan
是不行的辱匿,
需要進(jìn)到容器里執(zhí)行键痛,或者在宿主機(jī)執(zhí)行docker-compose exec <mycontainer> php artisan
或者是docker exec -it <mycontainer> php artisan
- 如果php項(xiàng)目用的nginx的php-fpm容器,想重啟php-fpm匾七,容器內(nèi)使用
kill -USR2 1
絮短,容器外執(zhí)行docker exec -it <mycontainer> kill -USR2 1
\ - docker-compose down要慎用,他會銷毀所有容器和網(wǎng)絡(luò)等昨忆。如果你之前在容器里修改過文件丁频,都會沒有。當(dāng)然docker也不推薦直接在容器動手腳邑贴,建議寫個shell腳本席里,啟動之后在容器內(nèi)執(zhí)行。
- 還是 mysql 數(shù)據(jù)庫問題拢驾,如果容器啟動了 mysql胁勺,之后通過配置修改了密碼,可能會造成重新連接后死活顯示"Access denied"独旷。
這是因?yàn)槿绻⒘斯蚕砭韛olume署穗,里面存的還是老的user信息,需要docker-compose rm -v
清除卷然后重連嵌洼。 - 刪除日志
find /var/lib/docker/containers/ -type f -name "*.log" -delete
- 刪除所有停止的容器
docker rm $(docker ps -a -q)
- Docker 提供了方便的
docker system prune
命令來刪除那些已停止的容器案疲、dangling 鏡像、未被容器引用的 network 和構(gòu)建過程中的 cache.
安全起見麻养,這個命令默認(rèn)不會刪除那些未被任何容器引用的數(shù)據(jù)卷褐啡,如果需要同時刪除這些數(shù)據(jù)卷,你需要顯式的指定 --volumns 參數(shù)鳖昌。比如你可能想要執(zhí)行下面的命令:
docker system prune --all --force --volumns
注意备畦,使用 --all 參數(shù)后會刪除所有未被引用的鏡像而不僅僅是 dangling 鏡像。
何為 dangling images许昨,其實(shí)可以簡單的理解為未被任何鏡像引用的鏡像懂盐。比如在你重新構(gòu)建了鏡像后,那些之前構(gòu)建的且不再被引用的鏡像層就變成了 dangling images
我們還可在不同在子命令下執(zhí)行 prune糕档,這樣刪除的就是某類資源:
docker container prune # 刪除所有退出狀態(tài)的容器
docker volume prune # 刪除未被使用的數(shù)據(jù)卷
docker image prune # 刪除 dangling 或所有未被使用的鏡像
- docker diff 容器名或ID莉恼,可以查看容器發(fā)生的文件系統(tǒng)的變化信息
如下圖,我在容器里新建了個demo.txt文件,在docker diff中可以查看出來
A 添加俐银, C 修改刃榨, D 刪除
image.png