鏡像是建立容器的基礎,鏡像能夠從官方的docker hub上下載,能夠在一些第三方鏡像倉庫服務器上下載現成的,同時,也能夠根據用戶的須要自定義鏡像;最經常使用的鏡像生成途徑有兩種:基於容器製做和dockerfile。html
現有容器作好修改後提交修改就建立了新的鏡像,busybox能夠當作是一個簡易版的linux系統 ,內建了不少命令,咱們能夠基於busybox定製鏡像node
docker container run --name b1 -it busybox
/ # mkdir -p /data/html / # echo "<h1>hello docker</h1>" > /data/html/index.html
docker commit -p b1
docker tag 87c118fcb55b jym/httpd:v0.1 docker tag jym/httpd:v0.1 jym/httpd:latest
Ps:新的鏡像存在本地,未上傳至倉庫,新的鏡像有兩個標籤,刪除其中一個標籤鏡像依然存在,只是刪除鏡像的一個引用。linux
製做鏡像時修改CMDnginx
docker commit -a "eric <jym199467@qq.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 jym/httpd:v0.2
docker container run --name t1 jym/httpd:v0.2
[root@node ~]# docker container inspect t1 | grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", "IPAddress": "172.17.0.3", [root@node ~]# curl 172.17.0.3 <h1>hello docker</h1>
Dockerfile 是一個文本格式的配置文件,用戶可使用dockerfile快速建立自定義的鏡像
基本格式爲docker build [options] dockerfile_path 該命令將讀取指定路徑下的Dockerfile,並將該路徑下全部內容發送給Docker服務端,由服務端來建立鏡像。所以通常建議放置Dockerfile的目錄只存放Dockerfile文件。
示例:自定義一個nginx服務c++
一、下載nginx文件與dockerfile文件放在同一目錄 [root@node1 docker-img]# ls Dockerfile nginx-1.15.12.tar.gz 二、編輯Dockerfile文件 #base image FROM centos #maintainer info LABEL maintainer="eric <jia199467@qq.com>" #mount a dir to container VOLUME ["/data"] #Download the source package from the url and put it in the directory of the container. ADD nginx-1.15.12.tar.gz /usr/local/src/ #RUN is used to specify the program running during the docker build process, which can be any command RUN yum install -y gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openssl-devel && groupadd -r nginx && useradd -r -g nginx nginx #Change working directory WORKDIR /usr/local/src/nginx-1.15.12 #Compile and install RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-pcre && make && make install #Add environment variables ENV PATH /usr/local/nginx/sbin:$PATH #Exposing port EXPOSE 80/tcp #Specify a default run program for the container ENTRYPOINT ["nginx"] CMD ["-g","daemon off;"] 三、生成鏡像 docker build -t myweb:v1.0 ./ 四、運行鏡像 docker run -d -p 8000:80 -v /home/jym/data:/data --name web1 myweb:v1.0
驗證:訪問主機的8000端口
git
基於Dockerfile文件生成鏡像的示例中,有一行行命令語句組成,其中,註釋行以#開頭,Dockerfile 文件的非註釋行的第一行要指定基於的基礎鏡像。Dockerfile 文件每一條命令都會建立一層image layer,因此Dockerfile文件儘可能以最少的命令完成全部事。
經常使用命令語句:github
FROM指令必須爲dockerfile文件開篇的第一個非註釋行,用於爲鏡像文件構建過程指定基準鏡像,若是須要建立多個鏡像時,可使用多個FROM指令,後續指令運行於此基準鏡像所提供的運行環境
實踐中,基準鏡像能夠是任何可用鏡像文件,默認狀況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從docker hub registry上拉取所需的鏡像文件;若是仍是沒找到,docker build會返回一個錯誤信息。web
格式: FROM <repository>[:<tag>]:標籤可省略,缺省爲latest FROM <repository>@<digest>:指明鏡像的哈希碼,比鏡像名更安全 示例:FROM centos
用於讓用戶爲鏡像指定各種元數據
LABEL指令以key-value鍵值對形式定義 docker
格式: LABEL <key>=<value> <key>=<value> <key>=<value> … 示例:LABEL maintainer="eric <jia199467@qq.com>"
複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在時,會自動建立。json
格式: COPY <src> …<dest> 或 COPY ["<src>",…"<dest>"] <src>:要複製的源文件或目錄,支持使用通配符 <dest>:目標路徑,即正在建立的image的文件系統路徑;建議爲<dest>使用絕對路徑,不然,COPY指定則以WORKDIR爲其起始路徑; 注意:在路徑中有空白字符時,一般使用第二種格式
複製本地主機的<src>到容器中的<dest>。其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄);也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄)。
格式: ADD <src> .<dest> 或 ADD ["<src>",. "<dest>"] 示例: ADD nginx-1.15.12.tar.gz /usr/local/src/
操做準則
• 同COPY指令
• 若是<src>爲URL且<dest>不以/結尾,則<src>指定的文件將被下載並直接被 建立爲<dest>;若是<dest>以/結尾,則文件名URL指定的文件將被直接下載 並保存爲<dest>/<filename>
• 若是<src>是一個本地系統上的壓縮格式的tar文件,它將被展開爲一個目錄 ,其行爲相似於「tar -x」命令;然而,經過URL獲取到的tar文件將不會自動 展開;
• 若是<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結 尾的目錄路徑;若是<dest>不以/結尾,則其被視做一個普通文件,<src>的內 容將被直接寫入到<dest>;
爲後續的RUN、CMD、ENTRYPOINT指令配置工做目錄,可使用多個WORKDIR指令。後續指令若是參數是相對路徑,則會基於以前命令指定的路徑
格式:WORKDIR /path/to/workdir 示例:WORKDIR /usr/local/src
注意:後續指令若是參數是相對路徑,則會基於以前命令指定的路徑
用於在image中建立一個掛載點目錄,以掛載Docker host上的卷或其餘容器上的卷
格式: VOLUME <mountpoint>或 VOLUME ["<mountpoint>"] 示例:VOLUME ["/data"]
注意:若是掛載點目錄路徑下存在文件,docker run命令會在卷掛載完成後將此前的全部文件複製到新掛載的卷中
用於爲容器打開指定要監聽的端口以實現與外部通訊
格式: EXPOSE <port>[/<protcol>] [<port>[/<protcol>] …] <protcol>用於指定傳輸層協議,可爲tcp或udp兩者之一,默認爲TCP協議 示例:EXPOSE 80/tcp 443/tcp
注意:在啓動容器時須要經過-P,Docker主機會自動分配一個端口轉發到指定的端口;使用-p,則能夠具體指定哪一個本地端口映射過來
用於爲鏡像定義所需的環境變量,可被Dockerfile文件中位於其後的其它指令(如ENV,ADD,COPY等)所調用,並在容器運行時保持。
調用格式:$variable_name或${variable_name} 格式: ENV <key> <value> <key>以後的全部內容均會被視做其<value>的組成部分 ,所以,一次只能設置一個變量; ENV <key>=<value>…
可用一次設置多個變量,每一個變量爲一個"<key>=<value>"的 鍵值對,若是<value>中包含空格,能夠反斜線(\)進行轉義,也可經過 對<value>加引號進行標識;另外,反斜線也可用於續行;
注意:定義多個變量時,建議使用第二種方式,以便在同一層中完成全部功能;在建立鏡像(build)時,能夠經過-e,來傳遞變量
用於指定docker build過程當中運行的程序,其能夠是任何命令
格式: RUN <command> 第一種格式中,<comand>一般是一個shel命令,且以「/bin/sh -c」來運行它, 這意味着此進程在容器中的PID不爲1,不能接收Unix信號,所以,當使用 docker stop <container>命令中止容器時,此進程接收不到SIGTERM信號; RUN ["<executable>","<param1>","<param2>"] 第二種語法格式中的參數是一個JSON格式的數組,其中<excutable>爲要運行的 命令,後面的<parmN>爲傳遞給命令的選項或參數;然而,此種格式指定的命 令不會以「/bin/sh -c」來發起,所以常見的shel操做如變量替換以及通配符(?,* 等)替換將不會進行;不過,若是要運行的命令依賴於此shel特性的話,能夠將 其替換爲相似以下格式: RUN ["/bin/bash", -c", <excutable>", <parm1>"]
相似於RUN指令,CMD指令也可用於運行任何命令或應用程序, 不過,兩者的運行時間點不一樣
• RUN指令運行於映像文件構建過程當中,而CMD指令運行於基於Dockerfile構建出的新映像文件啓動一個容器時
• CMD指令的首要目的在於爲啓動的容器指定默認要運行的程序,且其運行結束後,容器也將終止;不過,CMD指定的命令其能夠被docker run的命令行選項所覆蓋
• 在Dockerfile中能夠存在多個CMD指令,但僅最後一個會生效
• RUN和CMD指令指定的命令必須是基礎鏡像中有的命令
格式: CMD <comand> CMD [「<excutable>」 , 「<parm1>」 , 「<parm2>」] CMD ["<parm1>",<parm2>"] 前兩種語法格式的意義同RUN 第三種則用於爲ENTRYPOINT指令提供默認參數
相似CMD指令的功能,用於爲容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序
與CMD不一樣的是,由ENTRYPOINT啓動的程序不會被docker run命令行指定的參數所覆蓋,並且,這些命令行參數會被看成參數傳 遞給ENTRYPOINT指定指定的程序
不過,docker run命令的-entrypoint選項的參數可覆蓋ENTRYPOINT指令指定的程序
格式: ENTRYPOINT <comand> ENTRYPOINT ["<excutable>", <parm1>", <parm2>"]
docker run命令傳入的命令參數會覆蓋CMD指令的內容而且附加到 ENTRYPOINT命令最後作爲其參數使用
Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅有最後一個會生效
用於指定運行image時的或運行Dockerfile中任何RUN、CMD或 ENTRYPOINT指令指定的程序時的用戶名或UID,默認狀況下,container的運行身份爲root用戶
格式: USER <UID>|<UserName>
注意:<UID>能夠爲任意數字,但實踐中其必須爲/etc/paswd中 某用戶的有效UID,不然,docker un命令將運行失敗
將自定義鏡像上傳至docker hub
docker login -u 614949750 -p ***
按照要上傳的註冊服務器的要求打上標籤 [root@node ~]# docker tag myweb:v1.0 614949750/mynginx:v1.0 上傳鏡像 [root@node ~]# docker push 614949750/mynginx:v1.0
Docker hub是docker官方的registry,是存放docker倉庫的的具體服務器,容許用戶註冊,上傳本身的鏡像到docker hub上;對與服務器在國內的用戶來講,將線上的鏡像放在docker hub上限於網速,效率低下;對於使用阿里雲vps環境的用戶來講,將鏡像放在阿里雲的registry上到是個明智的選擇;那麼,對於未使用雲服務器的用戶來講,搭建私有倉庫是很是好的選擇。
Harbor就是一個開源的企業級docker registry服務器,其功能強大,社區活躍,版本穩定更新。下面是引自 harbor github:https://github.com/goharbor/harbor 上對於harbor的功能介紹:
• 基於角色的訪問控制:用戶和鏡像倉庫經過「項目」進行阻止,用戶對一個項目下的多個鏡像擁有不一樣的權限
• 基於策略的鏡像複製:鏡像能夠在多個Registry實例中複製(同步)。尤爲適合於負載均衡,高可用,混合雲和多雲的場景
• 漏洞掃描:Harbor按期掃描鏡像並向用戶告警
• LDAP / AD支持:Harbor與現有企業LDAP / AD集成以進行用戶身份驗證和管理,並支持將LDAP組導入Harbor併爲其分配適當的項目角色。
• 鏡像刪除和垃圾收集:能夠刪除鏡像,並能夠回收它們的空間
• 公證制度:使用公證人制度確保鏡像的真實性
• ui界面:提供ui界面使用戶瀏覽,檢索當前Docker鏡像倉庫,管理項目
• 審計:用戶對鏡像倉庫的操做都被記錄,便與審計
• RESTful API:適用於大多數管理操做的RESTful API,易於與外部系統集成
• 易安裝:提供在線和離線安裝程序。
Docker-ce repo文件下載:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo 配置好yum源,直接yum安裝docker-ce
Docker-compose收錄在epel源 yum install epel-release.noarch yum install docker-compose
yum install openssl
harbor下載地址:https://github.com/goharbor/harbor/releases
在線和離線兩種,本文下載的是離線wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.5.tgz
tar xzvf harbor-offline-installer-v1.7.5.tgz -C /usr/local/ cat harbor.cfg |grep hostname hostname = 192.168.143.130
systemctl start docker.service
./install.sh 共有五步: [Step 0]: checking installation environment … [Step 1]: loading Harbor images ... [Step 2]: preparing environment … [Step 3]: checking existing instance of Harbor … [Step 4]: starting Harbor ...
docker-compose start
配置文件默認配置端口爲80, ui用戶名密碼是admin/Harbor12345
項目:新增/刪除項目,查看鏡像倉庫,給項目添加成員、查看操做日誌、複製項目等
日誌:倉庫各個鏡像create、push、pull等操做日誌
系統管理
用戶管理:新增/刪除用戶、設置管理員等
複製管理:新增/刪除從庫目標、新建/刪除/啓停複製規則等
配置管理:認證模式、複製、郵箱設置、系統設置等
其餘設置
用戶設置:修改用戶名、郵箱、名稱信息
修改密碼:修改用戶密碼
docker默認使用https方式鏈接鏡像倉庫服務器,而harbor默認使用http方式鏈接,因此配置docker使用http方式鏈接。
vim /etc/docker/daemon.json 添加一條配置 "insecure-registries":["192.168.143.130"] 重啓docker服務 systemctl restart docker.service
[root@node1 harbor]# docker login 192.168.143.130 Username: admin Password:
目前已有一個公開項目library,咱們能夠向項目中推送鏡像
[root@node1 harbor]# docker tag minio/minio 192.168.143.130/library/minio:latest [root@node1 harbor]# docker push 192.168.143.130/library/minio:latest
yum install docker-registry
/etc/docker-distribution/registry/config.yml version: 0.1 log: fields: service: registry storage: cache: layerinfo: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000
systemctl start docker-distribution.service
vim /etc/docker/daemon.json { "insecure-registries":["192.168.143.130:5000"] } systemctl restart docker
docker tag myweb:v1.0 192.168.143.130:5000/myweb:v1.0 docker push 192.168.143.130:5000/myweb:v1.0
參考文章:
馬哥docker.pdf
docker docs:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
Harbor docs: https://goharbor.io/docs/
Harbor github: https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md