直接上一個例子nginx
from conda/miniconda3 MAINTAINER liangsqrt COPY ./jupyter /root/.jupyter COPY ./requirements.txt /home/jupyter/requirements.txt COPY ./sources.list /etc/apt/sources.list COPY ./condarc /root/.condarc RUN pip --disable-pip-version-check --no-cache-dir install pylint -i https://pypi.douban.com/simple \ && if [ -f "/tmp/conda-tmp/environment.yml" ]; then /opt/conda/bin/conda env update -n base -f /tmp/conda-tmp/environment.yml; fi \ && rm -rf /tmp/conda-tmp \ && pip install -i https://pypi.douban.com/simple -r /home/jupyter/requirements.txt \ # && conda install scrapy
當我想要啓動一個jupyter的容器時,我須要個性化定製一下,好比定製開放端口,jupyyter的根路徑、用戶密碼這些。方法有一下幾種:git
因而我選擇了二、3組合使用的方案。好比切換pip安裝的依賴項放到了鏡像裏;加載鏡像建立容器的指令我放到了docker-compose裏。docker
介紹這個鏡像是基於哪一個鏡像的。通常會在本地找,寫個本地的鏡像便可,若是沒有,就會去網上找。ubuntu
維護者或做者,可有可無。bash
將哪些東西複製到容器裏邊,copy進入容器裏邊的東西和外部的東西,是兩套東西,會佔用兩個硬盤內存。copy的時候還可使用正則,~ 源文件或者源目錄,這裏能夠是通配符表達式,其通配符規則要知足 Go 的 filepath.Match 規則 ~scrapy
COPY hom* /mydir/ COPY hom?.txt /mydir/
用於執行後面跟着的命令行命令, 很是重要,很經常使用。ui
用法和copy幾乎同樣,在copytar文件,且壓縮編碼方式爲gzip,bzip或者zx的狀況下,它會自動解壓!!!有點坑,有時候會解壓時報致使編排失敗,或者緩慢。編碼
相似於 RUN 指令,用於運行程序,但兩者運行的時間點不一樣spa
啓動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD 指令指定的程序可被 docker run 命令行參數中指定要運行的程序所覆蓋。其實用途也不大,多數時候這個功能都被docker-compose替換了。操作系統
理解很容易,當run要帶參數運行時,就用它。咱們手啓run,參數也不會被覆蓋,好比:
$ docker run nginx:test
若是咱們鏡像裏指定好了,那麼裏邊實際運行的指令是:nginx -c /etc/nginx/nginx.conf
除非特地傳參-c:
docker run nginx:test -c /etc/nginx/new.conf
其實也沒什麼用。
環境變量,設置docker裏邊的環境變量的值。
掛在路徑用的。好比要講容器中的某個路徑,映射出來,就能夠用這個。跟copy不同,這個路徑是容器和宿主機均可以訪問的,文件也只有一份。這個功能很經常使用。命令行裏邊用它的方法是 -v
僅僅只是聲明端口。
指定工做目錄。用 WORKDIR 指定的工做目錄,會在構建鏡像的每一層中都存在。(WORKDIR 指定的工做目錄,必須是提早建立好的)。docker build 構建鏡像過程當中的,每個 RUN 命令都是新建的一層。只有經過 WORKDIR 建立的目錄纔會一直存在。
docker的鏡像是分層的,每個指令都會增長dockerImage的層數,加大docker鏡像的體積
因爲docker用到的copy-on-write技術(git中也用到了這個技術),就是說當你在docker裏建立了某個文件,以後再刪除掉,這個文件還在嗎?還在的!並且建立和刪除執行了兩次,docker就增長了兩層。
通常隨便幾層,就有個幾百兆的樣子。這是影響鏡像大小最直觀的地方。因此run方法,最好就一個,直接用&&鏈接符將他們串聯起來。通常這樣操做後,效果比較直觀。
用更精簡的鏡像,效果不大,
但麻煩的是須要先將容器運行起來,並且這個過程當中你會丟失鏡像原有的一些信息,好比:導出端口,環境變量,默認指令。
無論這個容器是否是在運行,均可以導出它,而後交給同事拿去部署,可是會丟失啓動指令呀,端口,硬盤映射路徑這些,裏邊只是包含了你的代碼環境。
# 導入語法 docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] # 例子 docker import my_ubuntu_v3.tar runoob/ubuntu:v4 # 導入語法 docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] # 例子 docker import my_ubuntu_v3.tar runoob/ubuntu:v4
# 導出語法 docker save [OPTIONS] IMAGE [IMAGE...] # 例子,若是須要跨操做系統,請使用 -o 方式 docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3 docker save runoob/ubuntu:v3 > my_ubuntu_v3.tar # 導入語法 docker load [OPTIONS] # 例子,若是須要跨操做系統,請使用 -i 方式 docker load -i ubuntu.tar docker load < ubuntu.tar
docker save
保存的是鏡像,docker export
保存的是容器docker load
用來載入鏡像包,docker import
用來載入容器包,但二者都會恢復爲鏡像docker load
不能對載入的鏡像重命名,而 docker import
能夠爲鏡像指定新名稱