DockerFile

直接上一個例子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

  1. 直接運行jupyter,容器起來後,進入容器,生成密碼,並完成相關的個性化功能。缺點:每次重啓容器後,部分指令要進入容器從新敲(沒有在啓動容器的時候就寫好的指令);想要建立多個這樣的容器太難
  2. Docker-compose 能夠,可是啓動多個容器時,至關因而在基礎容器上安裝新功能
  3. DockerFile生成自定義的鏡像,直接經過鏡像啓動

因而我選擇了二、3組合使用的方案。好比切換pip安裝的依賴項放到了鏡像裏;加載鏡像建立容器的指令我放到了docker-compose裏。docker

DockerFile詳解

from

介紹這個鏡像是基於哪一個鏡像的。通常會在本地找,寫個本地的鏡像便可,若是沒有,就會去網上找。ubuntu

MAINTAINER

維護者或做者,可有可無。bash

COPY

將哪些東西複製到容器裏邊,copy進入容器裏邊的東西和外部的東西,是兩套東西,會佔用兩個硬盤內存。copy的時候還可使用正則,~ 源文件或者源目錄,這裏能夠是通配符表達式,其通配符規則要知足 Go 的 filepath.Match 規則 ~scrapy

COPY hom* /mydir/
COPY hom?.txt /mydir/
RUN

用於執行後面跟着的命令行命令, 很是重要,很經常使用。ui

ADD

用法和copy幾乎同樣,在copytar文件,且壓縮編碼方式爲gzip,bzip或者zx的狀況下,它會自動解壓!!!有點坑,有時候會解壓時報致使編排失敗,或者緩慢。編碼

CMD

相似於 RUN 指令,用於運行程序,但兩者運行的時間點不一樣spa

  • CMD 在docker run 時運行
  • RUN 是在 docker build

啓動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD 指令指定的程序可被 docker run 命令行參數中指定要運行的程序所覆蓋。其實用途也不大,多數時候這個功能都被docker-compose替換了。操作系統

ENTRYPOINT

理解很容易,當run要帶參數運行時,就用它。咱們手啓run,參數也不會被覆蓋,好比:

$ docker run  nginx:test

若是咱們鏡像裏指定好了,那麼裏邊實際運行的指令是:nginx -c /etc/nginx/nginx.conf

除非特地傳參-c:

docker run  nginx:test -c /etc/nginx/new.conf

其實也沒什麼用。

ENV

環境變量,設置docker裏邊的環境變量的值。

VOLUME

掛在路徑用的。好比要講容器中的某個路徑,映射出來,就能夠用這個。跟copy不同,這個路徑是容器和宿主機均可以訪問的,文件也只有一份。這個功能很經常使用。命令行裏邊用它的方法是 -v

EXPOSE

僅僅只是聲明端口。

  • 幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射。
  • 在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。
WORKDIR

指定工做目錄。用 WORKDIR 指定的工做目錄,會在構建鏡像的每一層中都存在。(WORKDIR 指定的工做目錄,必須是提早建立好的)。docker build 構建鏡像過程當中的,每個 RUN 命令都是新建的一層。只有經過 WORKDIR 建立的目錄纔會一直存在。

Docker層概念,以及精簡docker鏡像大小

docker的鏡像是分層的,每個指令都會增長dockerImage的層數,加大docker鏡像的體積

image.png

因爲docker用到的copy-on-write技術(git中也用到了這個技術),就是說當你在docker裏建立了某個文件,以後再刪除掉,這個文件還在嗎?還在的!並且建立和刪除執行了兩次,docker就增長了兩層。

因此精簡的第一步,減小層,經過減小指令的方式

通常隨便幾層,就有個幾百兆的樣子。這是影響鏡像大小最直觀的地方。因此run方法,最好就一個,直接用&&鏈接符將他們串聯起來。通常這樣操做後,效果比較直觀。

更精簡的鏡像

用更精簡的鏡像,效果不大,

用docker的improt 和export

但麻煩的是須要先將容器運行起來,並且這個過程當中你會丟失鏡像原有的一些信息,好比:導出端口,環境變量,默認指令。

Docker部署

容器導出導入 export import

無論這個容器是否是在運行,均可以導出它,而後交給同事拿去部署,可是會丟失啓動指令呀,端口,硬盤映射路徑這些,裏邊只是包含了你的代碼環境。

# 導入語法
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 能夠爲鏡像指定新名稱
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息