docker學習系列16使用過程的一些經驗總結

飛凡的陀螺發表於2018-10-07
  1. COPY 和 ADD 命令具有相同的特點:只複製目錄中的內容而不包含目錄自身。
    比如 backend 目錄的結構如下:
 --- backend
     -- model
     -- controller

如果執行

WORKDIR /app
COPY backend .

容器內app底下會是model和controller目錄,並不是backend目錄。
如果要拷貝整個目錄,應該:
COPY backend ./backend

  1. 如果修改了 Dockerfile,記得要重新執行build,即生成新的映象。這樣啟動後才能看到效果。
  2. 打包node專案中的node_modules問題。
    某node專案結構:
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
...

我們在容器內生成了專案所依賴的node_modules檔案。這是docker的build階段。
之後在run啟動階段時,在mouted共享目錄時要特別小心,如果掛載整個專案,容器內的node_modules會被專案中的覆蓋。
最好把需要掛載的檔案單獨放到一個目錄中。

  1. 關於專案目錄是掛載好,還是COPY ADD好,stackoverflow上有人也問過
  • COPY/ADD 檔案是映象的一部分,在docker構建階段執行。比較適合專案的生產環境,比如自動化。對於成熟穩定的專案,把編譯後的可以直接執行的程式碼打包進映象內也利於分發。
  • volumn 是在docker執行階段,本地檔案變化能方便的反應到容器中,比較適合專案的開發階段。
    要根據實際情況,掛載可以節省空間,便於修改。如果是想檔案COPY到容器,每次修改檔案都需要重新制作映象。
  1. 關於 docker-compose,對於映象的版本,資料庫密碼等不建議直接寫死到 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}表示優先去.env檔案找定義的key值,如果沒有則使用預設值,即123456。
docker-compose.yml 受版本控制,.env不受。更多細節參考

  1. 在 Laravel 專案中,如果資料庫跑在容器裡,在宿主機直接執行 php aritsan是不行的,
    需要進到容器裡執行,或者在宿主機執行docker-compose exec <mycontainer> php artisan或者是docker exec -it <mycontainer> php artisan
  2. 如果php專案用的nginx的php-fpm容器,想重啟php-fpm,容器內使用kill -USR2 1,容器外執行docker exec -it <mycontainer> kill -USR2 1
  3. docker-compose down要慎用,他會銷燬所有容器和網路等。如果你之前在容器裡修改過檔案,都會沒有。當然docker也不推薦直接在容器動手腳,建議寫個shell指令碼,啟動之後在容器內執行。
  4. 還是 mysql 資料庫問題,如果容器啟動了 mysql,之後通過配置修改了密碼,可能會造成重新連線後死活顯示”Access denied”。
    這是因為如果建立了共享卷volume,裡面存的還是老的user資訊,需要docker-compose rm -v 清除卷然後重連。
  5. 刪除日誌 find /var/lib/docker/containers/ -type f -name "*.log" -delete


相關文章