以太坊docker鏡像
A. DockerHub里的鏡像太多了,怎麼選擇
目前系統或基礎語言的鏡像選官方的就可以了,多數情況下以他們為 base image 做自己的鏡像。問題就是這些鏡像大多是國外的源下載依賴會很費勁,最好from 之後換一下源。
應用相關的鏡像,很多其實都不能很好滿足需求,都需要自己改,這方面也沒啥太好的辦法,看自己需求了,一般是看他們的 dockerfile 然後把啟動腳本改一下。
official 的鏡像很多並不好用,可以參考一下 tutum 或者 Sameer 感覺他們做的要實用一些
B. docker 鏡像一定是系統嗎
不一定的,你直接拉取系統鏡像,那當然使用這個鏡像創建容器,他就是一個系統,如果使用docker pull下來的成品,那麼你會發現創建後的容器,使用docker attach無法進入容器,很明顯說明這個容器就不是系統。
C. 怎麼製作docker鏡像 有多大
方法/步驟
在使用Docker的過程中,我們除了從Docker Hub上下載已經做好的鏡像,很多時候需要我們自己製作鏡像。下面想在這個文章中說明一下鏡像的製作方法。
製作鏡像的方式主要有兩種:
通過docker commit 製作鏡像
通過docker build 製作鏡像
這兩種方式都是通過改進已有的鏡像來達到自己的目的。製作基礎鏡像,會在另外一篇文章「從零開始製作基礎鏡像」中介紹。
docker commit
docker commit 是往版本控制系統里提交一次變更。使用這種方式製作鏡像,本質上是運行一個基礎鏡像,然後在基礎鏡像上進行軟體安裝和修改。最後再將改動提交到版本系統中。
選擇基礎鏡像
基礎鏡像的選擇要結合自己的需求。可以選擇已有的應用鏡像來改造,也可以選擇Ubuntu,Debian,OpenSuse這類基礎系統鏡像
我們以ubuntu為例子來說明
步驟1:運行ubuntu 鏡像
docker run -i -t ubuntu /bin/bash
步驟2:安裝軟體並修改軟體配置, 比如:安裝apache2
apt-get -yqq update
apt-get -y install apache2
安裝完成後,對apache2進行配置和修改
步驟3:退出docker並保存鏡像
使用「exit」命令退出容器
運行docker comit 命令, 進行保存
docker commit 61412230ae46 own-apache2
docker commit 命令參數說明
命令格式
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS:
-a, --author= 提交的鏡像作者
-c, --change=[] Apply Dockerfile instruction to the created image, 沒用過
-m, --message= 提交時的說明文字
-p, --pause=true 在commit時,將container 暫停
CONTAINER:
可以使用container 的名字或者ID
REPOSITORY
指定鏡像倉庫,上述例子中,指定的是本地存儲
可以指定遠程鏡像倉庫,如docker hub。也可自建倉庫來存放image
TAG:
鏡像TAG
docker build
使用docker build創建鏡像需要編寫Dockerfile.
步驟:
編寫自己的Dcokerfile
運行docker build 命令打包鏡像
仍然以apache打包為例子。以下是Dockerfile的例子
FROM ubuntu:latest
MAINTAINER sky
#Add 163 mirror for apt
ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q --fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/*# Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find "$APACHE_CONFDIR" -type f -exec sed -ri ' \ s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \ s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \' '{}' ';'EXPOSE 80CMD ["apache2", "-DFOREGROUND"]
編輯完成後,在與Dockerfile同一目錄下運行docker build 命令
docker build -t apache-img .
如果沒有命令出錯,docker build會持續運行直到鏡像創建完成
而創建的過程本質上是運行一個鏡像,然後在鏡像中按序執行在Dockerfile中的命令,直到執行結束。
如果中間有命令執行失敗,鏡像創建會停止。這時就需要看log,並修改Dockerfile,然後再次執行docker build
註:兩種鏡像創建方式的對比:
docker commit
docker build
難度相對容易,適合新手和對Linux不熟悉的用戶相對難,要求有一定的linux和腳本基礎知識
文檔化
文檔化在通過其他文件來實現
Dockerfile本身就是比較好的文檔,可讀和可理解性比較強。也可配合其他文檔帶來詳細說明
升級,維護
後續升級和維護麻煩,需要再次運行鏡像並對內部軟體進行升級或者安裝新軟體增加特性
後續升級和維護會相對簡單,可以直接在dockerfile中更改並增加新特性
具體選擇哪種方式來製作鏡像需要結合實際情況來選擇
Dockerfile 關鍵字詳解
FROM
FROM用來指定基礎包。在上面的例子中,基礎包用的是ubuntu。
MAINTAINER
鏡像作者信息,或者維護人員信息
ADD
將文件拷貝到Container內文件系統對應的路徑
格式 ADD <src file> <dst file>
所有拷貝到Container中的文件和文件夾許可權為0755,uid和gid為0
如果需要修改owner用戶或者許可權,需要使用RUN進行修改
ADD文件,文件路徑要在docker build<PATH>中指定的<PATH>下
RUN
創建鏡像時執行
ENV
用來設置環境變數
EXPOSE
Container內部服務開啟的埠
主機上如果要使用,還需要在啟動Container時,做host-container的商品映射
使用EXPOSE後,一些自動化布署工具可以直接讀取這個信息,自動進行埠映射
EXPOSE可以有多條,指定多個埠
WORKDIR
切換工作目錄,可進行多次切換(相當於cd命令)
切換目錄對RUN,CMD,ENTRYPOINT有效
USER
執行container的用戶,如未指定,則默認使用root用戶
ENTRYPOINT
Container啟動時執行的命令,一個Dockerfile中只能有一條ENTRYPOINT
ENTRYPOINT沒有CMD的可替換特性
CMD
Container 啟動時執行的命令,一個Dockerfile 中只能有一條CMD命令,如果有多條則只執行最後一條CMD
如果有多條命令希望在啟動後執行,可以考慮使用shell 腳本
與ENTRYPOINT的區別
CMD的主要用途是為可執行的container提供默認命令
CMD在運行時是可替換的,比如
在ubuntu中,CMD指定的是/bin/bash。默認情況下運行ubuntu,container中的/bin/bash會被執行
如果使用docker run指定運行命令,那CMD會被替換掉
如:docker run ubuntu /bin/echo "this is a echo". 這時,container 啟動後會執行echo 而不是/bin/bash了
ENTRYPOINT是不會替換的,如果在ubuntu鏡像中加入ENTRYPOINT,那ENTRYPOINT在啟動後會先被執行
CMD可以為ENTRYPOINT來提供參數
例子:
FROM ubuntu:14.10
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
VOLUME
語法:VOLUME [PATH]
VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現數據共享或對容器數據的備份、恢復或遷移
可以將本地文件夾或者其他Container的文件夾掛載到Container中
D. docker 鏡像越來越大怎麼辦
看dockerfile:
FROM alpine:latest
MAINTAINER alex [email protected]
RUN apk --update add nginx
COPY . /usr/share/nginx/html
EXPOSE 80
CMD [「nginx」, 「-g」, 「daemon off;」]
極簡化的利用dockerfile和base鏡像和github的特性,能少一句就少一句,動動手試一下,這樣build出來,整個鏡像不超過10M,回過頭來看看前面的鏡像,光一個ubuntu得多大啊,實在是居家必備。
E. docker基礎鏡像是什麼意思
當想讓一個容器做兩件事情,或者使一個Docker鏡像包含來自兩個不同鏡像的依賴庫時,就需要知道每個鏡像的Dockerfile。本文介紹了如何通過docker history命令來對Docker鏡像進行反向工程,得到它們的Dockerfile,並組織到一個Dockerfile里然後build,從而實現想做的事情。
常言道,「不要重復發明輪子!」
在使用Docker時,構建自己的鏡像之前,最好在Docker Hub尋找一些可以直接使用的鏡像做練習。把軟體架構分布到一系列容器中,每一個容器只做一件事情,這樣的效果非常好。構建分布式應用的最好的基石是使用來自Docker Hub的官方鏡像,因為可以信任它們的質量。
在某些情況下,可能想讓一個容器做兩件不同的事情。而在另外一些情況下,可能想讓一個Docker鏡像包含來自兩個不同鏡像的依賴庫。如果有每個鏡像的Dockerfile,這是非常簡單的。將它們組織到一個Dockerfile里然後build就行。
然而,大多數時間都在使用Docker Hub上准備好的鏡像,不會有它們的源Dockerfile。我花時間找一個可以合並(或flatten)兩個不同Docker鏡像的工具,當然沒有它們的Dockerfile。也就是說在找一個能做下面這件事的東西:
image 1 --
\
---> merged_image_12
/
image 2 --
此前在GitHub上有兩個相關的討論(1、2),盡管它們都被關閉了。
這可能嗎?
那麼,是否存在工具能夠像這樣做嗎:docker merge image2 image2 merged_image?
沒有!
你甚至不可以用下面的方式來構建Dockerfile:
FROM image1
FROM image2
簡而言之,在一個Dockerfile里不能有多個基礎鏡像。
但是我需要這個功能!
唯一的解決辦法是取得這些鏡像的Dockerfile,然後把它們組織到一個文件中,再進行構建。那麼,我能在Docker Hub上獲得一個鏡像的Dockerfile嗎? 幸運的是可以。它不能離線獲取(譯註:原文是online,但顯然online時對於來自GitHub的自動構建鏡像是可以直接獲取的),但是你可以使用docker history命令,通過反向工程獲取。
怎麼來使用?
在你的機器上使用docker pull從Docker Hub下載鏡像。
docker pull image1
docker pull image2
然後使用docker history來取得構建這兩個容器時運行的命令。
docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile
接下來打開這兩個文件,你可以看到每個鏡像的命令堆棧。這是因為Docker鏡像通過層(閱讀更多)的方式來構建。即你在Dockerfile中鍵入的每一個命令所構建的新鏡像,都是在之前的命令產生的鏡像之上。所以你可以對鏡像進行逆向工程。
限制
不能對鏡像進行反向工程的唯一場景,是鏡像的維護者在他的Dockerfile中使用了ADD或COPY命令。你會看到這樣一行:
ADD file:1ac56373f7983caf22
或 ADD dir:cf6fe659e9d21535844
這是因為不知道維護者在他自己的機器上,包括鏡像里使用了什麼本地文件。
F. docker鏡像如何實現共享
青雲QingCloud日前宣布推出Docker鏡像倉庫服務。該服務包括Docker公有鏡像倉庫和Harbor私有鏡像倉庫,用戶可以根據需求選擇適合的鏡像倉庫方案。Docker鏡像倉庫的推出,標志著QingCloud容器平台的進一步完善,包含Kubernetes容器編排及管理、Harbor私有鏡像倉庫、Docker公有鏡像倉庫、etcd鍵值存儲服務、SDN網路直通服務等在內的一系列容器應用與服務,並聯合Rancher、希雲等容器領域的合作夥伴,幫助用戶快速進行容器相關的應用開發、部署和升級,大幅降低容器應用的開發和管理門檻。
此次推出的Docker公有鏡像倉庫免費為用戶提供安全可靠、簡單易用、兼容開放的Docker鏡像集中存儲與分發服務,支持創建多個Docker命名空間和多個Docker用戶,靈活地管理用戶的Docker鏡像。Docker公有鏡像倉庫底層基於QingStor對象存儲,為用戶提供海量的鏡像存儲服務。此外,QingCloud還提供Harbor私有鏡像倉庫,便於用戶一鍵部署高可用、高安全、高性能的Docker鏡像倉庫。
青雲QingCloud容器平台是通過QingCloud AppCenter交付的一套完整的容器部署與管理平台,支持多種雲端容器部署方式,並提供鏡像倉庫、調度與編排、服務感知、跨平台管理等容器管理功能。QingCloud 容器平台充分整合了QingCloud IaaS平台的高性能網路及存儲能力,為容器平台提供極致的性能保障,支持企業用戶一鍵部署高可用、高可靠、高性能的容器平台。
青雲QingCloud完整的企業級容器服務平台有如下亮點:
雲平台深度整合:與青雲QingCloud雲平台深度集成,充分整合QingCloud IaaS底層的SDS(軟體定義存儲)與SDN(軟體定義網路)能力,提供SDN網路直通及存儲持久化方案,為容器運行環境提供極致的網路及存儲性能支持。
一鍵部署、輕量運維:應用通過QingCloud AppCenter框架交付,一鍵完成部署,持續升級,提供創建、擴容、健康監測、用戶管理等應用全生命周期管理功能,並提供完善的服務監控及日誌功能,是實踐DevOps的絕佳之路。
兼容與開放:QingCloud Kubernetes容器服務完全兼容原生API語法,將用戶的學習和遷移成本降至最低,基於Kubernetes開發的原生應用也可以無縫遷移至QingCloud平台。
統一架構:QingCloud IaaS實現了在同一套技術架構下對虛擬主機、物理主機(Bare Metal Service)和容器進行統一的管理和運維,三者之間可以在統一的網路和存儲環境下實現無縫互通及共享資源,避免了系統的割裂。
青雲QingCloud CTO甘泉表示,結合QingCloud在IaaS和AppCenter上的技術優勢,QingCloud推出的容器平台能夠為企業級用戶提供一鍵部署、彈性伸縮、極致性能的容器服務,為用戶輕松構建Docker服務、DevOps平台及微服務架構提供技術平台支持。未來,QingCloud將深度參與各類容器開源項目,聯合更多容器領域合作夥伴,為用戶提供一站式的容器平台服務。
G. docker 怎麼從鏡像倉庫獲取鏡像
配置docker的啟動參數。
執行:
# systemctl status docker 1
可以看出,這里在執行docker pull的時候不需要帶上本地鏡像倉庫的地址,直接會自動從本地鏡像倉庫拉取。
H. docker怎麼查看容器使用的鏡像
Docker容器運行後,如何進入容器進行操作呢?起初我是用SSH。如果只啟動一個容器,用SSH還能應付,只需要將容器的22埠映射到本機的一個埠即可。當我啟動了五個容器後,每個容器默認是沒有配置SSHServer的,安裝配置SSHD,映射容器SSH埠,實在是麻煩。我發現很多Docker鏡像都是沒有安裝SSHD服務的,難道有其他方法進入Docker容器?有很多種方法,包括使用dockerattach命令或nsenter工具等。使用attach命令有時候並不方便。當多個窗口同時attach到同一個容器的時候,所有窗口都會同步顯示。nsenter可以訪問另一個進程的名字空間。為了連接到容器,你還需要找到容器的第一個進程的PID,可以通過下面的命令獲取。
I. docker鏡像和虛擬機鏡像有區別嗎
docker centos 和 ubuntu 鏡像的區別Docker是基於鏡像的。鏡像類似於已經包含了文件、配置和安裝好的程序的虛擬機鏡像。同樣的,你可以像啟動虛擬機一樣啟動多個鏡像實例。運行中的鏡像稱為容器。你可以修改容器(比如刪除一個文件),但這些修改不會影響到鏡像。不過,你使用docke...