docker學習之dockerfile

容器端口映射

經過一條命令,運行一個python web容器。
docker run -d -P trainging/webapp python app.py
    -d 後臺運行參數
    -P 隨機端口映射,宿主機的一個隨機端口:映射到容器內暴露的端口
    trainging/webapp 運行的鏡像名
    python app.py 運行容器內的一個app.py腳本文件

dockerfile介紹

​ 鏡像是容器的基礎,每次執行docker run的時候都會指定哪一個鏡像做爲容器運行的基礎。直接使用來自docker hub的鏡像只能知足必定的需求,當鏡像沒法知足咱們的需求時,須要自定製鏡像。python

​ 鏡像的定製就是定製每一層所添加的配置、文件。若是能夠把每一層修改、安裝、構建、操做的命令都寫入到一個腳本中,用腳原本構建、定製鏡像,這個腳本就是dockerfile。dockerfile是一個文本文件,其內容是一條條的指令,每一條指令構建一層,所以每一條指令的內容就是描述該層如何構建的。mysql

dockerfile指令

# FROM指令是指定哪個系統做爲基礎鏡像
# 製做base image基礎鏡像,儘可能使用官方的image做爲base image
FROM centos
FROM ubuntu:14:04   # 帶有tag的base image

# 容器元信息,幫助信息,相似於代碼註釋
LABEL version="1.0"
LABEL maintainer="user"

# RUN這個指令是萬能指令,寫什麼,docker構建時就執行什麼
# 對於複雜的RUN指令,避免無用的分層,多條命令用反斜線換行,合成一條命令
RUN yum update && yum install -y vim \
    Python-dev      # 反斜線換行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME"

WORKDIR /root # 至關於linux的cd命令,改變目錄,儘可能使用絕對路徑
WORKDIR /test # 若是沒有就自動建立
WORKDIR demo # 再進入demo文件夾
RUN pwd # 打印結果應該是/test/demo

ADD hello / # 把本地文件添加到鏡像中,把本地的hello可執行文件拷貝到鏡像的/目錄
ADD test.tar.gz # ADD指令不只有拷貝資料到容器的做用,還有解壓的做用

COPY hello test/ # 等同於上述ADD效果

# ADD與COPY
#   - 優先使用COPY命令
#   - ADD除了COPY功能還有解壓功能
# 添加遠程文件/目錄使用curl或wget

# ENV指令用於定義一個變量
ENV # 環境變量,儘量使用ENV來增長可維護性
ENV MYSQL_VERSION 5.6 # 設置一個mysql常量
RUN yum install -y mysql-server="${MYSQL_VERSION}"

# 例子
ENV django_version="1.5"
pip3 install django==django_version

# dockerfile的expose參數,暴露容器的8080端口,提供給外部機器訪問
EXPOSE 8080

dockerfile練習

  • 構建一個dockerfile與flask web應用,且外部客戶端能夠訪問。linux

    1. 建立一個flask代碼文件web

      #coding:utf8
      from flask import Flask
      app = Flask(__name__)
      @app.route('/')
      def hello():
          return "<h1>這是一個dockerfile構建的flask web應用</h1>"
      if __name_ == "__main__":
          app.run(host='0.0.0.0', port=8080)
    2. 建立dockerfile,內容以下sql

      FROM centos
      COPY Centos-Base.repo /etc/yum.repos.d/
      COPY epel.repo /etc/yum.repos.d/
      RUN yum clean all
      RUN yum install python-setuptools -y
      RUN easy_install flask
      COPY s16-flask.py /opt/
      WROKDIR /opt
      EXPOSE 8080
      CMD ["python", "s16-flask.py"]
    3. 構建打包dockerfile,生成一個本身的鏡像docker

      docker build -t yuchao163/s16-flask-docker .
          -t 指定鏡像的版本名
          。 找到當前路徑的Dockerfile
    4. 基於這個本身構建的鏡像,運行一個flask web容器django

      docker run -d -p 8888:8080 77b
          -d 後臺運行
          -p 指定端口映射 宿主機的8888映射到容器的8080
          77b 本身構建的鏡像id
    5. 查看容器的端口轉發狀況json

      docker port 容器id
  • docker私有倉庫的搭建flask

    1. 下載一個私有倉庫的鏡像,基於這個鏡像生成docker倉庫容器ubuntu

      docker run -d \
         -p 5000:5000 \
         -v /opt/data/registry:/var/lib/registry \
         registry
      # 參數解釋
      -v 數據卷掛載,目錄映射
      -p 端口映射
    2. 修改docker的配置文件,支持http方式的推送

      vim /etc/docker/daemon.json
      # 修改以下參數
      {"registry-mirrrors":["http://f1361db2.m.daocloud.io"],
      "insecure-registries":["宿主機IP:5000"]
      }
    3. 修改docker的啓動服務命令,支持讀取/etc/docker/deamon.json文件

      # 編輯文件 /lib/systemd/system/docker.service
      vim /lib/systemd/system/docker.service
      
      # 找到[service]這一行,添加以下參數
      EnvironmentFile=-/etc/docker/daemon.json
    4. 從新讀取docker配置文件

      systemctl daemon-reload
    5. 重啓docker服務

      systemctl restart docker
    6. 因爲重啓了我docker,docker進程都掛掉了

      # 從新運行一個新的私有倉庫,命令以下
      docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
         --privileged=true docker容器的安全機制:設置特權級運行的容器
    7. 推送本地鏡像到私有倉庫中

      1. 修改本地鏡像的tag標記號,指定私有倉庫的地址傳輸
         docker tag docker.io/hello-world 宿主機IP:端口/s16-old-docker
      2. 推送到私有倉庫
         docker push 宿主機IP:端口/s16-old-docker
    8. 經過私有倉庫的api,檢查鏡像數據

      能夠經過瀏覽器訪問api數據,http://192.168.15.71:5000/v2/_catalog

    9. 此時能夠經過私有倉庫下載公司內部的鏡像

      docker pull 宿主機IP:端口/s16-old-docker-heheheheh
相關文章
相關標籤/搜索