Docker初學乍練之鏡像相關

1、自定義docker image

鏡像是建立容器的基礎,鏡像能夠從官方的docker hub上下載,能夠在一些第三方鏡像倉庫服務器上下載現成的,同時,也能夠根據用戶的須要自定義鏡像;最經常使用的鏡像生成途徑有兩種:基於容器製做和dockerfile。html

1.一、基於容器製做鏡像

現有容器作好修改後提交修改就建立了新的鏡像,busybox能夠當作是一個簡易版的linux系統 ,內建了不少命令,咱們能夠基於busybox定製鏡像node

1.1.一、開啓一個鏡像

docker container run --name b1 -it busybox

1.1.二、改變鏡像

/ # mkdir -p /data/html
/ # echo "<h1>hello docker</h1>" > /data/html/index.html

1.1.三、提交鏡像

docker commit -p b1

1.1.四、爲新鏡像打標籤(docker ps查看新鏡像ID)

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

1.1.五、運行容器

docker container run  --name t1  jym/httpd:v0.2

1.1.六、訪問httpd

[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>

1.二、基於Dockerfile製做鏡像

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端口
Docker初學乍練之鏡像相關git

2、Dockerfile文件詳解

基於Dockerfile文件生成鏡像的示例中,有一行行命令語句組成,其中,註釋行以#開頭,Dockerfile 文件的非註釋行的第一行要指定基於的基礎鏡像。Dockerfile 文件每一條命令都會建立一層image layer,因此Dockerfile文件儘可能以最少的命令完成全部事。
經常使用命令語句:github

2.一、FROM

FROM指令必須爲dockerfile文件開篇的第一個非註釋行,用於爲鏡像文件構建過程指定基準鏡像,若是須要建立多個鏡像時,可使用多個FROM指令,後續指令運行於此基準鏡像所提供的運行環境
實踐中,基準鏡像能夠是任何可用鏡像文件,默認狀況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從docker hub registry上拉取所需的鏡像文件;若是仍是沒找到,docker build會返回一個錯誤信息。web

格式:
    FROM <repository>[:<tag>]:標籤可省略,缺省爲latest
    FROM <repository>@<digest>:指明鏡像的哈希碼,比鏡像名更安全
示例:FROM centos

2.二、LABEL

用於讓用戶爲鏡像指定各種元數據
LABEL指令以key-value鍵值對形式定義 docker

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> …
示例:LABEL maintainer="eric <jia199467@qq.com>"

2.三、COPY

複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在時,會自動建立。json

格式:
    COPY <src> …<dest> 或 COPY ["<src>",…"<dest>"]
        <src>:要複製的源文件或目錄,支持使用通配符
        <dest>:目標路徑,即正在建立的image的文件系統路徑;建議爲<dest>使用絕對路徑,不然,COPY指定則以WORKDIR爲其起始路徑;
    注意:在路徑中有空白字符時,一般使用第二種格式

2.四、ADD

複製本地主機的<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>;

2.五、WORKDIR

爲後續的RUN、CMD、ENTRYPOINT指令配置工做目錄,可使用多個WORKDIR指令。後續指令若是參數是相對路徑,則會基於以前命令指定的路徑

格式:WORKDIR /path/to/workdir
示例:WORKDIR /usr/local/src

注意:後續指令若是參數是相對路徑,則會基於以前命令指定的路徑

2.六、VOLUME

用於在image中建立一個掛載點目錄,以掛載Docker host上的卷或其餘容器上的卷

格式:
    VOLUME <mountpoint>或 VOLUME ["<mountpoint>"]
示例:VOLUME ["/data"]

注意:若是掛載點目錄路徑下存在文件,docker run命令會在卷掛載完成後將此前的全部文件複製到新掛載的卷中

2.七、EXPOSE

用於爲容器打開指定要監聽的端口以實現與外部通訊

格式:
    EXPOSE <port>[/<protcol>] [<port>[/<protcol>] …]
    <protcol>用於指定傳輸層協議,可爲tcp或udp兩者之一,默認爲TCP協議

示例:EXPOSE 80/tcp 443/tcp

注意:在啓動容器時須要經過-P,Docker主機會自動分配一個端口轉發到指定的端口;使用-p,則能夠具體指定哪一個本地端口映射過來

2.八、ENV

用於爲鏡像定義所需的環境變量,可被Dockerfile文件中位於其後的其它指令(如ENV,ADD,COPY等)所調用,並在容器運行時保持。

調用格式:$variable_name或${variable_name}
格式:
    ENV <key> <value>
    <key>以後的全部內容均會被視做其<value>的組成部分 ,所以,一次只能設置一個變量;
    ENV <key>=<value>…
可用一次設置多個變量,每一個變量爲一個"<key>=<value>"的 鍵值對,若是<value>中包含空格,能夠反斜線(\)進行轉義,也可經過 對<value>加引號進行標識;另外,反斜線也可用於續行;

注意:定義多個變量時,建議使用第二種方式,以便在同一層中完成全部功能;在建立鏡像(build)時,能夠經過-e,來傳遞變量

2.九、RUN

用於指定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>"]

2.十、CMD

相似於RUN指令,CMD指令也可用於運行任何命令或應用程序, 不過,兩者的運行時間點不一樣
• RUN指令運行於映像文件構建過程當中,而CMD指令運行於基於Dockerfile構建出的新映像文件啓動一個容器時
• CMD指令的首要目的在於爲啓動的容器指定默認要運行的程序,且其運行結束後,容器也將終止;不過,CMD指定的命令其能夠被docker run的命令行選項所覆蓋
• 在Dockerfile中能夠存在多個CMD指令,但僅最後一個會生效
• RUN和CMD指令指定的命令必須是基礎鏡像中有的命令

格式:
    CMD <comand> 
    CMD [「<excutable>」 , 「<parm1>」 , 「<parm2>」] 
    CMD ["<parm1>",<parm2>"] 
    前兩種語法格式的意義同RUN 
第三種則用於爲ENTRYPOINT指令提供默認參數

2.十一、ENTRYPOINT

相似CMD指令的功能,用於爲容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序
與CMD不一樣的是,由ENTRYPOINT啓動的程序不會被docker run命令行指定的參數所覆蓋,並且,這些命令行參數會被看成參數傳 遞給ENTRYPOINT指定指定的程序
不過,docker run命令的-entrypoint選項的參數可覆蓋ENTRYPOINT指令指定的程序

格式:
ENTRYPOINT <comand> 
ENTRYPOINT ["<excutable>", <parm1>", <parm2>"]

docker run命令傳入的命令參數會覆蓋CMD指令的內容而且附加到 ENTRYPOINT命令最後作爲其參數使用
Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅有最後一個會生效

2.十二、USER

用於指定運行image時的或運行Dockerfile中任何RUN、CMD或 ENTRYPOINT指令指定的程序時的用戶名或UID,默認狀況下,container的運行身份爲root用戶

格式:
USER <UID>|<UserName>

注意:<UID>能夠爲任意數字,但實踐中其必須爲/etc/paswd中 某用戶的有效UID,不然,docker un命令將運行失敗

3、Docker Registry

將自定義鏡像上傳至docker hub

3.一、註冊docker hub帳號

https://cloud.docker.com

3.二、登錄docker hub

docker login -u 614949750 -p ***

3.三、將鏡像推送到docker hub

按照要上傳的註冊服務器的要求打上標籤
[root@node ~]# docker tag myweb:v1.0 614949750/mynginx:v1.0
上傳鏡像
[root@node ~]# docker push 614949750/mynginx:v1.0

4、Docker 私有 registry之harbor

4.一、harbor簡介

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,易於與外部系統集成
• 易安裝:提供在線和離線安裝程序。

4.二、安裝前準備

4.2.一、安裝docker-ce

Docker-ce repo文件下載:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
配置好yum源,直接yum安裝docker-ce

4.2.二、安裝docker-compose

Docker-compose收錄在epel源
yum install epel-release.noarch 
yum install docker-compose

4.2.三、安裝openssl

yum install openssl

4.三、安裝

harbor下載地址:https://github.com/goharbor/harbor/releases

4.3.一、下載對應的安裝包

在線和離線兩種,本文下載的是離線
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.5.tgz

4.3.二、解壓並修改配置文件

tar xzvf harbor-offline-installer-v1.7.5.tgz -C /usr/local/
cat  harbor.cfg |grep hostname
hostname = 192.168.143.130

4.3.三、啓動docker

systemctl start docker.service

4.3.四、安裝harbor

./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 ...

4.3.五、啓動harbor容器

docker-compose start

4.3.六、訪問ui

配置文件默認配置端口爲80, ui用戶名密碼是admin/Harbor12345
Docker初學乍練之鏡像相關
Docker初學乍練之鏡像相關

項目:新增/刪除項目,查看鏡像倉庫,給項目添加成員、查看操做日誌、複製項目等
日誌:倉庫各個鏡像create、push、pull等操做日誌
系統管理
用戶管理:新增/刪除用戶、設置管理員等
複製管理:新增/刪除從庫目標、新建/刪除/啓停複製規則等
配置管理:認證模式、複製、郵箱設置、系統設置等
其餘設置
用戶設置:修改用戶名、郵箱、名稱信息
修改密碼:修改用戶密碼

4.3.七、修改docker配置文件

docker默認使用https方式鏈接鏡像倉庫服務器,而harbor默認使用http方式鏈接,因此配置docker使用http方式鏈接。

vim /etc/docker/daemon.json
添加一條配置 "insecure-registries":["192.168.143.130"]
重啓docker服務
systemctl restart docker.service

4.3.八、登錄harbor

[root@node1 harbor]# docker login 192.168.143.130
Username: admin
Password:

4.3.九、修改標籤&上傳鏡像

目前已有一個公開項目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

Docker初學乍練之鏡像相關

5、Docker 私有 registry之docker-distribution

5.一、安裝

yum install docker-registry

5.二、配置文件

/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

5.三、啓動

systemctl start docker-distribution.service

5.四、修改docker配置文件

vim /etc/docker/daemon.json
{
    "insecure-registries":["192.168.143.130:5000"]
}
systemctl restart docker

5.五、修改標籤&上傳鏡像

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

相關文章
相關標籤/搜索