docker︱docker run的解讀與一鍵部署

這是之前的文章:
docker︱在nvidia-docker中使用tensorflow-gpu/jupyter



1 docker run的解讀

1.1 docker run

docker run有非常多的啓動參數,可參考:Docker run 命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS說明:

  • -a stdin: 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項;
  • -d: 後臺運行容器,並返回容器ID;
  • –rm=false, 指定容器停止後自動刪除容器(不支持以docker run -d啓動的容器)
  • -i: 以交互模式運行容器,通常與 -t 同時使用;
  • -P: 隨機端口映射,容器內部端口隨機映射到主機的高端口
  • -p: 指定端口映射,格式爲:主機(宿主)端口:容器端口
  • -t: 爲容器重新分配一個僞輸入終端,通常與 -i 同時使用;
  • –name=“nginx-lb”: 爲容器指定一個名稱;
  • –dns 8.8.8.8: 指定容器使用的DNS服務器,默認和宿主一致;
  • –dns-search example.com: 指定容器DNS搜索域名,默認和宿主一致;
  • -h “mars”: 指定容器的hostname;
  • -e username=“ritchie”: 設置環境變量;
  • –env-file=[]: 從指定文件讀入環境變量;
  • –cpuset=“0-2” or --cpuset=“0,1,2”: 綁定容器到指定CPU運行;
  • -m :設置容器使用內存最大值;
  • –net=“bridge”: 指定容器的網絡連接類型,支持 bridge/host/none/container: 四種類型;
  • –link=[]: 添加鏈接到另一個容器;
  • –expose=[]: 開放一個端口或一組端口;
  • –volume , -v: 綁定一個卷

其中有幾個筆者非常容易混淆的:
–rm
–rm 運行之後刪除這個container
默認情況下,每個容器在退出時,它的文件系統也會保存下來,這樣一方面調試會方便些,因爲你可以通過查看日誌等方式來確定最終狀態。另外一方面,你也可以保存容器所產生的數據。
但是當你僅僅需要短暫的運行一個容器,並且這些數據不需要保存,你可能就希望Docker能在容器結束時自動清理其所產生的數據。
這個時候你就需要--rm這個參數了。 注意:--rm-d不能共用!

-d
如果在docker run後面追加-d=true或者-d,那麼容器將會運行在後臺模式。
此時所有I/O數據只能通過網絡資源或者共享卷組來進行交互。因爲容器不再監聽你執行docker run的這個終端命令行窗口。但你可以通過執行docker attach來重新附着到該容器的回話中。
需要注意的是,容器運行在後臺模式下,是不能使用--rm選項的。

**-it **

-it 是 -i -t 的縮寫
-i 接受用戶輸入
-t 模擬終端模式

bash
bash以命令行形式啓動
一般會看到:
sudo docker run -it -p 7100:7100 -p -v /home:/mnt $container --restart=always --name mstar -ti image_name bash

1.2 幾種進入容器的方式

docker exec -i -t mynginx /bin/bash mynginx 可以是docker的名稱也可以是containID
docker attach containID


2 docker .sh形式啓動

如何在docker之中,程序自動啓動
來看一下多個.sh文件同時啓動:

docker run -idt ***/*** /bin/bash cs1.sh; cs2.sh; cs3.sh

但是,如何寫好這個.sh需要蠻多

2.1 常規報錯

報錯一:
exec user process caused "exec format error"
解決:
https://blog.csdn.net/qq_24452475/article/details/83242610
Script腳本 開頭必須加 #!/bin/bash,不然就會報錯

報錯二:
starting container process caused "exec: \"/entrypoint.sh\": permission denied": unknown
解決:
需要給予.sh文件chmod權限
chmod 777 ./test.sh

報錯三:
exec user process caused "no such file or directory"
解決:
確定你的.sh文件確保存在,因爲docker之中和你的宿主機不同

報錯四:
“/bin/bash^M: bad interpreter: No such file or directory”
解決:
文件格式問題
dos2unix filename

2.2 常規寫法步驟

步驟一:基本格式配置
.sh基本格式,譬如:

#!/bin/bash
pip3 install --pre numpy==1.17.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install --pre xlrd -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install --pre sanic_cors -i https://pypi.tuna.tsinghua.edu.cn/simple
cd /mnt/drug
python3 recommendation.py

鏈式代碼“&&”把多行指令結合成一行

步驟二:格式+權限調整

chmod 777 filename.sh
dos2unix filename.sh

chmod給權限,dos2unix調整格式

2.3 幾個實踐case

sudo docker run  -it -p 7100:7100 -p 7101:7101  -v /etc/localtime:/etc/localtime:ro -v /home:/mnt $container --restart=always --name mstar  -ti tensorflow:lasted  /mnt/test.sh

--restart=always,開機總啓動

加了-d之後,就代表在後臺運行。不過,如果是接口類的,加入並不好,因爲你可能還是需要可以看到一些記錄
在這裏插入圖片描述


3 docker打包成.rar一鍵部署

Docker 腳本化一鍵部署

3.1 docker 容器導出和導入(export / import )

$ docker export my_centos > /data/app/meifen/my_centos-export-0428.tar
$ docker import  /data/app/meifen/my_centos-export-0428.tar

3.2 docker 鏡像的加載與導入(save / load)

使用 docker images 查看本機已有的鏡像(也可以使用 docker commit 命令把一個正在運行的容器保存爲鏡像)

docker 保存save
格式:docker save IMAGE(鏡像)

$ docker save 9610cfc68e8d > /data/app/meifen/my_centos-export-0428.tar
docker load < /home/my_centos-export-0428.tar

加載 load 有點慢,稍微等待一下,沒有任何warn信息就表示保存OK。9610cfc68e8d 是鏡像ID

3.3 容器與鏡像導入/導出的差異

  • 容器導入(export / import )

    • 是將當前容器變成一個新的鏡像 2
    • export 只導出當前的信息
    • export導出的鏡像文件大小 小於 save保存的鏡像
    • export是根據容器拿到的鏡像,再導入時會丟失鏡像所有的歷史,所以無法進行回滾操作(docker tag )
  • 鏡像導入 (save / load)

    • 是複製鏡像的過程
    • save 保存鏡像所有的信息-包含歷史 2
    • save保存(load加載)的鏡像,沒有丟失鏡像的歷史,可以回滾到之前的層(layer)(查看方式:docker images --tree)

4 精簡Docker鏡像大小的必要性

Docker 腳本化一鍵部署

4.1 docker大小精簡的方式

下面是精簡Docker鏡像尺寸的好處:

  • 減少構建時間

  • 減少磁盤使用量

  • 減少下載時間

  • 因爲包含文件少,攻擊面減小,提高了安全性

  • 提高部署速度

  • 清除 yum 緩存

$ yum clean headers
$ yum clean packages
$ yum clean all
  • 清除無用的tar.gz安裝包
  • 選擇更小的基礎鏡像

4.2 清理Docker佔用的磁盤空間的方式

命令查看磁盤使用情況

$ du -hs /var/lib/docker/

用於查看Docker的磁盤使用情況

docker system df

清理磁盤
$ docker system prune

可以用於清理磁盤,刪除關閉的容器、無用的數據卷和網絡,以及dangling鏡像(即無tag的鏡像)。

$ docker system prune -a

遷移 /var/lib/docker 目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章