[Linux] 在ubuntu安裝Docker的一些筆記

環境

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

$ conda activate 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
$ 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啟動起來!

# get the notebook token from the logs

docker logs --tail 3 notebook

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:stable
 $ 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