---
# System prepended metadata

title: docker 實作練習
tags: [學習筆記, Docker]

---

# docker 實作練習

## 操作練習心得

> 1. 安裝時docker如果hyper-v被佔用，docker啟動會失敗，例如模擬器佔用了它，那docker就失敗，反之亦然。
> 2. 我是安裝在win10上，帶上--volume參數對應時皆失敗，最後想起是windows目錄與linux目錄名稱的差異，後來將C:/改成//C/之後就解決了。


## 下載image並到本機
> docker pull nginx:latest    (來自hub.docker public repo)

## 查詢help
    docker --help
    docker ps --help
    docker run --help
    docker image --help
    ...
    ...


## 強制移除container by id
    docker rm -f $(docker ps -aq)  
    
## 停止全部container
    docker stop $(docker ps -aq)

## 命名容器 / Mapping port(multiple-port) / 共用目錄 read-only
> docker run --name website -p 8080:80 -p 3000:80 -d -v /D//docker/html:/usr/share/nginx/html:ro nginx:latest


## 查找container狀態並格式化輸出

> Windows:
set FORMAT="ID\t{{.ID}}\nNAME\t{{.Names}}\nImage\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"
>
> docker ps --format=%FORMAT%

> Linux: 
export FORMAT="ID\t{{.ID}}\nNAME\t{{.Names}}\nImage\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"
>
> docker ps --format=$FORMAT


## TAG -- duplicated it with new tag
> docker tag old_name:old_tag new_name:new_tag

## Image 的 Alpine 版本
> 佔用storage較少的版本(linux alpine)，少裝了一些libary，因此較為『輕』量，有可能導致某些功能失效。

## Dockerfile example 
    
    FROM node:10.16.1-latest
    WORKDIR /app
    ADD package*.json ./
    RUN npm install
    ADD . . 
    CMD node index.js

## 由 Dockerfile 建立 image
    docker build -t newName:newTage .

## to Repo -> hub.docker(private/public)
    docker push your_account:image_name:tag

## 容器共用目錄
    docker run --name newName --volume-from Container_name image_name


## 登錄到 linux bash shell

    docker exec -it website bash

 
## Dockerfile:  with caching
> 在Dockerfile當中，每個動作視為1個layer，在執行build指令時會比較layer與caching，當目前build的layer與caching當中的layer不同時，其之後layer動作會全部重做一遍，換句話說，把沒變的layer往前移，有變的往後移，這樣可以大幅加快建image的速度。

參考資料：
https://www.youtube.com/watch?v=p28piYY_wv8&list=WL&index=10

###### tags: `Docker` `學習筆記`