經過一條命令,運行一個python web容器。
docker run -d -P trainging/webapp python app.py -d 後臺運行參數 -P 隨機端口映射,宿主機的一個隨機端口:映射到容器內暴露的端口 trainging/webapp 運行的鏡像名 python app.py 運行容器內的一個app.py腳本文件
鏡像是容器的基礎,每次執行docker run的時候都會指定哪一個鏡像做爲容器運行的基礎。直接使用來自docker hub的鏡像只能知足必定的需求,當鏡像沒法知足咱們的需求時,須要自定製鏡像。python
鏡像的定製就是定製每一層所添加的配置、文件。若是能夠把每一層修改、安裝、構建、操做的命令都寫入到一個腳本中,用腳原本構建、定製鏡像,這個腳本就是dockerfile。dockerfile是一個文本文件,其內容是一條條的指令,每一條指令構建一層,所以每一條指令的內容就是描述該層如何構建的。mysql
# 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與flask web應用,且外部客戶端能夠訪問。linux
建立一個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)
建立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"]
構建打包dockerfile,生成一個本身的鏡像docker
docker build -t yuchao163/s16-flask-docker . -t 指定鏡像的版本名 。 找到當前路徑的Dockerfile
基於這個本身構建的鏡像,運行一個flask web容器django
docker run -d -p 8888:8080 77b -d 後臺運行 -p 指定端口映射 宿主機的8888映射到容器的8080 77b 本身構建的鏡像id
查看容器的端口轉發狀況json
docker port 容器id
docker私有倉庫的搭建flask
下載一個私有倉庫的鏡像,基於這個鏡像生成docker倉庫容器ubuntu
docker run -d \ -p 5000:5000 \ -v /opt/data/registry:/var/lib/registry \ registry # 參數解釋 -v 數據卷掛載,目錄映射 -p 端口映射
修改docker的配置文件,支持http方式的推送
vim /etc/docker/daemon.json # 修改以下參數 {"registry-mirrrors":["http://f1361db2.m.daocloud.io"], "insecure-registries":["宿主機IP:5000"] }
修改docker的啓動服務命令,支持讀取/etc/docker/deamon.json
文件
# 編輯文件 /lib/systemd/system/docker.service vim /lib/systemd/system/docker.service # 找到[service]這一行,添加以下參數 EnvironmentFile=-/etc/docker/daemon.json
從新讀取docker配置文件
systemctl daemon-reload
重啓docker服務
systemctl restart docker
因爲重啓了我docker,docker進程都掛掉了
# 從新運行一個新的私有倉庫,命令以下 docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全機制:設置特權級運行的容器
推送本地鏡像到私有倉庫中
1. 修改本地鏡像的tag標記號,指定私有倉庫的地址傳輸 docker tag docker.io/hello-world 宿主機IP:端口/s16-old-docker 2. 推送到私有倉庫 docker push 宿主機IP:端口/s16-old-docker
經過私有倉庫的api,檢查鏡像數據
能夠經過瀏覽器訪問api數據,http://192.168.15.71:5000/v2/_catalog
此時能夠經過私有倉庫下載公司內部的鏡像
docker pull 宿主機IP:端口/s16-old-docker-heheheheh