Docker基礎


Dockerfile構建鏡像

<code>通過Dockerfile創建鏡像
雖然可以自己製作 rootfs(見'容器文件系統那些事兒'),但Docker 提供了一種更便捷的方式,叫作 Dockerfile

docker build命令用於根據給定的Dockerfile和上下文以構建Docker鏡像。

docker build語法:
# docker build [OPTIONS] <path>

1. 常用選項說明
--build-arg,設置構建時的變量
--no-cache,默認false。設置該選項,將不使用Build Cache構建鏡像
--pull,默認false。設置該選項,總是嘗試pull鏡像的最新版本
--compress,默認false。設置該選項,將使用gzip壓縮構建的上下文
--disable-content-trust,默認true。設置該選項,將對鏡像進行驗證
--file, -f,Dockerfile的完整路徑,默認值為‘PATH/Dockerfile’
--isolation,默認--isolation="default",即Linux命名空間;其他還有process或hyperv
--label,為生成的鏡像設置metadata
--squash,默認false。設置該選項,將新構建出的多個層壓縮為一個新層,但是將無法在多個鏡像之間共享新層;設置該選項,實際上是創建了新image,同時保留原有image。
--tag, -t,鏡像的名字及tag,通常name:tag或者name格式;可以在一次構建中為一個鏡像設置多個tag
--network,默認default。設置該選項,Set the networking mode for the RUN instructions during build

--quiet, -q ,默認false。設置該選項,Suppress the build output and print image ID on success
--force-rm,默認false。設置該選項,總是刪除掉中間環節的容器
--rm,默認--rm=true,即整個構建過程成功後刪除中間環節的容器

2. PATH | URL | -說明:
給出命令執行的上下文。
上下文可以是構建執行所在的本地路徑,也可以是遠程URL,如Git庫、tarball或文本文件等。
如果是Git庫,如https://github.com/docker/rootfs.git#container:docker,則隱含先執行git clone --depth 1 --recursive,到本地臨時目錄;然後再將該臨時目錄發送給構建進程。
構建鏡像的進程中,可以通過ADD命令將上下文中的任何文件(注意文件必須在上下文中)加入到鏡像中。
-表示通過STDIN給出Dockerfile或上下文。
示例:

  docker build - < Dockerfile

說明:該構建過程只有Dockerfile,沒有上下文

  docker build - < context.tar.gz

說明:其中Dockerfile位於context.tar.gz的根路徑

  docker build -t champagne/bbauto:latest -t champagne/bbauto:v2.1 .
  docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .


2.1、 創建鏡像所在的文件夾和Dockerfile文件
        命令:

        1、mkdir sinatra
        2、cd sinatra
        3、touch Dockerfile

2.2、 在Dockerfile文件中寫入指令,每一條指令都會更新鏡像的信息例如:
        # This is a comment
        FROM ubuntu:14.04
        MAINTAINER tiger [email protected]
        RUN apt-get update && apt-get install -y ruby ruby-dev
        RUN gem install sinatra
       
        格式說明:
        每行命令都是以 INSTRUCTION statement 形式,就是命令+ 清單的模式。命令要大寫,"#"是註解。
        FROM 命令是告訴docker 我們的鏡像什麼。
        MAINTAINER 是描述 鏡像的創建人。
        RUN 命令是在鏡像內部執行。就是說他後面的命令應該是針對鏡像可以運行的命令。

2.3、創建鏡像
        命令:docker build -t tiger/sinatra:v2 .
        docker build 是docker創建鏡像的命令
        -t 是標識新建的鏡像屬於 ouruser的  
        sinatra是倉庫的名稱  
      :v2 是tag
        "."是用來指明 我們的使用的Dockerfile文件當前目錄的

        詳細執行過程:
      [root@master sinatra]# docker build -t tiger/sinatra:v2 .
      Sending build context to Docker daemon 2.048 kB
      Step 1 : FROM daocloud.io/ubuntu:14.04
      Trying to pull repository daocloud.io/ubuntu ...
      14.04: Pulling from daocloud.io/ubuntu
      f3ead5e8856b: Pull complete

      Digest: sha256:ea2b82924b078d9c8b5d3f0db585297a5cd5b9c2f7b60258cdbf9d3b9181d828
        ---> 2ff3b426bbaa
      Step 2 : MAINTAINER tiger [email protected]
        ---> Running in 948396c9edaa
        ---> 227da301bad8
      Removing intermediate container 948396c9edaa
      Step 3 : RUN apt-get update && apt-get install -y ruby ruby-dev
        ...
      Step 4 : RUN gem install sinatra
      ---> Running in 89234cb493d9

2.4、創建完成後,從鏡像創建容器
        #docker run -t -i tiger/sinatra:v2 /bin/bash/<path>/<code>

