5-Dockerfile文件

5-Dockerfile文件

先練習一個例子:

  1. 創建 Dockerfile 文件

    FROM ubuntu:14.04
    LABEL maintainer="vincent <jeffmanword@gmail.com>"
    RUN apt-get update && apt-get install -y redis-server
    EXPOSE 6397
    ENTRYPOINT [ "/usr/bin/redis-server" ]
    
    • FROM 是 我們選擇的 base 基礎鏡像
    • LABEL 為 我們需要的標識,比如作者是誰
    • RUN 是我們 執行的命令,必須使用連接符
    • EXPOSE 暴漏的端口
    • ENTRYPOINT 程序的入口
  2. 構建

docker build -t vincent/redis:latest .

關鍵字

  1. FROM

    FROM scratch             # 制作base image
    
    FROM centos              # 使用base image
    
    FROM ubuntu:14.04
    

    盡量使用官方發布的image作為base image,原因很簡單,為了安全!

  2. LABEL

    LABEL maintainer="jeffmanword@gmail.com"
    LABEL version="1.0"
    LABEL description="This is description."
    

    定義image的meta data,描述這個鏡像的信息

  3. RUN

    RUN yum update && yum install -y vim \python-dev     # 反斜線換行RUN apt-get update && apt-get install -y perl \pwgen --no-install-recommends && rm -rf \/var/lib/apt/lists/*  # 注意清理cacheRUN /bin/bash -c 'source $HOME/.bashrc;echo $HOME'
    

    使用 && 的原因是因為,每一次RUN都會增加一層(類似commit),如果使用 && 連接,將只有一層。
    總結: 為了無用分層,為了美觀,合并多條命令為一條,如果復雜的RUN請使用反斜線換行!

  4. WORKDIR

    WORKDIR /root
    
    WORKDIR /test    # 如果沒有test文件夾將會自動創建
    WORKDIR demo
    RUN pwd          # 輸出結果應該是/test/demo
    

    設定當前工作目錄的,類似 cd 命令。在使用的時候注意盡量不要用RUN cd,而是使用WORKDIR,并且路徑盡量使用絕對路徑,避免出錯。

  5. ADDCOPY

    ADD hello /
    
    ADD test.tar.gz /  # 添加到根目錄并解壓,這是與COPY的區別
    
    WORKDIR /root
    ADD hello test/    # 添加到 /root/test/hello
    
    WORKDIR /root
    COPY hello test/   # /root/test/hello
    

    大部分情況下,COPY優先于ADD,ADD除了COPY外還有額外功能(如解壓),添加遠程文件請使用curl或者wget。

  6. ENV

    ENV MYSQL_VERSION 5.6   # 設置環境變量
    RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \&& rm -rf /var/lib/apt/lists/*   # 引用環境變量
    

    盡量使用ENV,可以簡化Dockerfile,并增加可維護性(避免寫死)。

  7. EXPOSE

    EXPOSE 1080 443
    

    EXPOSE 用來暴露端口,EXPOSE 只是聲明運行容器時提供的服務端口,這僅僅是一個聲明,在運行容器的時候并不會因為這個聲明就會開啟端口服務,你依舊需要使用 -P 或者 -p 參數映射端口。在 Dockerfile 中寫這樣的端口聲明有助于使用者理解這個鏡像開放哪些服務端口,以便配置映射。

  8. VOLUME

    VOLUME /data
    
  9. CMDENTRYPOINT

    • shell方式
    RUN apt-get install -y vim
    CMD echo "hello word"
    ENTRYPOINT echo "hello docker"
    
    RUN ["apt-get", "install", "-y", "vim"]
    CMD ["/bin/echo", "hello word"]
    ENTRYPOINT ["/bin/echo", "hello docker"]
    
    • exec 方式
    FROM ubuntu:16.04
    WORKDIR /
    CMD ["ls"]
    
    FROM ubuntu:16.04
    WORKDIR /
    ENTRYPOINT ["ls"]
    

    CMD 和 ENTRYPOINT 是容器啟動命令。這兩條命令的區別是ENTRYPOINT 可以讓我們把容器當成一條指令運行。CMD 命令為 docker 容器啟動時默認執行的命令,如果 docker run 指定了其他命令,CMD將會被忽略。

    分別將上面exec的兩個例子構建成鏡像

    docker build -t ubuntu-cmd .
    docker build -t ubuntu-entry .
    
    $: docker run --rm ubuntu-cmd -l
    docker: Error response from daemon: OCI runtime create failed:
    container_linux.go:344: starting container process caused
    "exec: \"-l\": executable file not found in $PATH": unknown.
    
    $: docker run --rm ubuntu-entry -l
    total 4
    drwxr-xr-x.   2 root root 4096 Jan 22 19:22 bin
    drwxr-xr-x.   2 root root    6 Apr 12  2016 boot
    drwxr-xr-x.   5 root root  340 Feb 10 09:44 dev
    drwxr-xr-x.   1 root root   66 Feb 10 09:44 etc
    drwxr-xr-x.   2 root root    6 Apr 12  2016 home
    drwxr-xr-x.   8 root root   96 Sep 13  2015 lib
    ...
    

制作一個hello word鏡像

  1. 編寫 一個 簡單 c 程序

    hello.c

    #include<stdio.h>int main()
    {printf("hello docker\n");
    }
    

    編譯成二進制

    sudo yum install gcc glibc-static
    gcc -static hello.c -o hello
    

    測試是否正常

    [vagrant@10 hello-word]$ ./hello 
    hello docker
    
  2. 創建Dockerfile

    FROM scratch
    ADD hello /
    CMD ["/hello"]
    
  3. 創建鏡像

    docker build -t 144.202.112.240:5000/hello-word .
    

    輸出結果

    Sending build context to Docker daemon  7.472MB
    Step 1/3 : FROM scratch---> 
    Step 2/3 : ADD hello /---> Using cache---> 8d2cefe8cbf3
    Step 3/3 : CMD ["/hello"]---> Using cache---> bb6f23084c78
    Successfully built bb6f23084c78
    Successfully tagged 144.202.112.240:5000/hello-word:latest
    

    檢查是否構建成功

    [vagrant@10 hello-word]$ docker image ls
    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
    144.202.112.240:5000/hello-word   latest              bb6f23084c78        23 hours ago        857kB
    
  4. 創建容器

    docker run --rm 144.202.112.240:5000/hello-word 

    –rm 為 退出的時候自動刪除容器

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536041.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6-搭建一個私有registry

6-搭建一個私有registry docker hub 查找 registry docker hub registry 可以看到部署很簡單&#xff0c;只有一條命令。 docker run -d -p 5000:5000 --restart always --name registry registry:2部署私有registry 找一臺linux的服務器并安裝好docker 在此服務器上部署re…

7-深入練習Dockerfile

7-深入練習Dockerfile 創建一個json-server 鏡像 首先創建一個 json-server 文件夾 mkdir json-server在json-server文件夾下創建Dockerfile FROM node:10.15.0 RUN npm install -g json-server構建鏡像 docker build -t json-server .創建一個api服務的鏡像 首先創建一個 …

8-容器操作

8-容器操作 普通操作 進入容器 docker exec -it api /bin/bash容器停止與啟動 docker stop api docker start api容器重啟 docker restart api查看容器詳細信息 docker inspect api查看日志 docker logs api容器刪除 docker stop api # 必須先停止才能刪除 docker rm…

9-資源限制

9-資源限制 了解stress工具 stress是一個壓力測試工具 docker run -it ubuntu:16.04此時會進入ubuntu內&#xff0c;這時我們安裝 stress工具 apt-get update && apt-get install -y stress查看help stress --helpUsage: stress [OPTION [ARG]] ...-?, --help …

10-Docker 網絡

10-Docker 網絡 基礎網絡概念 數據傳輸通過數據包 兩臺筆記本之間通信是通過數據包通信的。想知道數據包是怎么打包的呢&#xff0c;就先要知道網絡分層的概念。 網絡分層 目前有兩種網絡分層的模型。 ISO/OSI 分層&#xff0c;也就是 7 層模型。TCP/IP 分層&#xff0c;也就…

11-Docker Bridge詳解

11-Docker Bridge詳解 容器之間是如何通信的&#xff1f; 操作前刪除test2的容器。 查看當前機器上docker的網絡 docker network lsNETWORK ID NAME DRIVER SCOPE 056d0ece100f bridge bridge local a…

12-容器之間link

12-容器之間link 這篇主要講 容器之間如何 link。 需要準備的是&#xff0c;創建兩個容器 test1 和 test2 通過 busybox。 在之前的課程中已經創建的只需要重新啟動即可。 什么情況下需要link 例如有一個容器是 web 服務器&#xff0c;并且跑在一個docker容器內&#xff0c;…

13-容器的端口映射

13-容器的端口映射 部署一個簡單web nginx容器 docker run -d --name web nginxnginx 默認的端口是 80 端口&#xff0c;此時我們是沒有辦法訪問的。 好的&#xff0c;通過前面的學習我們已經知道&#xff0c;這個 web 容器四連接到 bridge 網橋上的&#xff0c;那我們查看一…

14-容器網絡之host和none

14-容器網絡之host和none 在之前的小節&#xff0c;我們有看到過 host 和 none。 通過 docker network ls 查看。 none 網絡 刪除 test1 容器 docker stop test1 && docker rm test1創建 test1 容器并連接到none網絡 docker run -d --name test1 --network none busy…

15-多容器復雜應用的部署

15-多容器復雜應用的部署 此節主要是通過部署一個復雜的應用場景&#xff0c;進而練習容器的網絡相關知識。 創建一個flask-web應用 創建一個 flask-web 文件夾 mkdir flask-web在此文件夾內創建 app.py 文件 cd flask-web touch app.py編寫一個簡單的 web 程序 import os im…

16-多機器通信

16-多機器通信 回顧上節課的思考題。 flask-redis 想訪問 redis&#xff0c;該如何通信&#xff1f; 創建另外一臺linux虛擬機 直接拷貝Vagrantfile文件創建一個 centos 虛擬機 我們創建一個centos7-2文件夾&#xff0c;然后創建虛擬機 vagrant up創建的過程中提示選擇網絡接…

17-Docker的數據持久化介紹

17-Docker的數據持久化介紹 回顧容器與鏡像 容器是在鏡像之上創建的一層運行時層&#xff0c;這一層是可以讀寫的&#xff0c;我們能夠在容器內添加數據&#xff0c;讀取數據。 也就是說我們在創建容器的時候&#xff0c;我們能夠在容器內創建文件&#xff0c;安裝軟件等等&a…

18-數據持久化-Data Volume

18-數據持久化-Data Volume Data Volume 使用場景。一般來講有些容器自己會產生一些數據&#xff0c;我們不想數據隨著容器的銷毀而銷毀&#xff0c;我們想保存數據&#xff0c;正常一般用在數據庫&#xff0c;比如我們想保存數據庫中的數據&#xff0c;這個時候我們就會使用 …

19-數據持久化-Bind Mounting

19-數據持久化-Bind Mounting Bind Mounting 與 Data Volume區別 Data Volume 需要在 Dockerfile 內聲明需要創建的 volume 目錄。 Bind Mounting 則不需要在 Dockerfile 聲明 volume&#xff0c;只需要在創建容器的時候&#xff0c;也就是 run 的時候聲明即可。 如: dock…

go自定義包教程

go自定義包教程 而是環境為 go version go1.11 linux/amd64linux mint 19 創建一個自定義的包 切換到src目錄下&#xff0c;創建demo目錄 cd src mkdir demo再創建smap 文件夾 cd demo mkdir smap創建包文件 cd smap touch map.gomap.go文件內容 package smapimport "…

在Linux中對硬盤進行分區、格式化和掛載

在Linux中對硬盤進行分區、格式化和掛載 我最近有一個全新的4-TB硬盤加入我的電腦。所以我需要在Linux中安裝它。為此&#xff0c;我需要執行以下操作&#xff1a; 分區格式化掛載檢查是否已安裝硬盤驅動器 分區 首先&#xff0c;在通過SATA和電源線將硬盤連接到計算機后&am…

Angular gitlab持續集成之runner配置

gitlab持續集成 安裝Runner 正常安裝 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

javascript編譯壓縮

javascript編譯 js是JavaScript 源碼文件&#xff0c; .min.js是壓縮版的js文件。 .min.js文件經過壓縮&#xff0c;相對編譯前的js文件體積較小&#xff0c;傳輸效率快。經過編碼將變量和函數原命名改為毫無意義的命名&#xff0c;以防止他人窺視和竊取 js 源代碼 在線版 g…

vscode設置中文

vscode設置中文 當我們安裝完成vscode后&#xff0c;會發現它是中文的&#xff0c;因為默認情況下&#xff0c;vscode使用的語言為英文(us)。 那很多同學是不喜歡英文的&#xff0c;不是看不懂&#xff0c;而是不方便哈。 修改語言配置文件 使用快捷鍵組合【CtrlShiftp】 在…

linux下編譯boost

linux下編譯boost 下載boot庫 官方下載地址 下載完成會解壓。 編譯 1.進入解壓后的文件夾內 cd boost_1_69_0 執行下面的語句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定編譯哪些boost庫&#xff0c;all的話就是全部編譯&#xff0c;只想…