環境
Ubuntu 20.04
安裝 docker
$ sudo apt-get install docker.io
檢查 docker 服務有無正常啟動
$ service docker status
如果沒意外的話會在前面幾行看到:Active:active(running)
將自己使用者帳號加入 docker 群組
$ sudo usermod -aG docker <username>
這個動作主要是因為權限的關係,如果沒有加這個,會導致普通使用者沒權限使用 Docker。
登出後再重新登入
$ docker version
會出現 Client、Server 的訊息,但如果最下面出現了:
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
這就是可能因為沒做第三個步驟,通常是權限的問題。
Docker,抓下資源:
- 查看有什麼資源:
$ docker search continuumio
(continuumio是我要找的資源名稱) - 抓下指令的資源:
$ docker pull continuumio/miniconda3
- 指定一個名字,下次下指令才不會打太長。有兩個版本,其中一個掛載實體機上的資料夾
普通容器掛載:$ docker run -it --name="miniconda" -p 8888:8888 continuumio/miniconda3 /bin/bash
與實體機共用資料夾的容器掛載:$ docker run -it -v /home/projects:/home/projects --name="miniconda" --restart=unless-stopped -p 8888:8888 5c3c689cd8aa jupyter lab --ip='*' --port=8888 --no-browser --allow-root
–name:指定一個名字
-p:指定port
-v:表示需要將本機上哪個資料夾掛載到容器中(:左邊是本地資歷夾,:右邊是 docker機)
-i:互動模式
-t:終端機
5c3c689cd8aa:容器名
最後 jupyter lab….:隨著docker自動啟動jupyterlab
Docker,啟動容器:
$ docker start miniconda
萬一剛剛沒有啟動,就手動啟動容器。
$ docker stop miniconda #停止容器
$ docker restart miniconda #重啟容器
Docker,進去容器裡面設定環境:
開始設定環境(假如是linux的話,可以輸入以下指令即可:) $ conda info #檢查一下環境狀態 $ conda install -c conda-forge jupyterlab $ conda create -n 999 python=3.7 --yes #待會要下指令與jupyterlab互動 $ conda activate 999 #進入999這個環境 $ conda install -c conda-forge implicit $ conda install bottleneck $ conda install pandas requests tqdm seaborn ipykernel $ pip install tensorflow keras xgboost lightgbm pyfolio $ conda install -c conda-forge eli5 Skater shap $ pip install mlxtend ipywidgets $ pip install talib-binary $ conda deactivate $ python -m pip install jupyterlab==3.0.0 $ python -m pip install widgetsnbextension==3.5.1 $ python -m pip install jupyterlab-widgets==1.0.0 $ jupyter kernelspec uninstall 999 $ conda activate 999 $ python -m ipykernel install --user --name 999 # 需要上面這一行,才能讓 env:999和jupyterlab 產生互動 $ conda deactivate
Docker,重開機後,當下次想使用時:
$ sudo -i #切換到root狀態
$ docker start miniconda
$ docker exec -it miniconda /bin/bash
可以開第二個終端機,進去進行pip安裝套件等工作 -i:互動模式 -t:終端機 -d:在背景執行
$ cd /home/999
# jupyter lab --ip='*' --port=8888 --no-browser --allow-root
--port:指定port去對應容器內的8888port 這個方式是暫時,但適合我,避免長久開著被區域網路其他人探測到。如果要永久開著,網路上有教學設定密碼..等等。 然後雖然這個模式是暫時的,但只要不重開機,就算終端機已經關掉,它依舊會在背景繼續運作。 但如果是遇到重開機,就得ssh進去docker容器裡面,將jupyterlab啟動起來!
補充 env 環境:如果要安裝軟體,要先進去環境
conda env list #檢查目前有多少環境
conda activate 999 #進入999這個環境
conda deactivate #退出剛剛的999環境
conda create --name myenv python=3.8 #建立指定python版本的環境
# get the notebook token from the logs
docker logs --tail 3 notebook
如果要Crontab 每天自動排程工作
30 17 * * 1-6 docker exec miniconda python ./home/xxx/day_updata.py
#日更新(每日更新)
Docker製作commit
不要試圖修改docker controller,因為它的設計本來就偏向資料或是設定不該放在 container 中,或者修改後本來就該 commit 避免資料遺失。
如果對於之前設定的controller不滿意,直接commit成新images,然後再利用新的images創新的controoler
利用commit重新製作新的images
docker commit -m "xxx" 容器id miniconda:jupyter_v3
xxx = commit的目的 / 要拷貝哪一個容器id / images:TAG名字
然後再run新的容器
docker run -it -v /home/projects:/home/projects --name="miniconda" --restart=unless-stopped -p 8888:8888 5c3c689cd8aa jupyter lab --ip='*' --port=8888 --no-browser --allow-root
Docker,其他補充:
查看正在執行的容器:$ docker ps
查看所有的容器,不管有沒有運作都顯示:$ docker ps -a
刪除容器:$ docker rm ccdf3f2ff5g1 cd20b3fewa
$ docker rm miniconda
移除所有未使用的Docker項目:$ docker system prune
如果要不出現提示可以使用 -f 或是 –force 如果要移除未使用的Volumes可以加入 –volumes 顯示images清單:$ docker images
刪除images:$ docker rmi b8ea69dr61c
重開機後,自動啟動Docker容器$ docker update --restart {no,on-failure,unless-stopped,always} container_name
範例:$ docker update --restart=unless-stopped miniconda
unless-stopped: 如果手動停止容器,就不會自動重啟。如果未來有升級容器需求,這個也方便,先停止原先容器升級後再手動打開。重開機後也會自動重啟。
Docker,複製本機檔案進容器:
從本機複製到容器: docker cp /home/999/test.txt miniconda:/home/test/ 從容器複製到主機: docker cp miniconda:/home/test/test.txt /home/999/
Docker與排程:
Docker內部容器為了精簡化所以是不會有Crontab
在主機端就有Crontab囉~用那個去呼叫如:$ crontab -e
30 17 * * 1-6 docker exec miniconda python ./home/999/999_stock_coolsea/auto_update.py
w1-w6更新docker裡面財經資料庫
Docker 與 Unifi
以下都是使用一般user權限,不用root。畢竟一開始也有將某個user開通docker使用權限了。 $ cd /home $ mkdir -p unifi/data $ mkdir -p unifi/log # 測試指令: $ docker run --rm --init -p 8080:8080 -p 8443:8443 -p 3478:3478/udp -e TZ='Asia/Taipei' -v /home/unifi:/unifi --name unifi jacobalberty/unifi:latest --rm:其用途就是在我們執行完指令後,可以不用再下 docker rm 的指令去刪除容器,直接在執行完指令後, Docker可以自動幫我們刪除容器。 # 實際上線指令: $ docker run -d \ --restart=unless-stopped \ --net=host \ --name=unifi \ -e TZ='Asia/Taipei' \ -e RUNAS_UID0=false \ -v /home/unifi:/unifi \ jacobalberty/unifi:latest --net=host:是為了允許L2發現。如果不需要L2發現,只需映射Port即可。 -e RUNAS_UID0 改成 false,讓 Controller 不要用 root 身份運作。 # 未來我該如何升級呢? $ docker pull jacobalberty/unifi:latest $ docker stop unifi $ docker rename unifi unifi.save 然後再做一次run指令,跟上面相同 $ docker run -d \ --restart=unless-stopped \ --net=host \ --name=unifi \ -e TZ='Asia/Taipei' \ -e RUNAS_UID0=false \ -v /home/unifi:/unifi \ jacobalberty/unifi:latest