2020-04-23

docker 的基礎指令說明[也許會陸續更新][2020-05-07 updated]

最近初自學,先以自己思維下寫說明,可能有一些不太對,再請大家指教…
不過主要的還是可以去看 docker commandline reference
----
pull - 由 docker hub 拉下 images 儲存
command: docker pull [appname]:[version]
appname - 如 nginx, httpd, mysql 等,有一些 app 的名字是慣用,但詳細可以上 docker hub 查
version - 指定 app 的版本,一般是看自己習慣,如果不特別指定,預設就是最新[latest]
push - 由本地的 images 推上 docker hub 發布(需有 docker hub account)
build - 以指定的 Dockerfile 重製為 image
command: docker build [OPTIONS] [New image name] [path | url]
[OPTIONS] - 很多,可參考 docker CLI reference,比較常用的如以下
--tag, -t : image tag name
--no-cache : 建置image時不使用快取
--file, -f : 指定以特定路徑下的 Dockerfile 來建置
[New image name] - 不一定要有,就是把新的 image 另名一個 REPO name
[path | url] - Dockerfile 的位置
load - 將 save 過後的 tar 重新載入為 images
command1: docker load < [package file name]
command2: docker load --input [package file name]
[OPTIONS]
--input, -i : 指定檔案,就不用 STDIN 方式("<")
--quiet, -q : 輸出較精簡的訊息,但不是寧靜模式
[package file name] : save 後的打包檔案,通常會是 tar 或 tar.gz
save - 打包 tar, 方便私下交流 images 或備份, 不用特意傳上 docker hub
command: docker save [OPTIONS] [image repo name] > [package file name]
[OPTIONS] - 基本上不用寫,因為目前只有一個 output,所以不寫的話預設就是 --output
[image repo name] - 指定 image REPOSITORY name
[package file name] - 打包後的檔名,通常會用 tar 或 tar.gz
commit - 把指定的 container 存成新的 image,簡單說是客製化,可以上 docker hub pull 別人做好的 image 下來當初始器,然後將初始器運行後,再進入內部微調成自己想要的環境,之後就可以利用 commit 將修改好的容器存成自己的 image,不過建議是使用 Dockerfile 來進行重製,commit 的方式要小心使用(可參閱 https://yeasy.gitbooks.io/docker_practice/image/commit.html )
command: docker commit [OPTIONS] [container-id] [REPOSITORY[:TAG]]
[OPTIONS] - 不一定要寫,主要看有沒有想修改原 image 的以下的東西
--author, -a : 作者資料
--change, -c : 使用 Dockerfile 中的指令來建構,有 CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | ONBUILD | USER | VOLUME | WORKDIR
--message, -m : 跟 git commit -m 'message' 的作用差不多,就是說明
--pause, -p : 暫停 container 的運作
[container-id] - 指定 container id 或者 container NAMES
run - 將指定的 images 以容器(container)方式運行起來,此容器是獨立的環境,運行的地方可以是本地的真實主機或遠端的,此容器運行時有獨立且屬於自己的作業系統、網路和處理程序
command: docker run [OPTIONS] [image[:tag]] [command] [ARGS]
[OPTIONS] - 有以下比較常用的
--detach, -d - 背景運行
--publish, -p [external-port-number[/tcp|upd]]:[internal-port-number[/tcp|udp]] - 設定容器的埠號與上層(母機?)的埠號發佈,可以特別指定對應的協定
--volumn, -v - 指定上層(母機?)的一個路徑映射並掛載於指定容器內的路徑
[image repo-name|id] - 指定要運行的鏡像名或id,這個可以在 docker pull 後使用 docker images 查詢,REPOSITORY是鏡像名,IMAGE ID 就是 id
exec - 在指定的運行中的容器內執行命令,比較常用的是開啟 terminal
command: docker exec [OPTIONS] [container id|names] [command] [ARGS]
-------
Dockerfile 一些基礎的寫法
FROM [image repo name] - 跟 docker pull 後面接的一樣
COPY [source path] [image destination path] - 把上層(或母機?)指定的檔案或路徑資料複製到新建立的image中
RUN <os shell command> - 在image建立前,運行指定的指令,在image是linux環境時,此執行環境預設是 /bin/sh,如果要使用不一樣的 shell,可使用另一種表達方式
["os shell command", "參數1", "參數2] - RUN 的另一種執行指令的模式,此模式使用 JSON 格式,[]內只能用雙引號來包住各欄位,不得使用單引號,另外要注意 “\“ 會有影響,可以改成 “\\“ 來用
ADD [外部的資料位置] [內部指令對應的資料位置] - 指定上層(母機?)的資料放入內部指定路徑中,若要放入後修改檔案擁有者屬性的話可以用另一種方式
--chown=[user|uid]:[group|gid] [外部的資料位置] [內部指令對應的資料位置] - 此方式會修改資料使用者屬性資料
ENTRYPOINT ["執行檔", "參數1", "參數2"] - json array 表達方式,在image啟動為容器時才有作用,另有 shell type 的表達方式
指令 參數1 參數2 - shell type 表達方式,在image啟動為容器時才有作用,會在 /bin/sh 的環境下執行,另有 json array 的表達方式
ENV [variable_name=path_in_image] - 設定環境變數,若有多個環境變數要設定,可以以空白隔開或用多個 ENV 來表示
[variable_name] [path_in_image] - 另一種設定表達方式,若有多個環境變數要設定,只能以多個 ENV 來表示,或改用上行表達方式
CMD ["執行檔", "參數1", "參數2"] - 啟動指定的程式,另有另一種表達方式
["參數1", "參數2"] - 此方式的參數是提供給有使用 ENTRYPOINT 的執行檔用
執行檔 參數1 參數2 - 是在 /bin/sh -c 的環境下再執行的方式
EXPOSE [port number[/tcp|udp]] - 特別指定運行後發佈的埠號,可特別指定發佈在tcp或udp上,但要記住之後以 docker run 此 image 時,在對應 --publish(-p) 時也要額外再指定協定

*注意:
- Dockerfile 的運行是逐行的,所以要留意執行順序
- ENTRYPOINT 和 CMD 之中是有關聯性的,如果有寫 ENTRYPOINT 的話就要同時寫 CMD ,如果沒有要 CMD 執行的程序,也要寫個 CMD [] 空的
- ENTRYPOINT 是用 json array 寫法還是用 shell 寫法會影響到 CMD 的執行,可以參考 Dockerfile - understand how cmd and entrypoint interact,可以參考 https://blog.tiger-workshop.com/docker-difference-between-entrypoint-and-cmd/
- 如果沒使用 ENTRYPOINT 和 CMD 的話,會繼承原來的 image 的設定
- ENTRYPOINT 和 CMD 的作用是會在啟動為容器時會發生的,只是我目前的理解的狀況,我會把 ENTRYPOINT 當作「容器啟動時會一併啟動的“程序“或“服務“」,有點像 WINDOWS 的 services.msc ,而 CMD 我會當成是「容器啟動完後自動執行的程序」(有點類似windows會放在程式集中的“啟動“)或者是「容器啟動完後受ENTRYPOINT(服務)啟動相依執行的排程」(有點類似windows在寫排程時可以設定使用者登入或網路元件已啟動時才會執行的程式)
-------
docker-compose 用法
up - 新增、重建、建立image並啟動於容器中
command: docker-compose up [OPTIONS] [docker-compose.yml path]
[OPTIONS] - 不一定要有,以下挑幾個可能比較常用的
--detach, -d : 建立好後在背景運行容器
--quiet-pull : 在建立過程時,如果有要 pull image 的訊息不顯示
--force-recreate : 強制重建,不管來源的設定或image有沒有更動過
--always-recreate-deps : 總是重建有相依性的容器,這個指令不能和 --no-recreate 一起用
--no-recreate : 如果相關的容器已存在,就不重建,這個指令不能和 --force-recreate 和 --renew-anon-volumes|-V 一起用
--no-build : 不建立 image ,就算image不存在
--no-start : 最後不啟用於容器
--build : 建立 image 優先於啟動於容器
[docker-compose.yml path] - 就是指定要運行的 docker-compose.yml 的路徑,如果沒有特別寫,會是以指令下達的當前目錄下的 docker-compose.yml
ps - 查看運行中的服務容器,跟 docker ps 類似
command: docker-compose ps

2020-02-14

解決 win10 1909 February 11, 2020 security update 後網路下載變慢的問題

話說在最近微軟的 win10 1909 2020/02/11 的安全性修正修補了近 99 個漏洞的更新,我是興高采烈的快快下載安裝...

我更新的時間點是 2020/02/12 的凌晨,讓電腦安裝更新完後就關機。

然後中午前在使用電腦時是不覺得有什麼異狀,但後來在觀看 youtube 的同時還開了線上漫畫在瀏覽,突然間聽到 youtube 聲音斷斷續續,把注意力轉過去時發現畫面在 loading....

這很奇怪

先說明一下我的環境
系統:win10 1909(由 1903 升級上來的,1903 時是 clean install)
網路:hinet 100Mbps/40Mbps(download/upload)

當下發現 youtube 預載很慢時,我是先以為是我看的線上漫畫網站造成的,我還特別檢查了一下系統是不是有被掛馬或惡意程式,但沒有明顯的發現;於是我就把寬頻斷線後再重連,這時網路就正常了

2020-01-20

CodeIgniter 3 利用 Email Library 透過 gmail smtp over tls 寄信

在寫公司的網站系統時,有個功能是讓瀏覽者看到有興趣的課程時可以留下資料,在留下資料時,若是有填寫 email 資訊的,在確認資訊正確後,會直接由系統將該課程的 dm 資料寄 email 的方式給該瀏覽者。

我是用 CodeIgniter 3 的 php mvc framework 來寫這個網站的,那正好在使用它自己的 email library 時有遇到一些狀況,而在網路上找資料的過程中發現的一些資訊,特此留下一個記錄。

參考資料


Support for SMTP over TLS(STARTTLS): https://forum.codeigniter.com/thread-31578.html

2020-01-04

phpMyAdmin 出現 #2002 問題的解決方式

先說明一下,這篇不一定能解決你在使用 phpMyAdmin 時產生的 #2002 問題,因為你不一定跟我遇到這問題的系統環境及需求是一樣的。

前提說明:
因為我待的公司的負責處理網路和系統設定的單位的主管今年二月份要去渡蜜月,公司的高層因為我有網管和系統管理的經歷,希望我在該主管不在公司的期間暫代他處理公司網路、系統和公司有接的案子相關的系統上的設定操作。

剛好最近有個 case 的系統要在今年農曆過年前從在外面租用的空間移回該案子自己公司內的虛擬系統中,所以我組長和資訊部門主管就讓我進行這個移機的處理,測試看看我這方面的能力,還希望我在設定系統的過程記錄一下我的操作歷程和指令記錄,讓資訊部門主管檢閱。

系統環境:
虛擬機上的系統據我組長說已經先由資訊部門主管建置好了,所以我就負責系統上軟體的設定和防火牆的操作。

  • Ubuntu LTS 18.xx(忘了版號)
  • WEB + DB Server, 是分開的
  • WEB
    • Apache2, PHP, phpMyAdmin, mysql-client
  • DB
    • MariaDB (client, server)
    • 僅允許 WEB 連入 MariaDB Service, root
我其實沒怎麼碰過 Debian 的 Linux 系統,以前都是以 RHEL 的 CentOS, Fedora 為主,所以基礎指令是沒什麼差別,但就在防火牆(ufw-xxxx 的 chain 一大堆, webmin + csf 還是比較好用)和 apt 一開始卡了一下,不過也是還好。

2019-11-29

VisualStudio 2019 community 執行安裝時無畫面

因為公司明年度想接 asp.net mvc 的案子,所以想讓程式組的同仁們去學 asp.net....

本來我是想直接從 dotNet Core 開始,就使用 asp.net core mvc,但其他人好像覺得還是用 asp.net mvc 就好…所以只好在自己的私人電腦先下載 visualStudio express 來用,不過後來才知道免費版已經換成 visualStudio community...

目前最新的版本是 2019,可以在下載前導程式。

直接執行好像是線上安裝(其實也是先下載後直接進安裝程序),但這個前導程式可以加參數變成離線安裝(其實也是指定下載路徑存著)…

不過本篇不是在說上面的東西,主要是要說我無論是直接執行,還是改加參數的方式,vs_community.exe 我都是載入畫面一閃就沒任何反應。

上網找了資料,有人說可以到「C:\PorgramData\Microsoft\VisualStudio\」砍掉裡面的「Packages」資料夾,說這是之前你有安裝過其他版本的 VisualStudio 的關係…但我的電腦之前沒安裝過,所以我刪了也沒用,而且我會有這個資料夾主要還是我正在使用 vs_community.exe 的關係。