Dockerfile分為四個部分: 基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動指令。 即FROM、MAINTAINER、RUN、CMD四個部分

指令說明
<code>FROM         指定所創建鏡像的基礎鏡像
MAINTAINER   制定維護者信息
RUN         運行命令
CMD         容器啟動是默認執行的命令
LABEL       指定生成鏡像的元數據標籤信息
EXPOSE       聲明鏡像內服務所監聽的端口
ENV         指定環境變量
ADD         複製指定src路徑的內容到容器的dest路徑下,如果src為tar文件,則自動解壓到dest路徑下
copy         複製指定src路徑的內容到鏡像的dest路徑下
ENTERPOINT   指定鏡像的默認入口
VOLUME       創建數據卷掛載點
USER         指定運行容器是的用戶名或UID

WORKDIR     配置工作目錄
ARG         指定鏡像內使用的參數
ONBUILD     配置當所創建的鏡像作為其他鏡像的基礎鏡像時,所執行創建操作指令
STOPSIGAL   容器退出信號值
HEALTHCHECK 如何進行健康檢查
SHELL       指定使用shell的默認shell類型/<code>
nginx-dockerfile示例

vim Dockerfile

<code>FROM centos:7.2.1511

ENV TZ=Asia/Shanghai

RUN yum -y install epel* \\
yum -y install gcc openssl openssl-devel pcre-devel zlib-devel

ADD nginx-1.14.2.tar.gz /opt/

WORKDIR /opt/nginx-1.14.2

RUN ./configure --prefix=/opt/nginx --http-log-path=/opt/nginx/logs/access.log --error-log-path=/opt/nginx/logs/error.log --http-client-body-temp-path=/opt/nginx/client/ --http-proxy-temp-path=/opt/nginx/proxy/ --with-http_stub_status_module --with-file-aio --with-http_flv_module --with-http_gzip_static_module --with-stream --with-threads --user=www --group=www
RUN make && make install
RUN groupadd www && useradd -g www www
WORKDIR /opt/nginx
RUN rm -rf /opt/nginx-1.14.2

ENV NGINX_HOME=/opt/nginx
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/nginx/sbin

EXPOSE 80 443
 
CMD ["nginx", "-g", "daemon off;"]/<code>

需要先下載nginx-1.14.2.tar.gz在Dockerfile同級目錄下,然後執行如下命令 docker build -t nginx_image ./Dockerfile

tomcat-dockerfile示例
<code>FROM centos:7.4.1708

ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.88.tar.gz /usr/local/

WORKDIR /usr/local/

RUN mv jdk1.8.0_171 jdk && mv apache-tomcat-7.0.88 tomcat

ENV JAVA_HOME=/usr/local/jdk
ENV CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CATALINA_HOME /usr/local/tomcat

EXPOSE 8080

CMD /usr/local/tomcat/bin/catalina.sh run/<code>

需要先下載jdk和tomcat在dockerfile的同級目錄下,然後執行如下命令 docker build -t tomcat_image ./Dockerfile

容器網絡

<code>小規模docker環境大部分運行在單臺主機上,如果公司大規模採用docker,那麼多個宿主機上的docker如何互聯

Docker默認的內部ip為172.17.42.0網段,所以必須要修改其中一臺的默認網段以免ip衝突。
#vim /etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS= --bip=172.18.42.1/16
#reboot

docker 130上:
#route add -net 172.18.0.0/16 gw 192.168.18.128

docker 128上:
#route add -net 172.17.0.0/16 gw 192.168.18.130

現在兩臺宿主機裡的容器就可以通信了。/<code>


容器固定IP

<code>docker安裝後,默認會創建三種網絡類型,bridge、host和none
顯示當前網絡:
# docker network list
NETWORK ID           NAME               DRIVER             SCOPE
90b22f633d2f         bridge             bridge             local
e0b365da7fd2         host               host               local
da7b7a090837         none               null               local

bridge:網絡橋接
默認情況下啟動、創建容器都是用該模式,所以每次docker容器重啟時會按照順序獲取對應ip地址,這就導致容器每次重啟,ip都發生變化

none:無指定網絡
啟動容器時,可以通過–network=none,docker容器不會分配局域網ip
host:主機網絡
docker容器的網絡會附屬在主機上,兩者是互通的。

創建固定ip容器
1、創建自定義網絡類型,並且指定網段
#docker network create --subnet=192.168.0.0/16 staticnet

通過docker network ls可以查看到網絡類型中多了一個staticnet

2、使用新的網絡類型創建並啟動容器
#docker run -it --name userserver --net staticnet --ip 192.168.0.2 centos:6 /bin/bash

通過docker inspect可以查看容器ip為192.168.0.2,關閉容器並重啟,發現容器ip並未發生改變/<code>


Docker基礎



分享到:


相關文章: