這是之前的文章:
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一鍵部署
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鏡像大小的必要性
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 目錄