這不是本文的重點O(∩_∩)O哈哈~。若是各位看官想了解這些的話能夠看看 這兒。node
阿里雲固然已經有了registry倉庫服務,還挺方便的。可是有的就會以爲這種私有鏡像仍是本身保管比較好啊,咱們這兒說的是本身搭建倉庫用來管理私有鏡像。測試徹底後提交到私有的registry,線上再從registry拉取部署,和阿里雲的registry倉庫服務同樣的使用方式。docker
ubuntu 16.04ubuntu
安裝docker環境這裏不作介紹了,網上不少文章都有介紹。bash
docker pull registry2.2測試
cd ~/;ui
mkdir registry && cd registry && mkdir certs && cd certs;阿里雲
openssl req -x509 -days 3650 -subj '/CN=reg.lajiaochaorou.com/' -nodes -newkey rsa:2048 -keyout registry.key -out registry.crt;加密
其中reg.lajiaochaorou.com是我給這個倉庫定的域名,能夠寫別的。spa
cd ~/registry&& mkdir auth;翻譯
docker run --entrypoint htpasswd registry:2.2 -Bbn lajiaochaorou 123456 > auth/htpasswd;
這裏生成的用戶名密碼就是lajiaochaorou:123456, 能夠寫別的。
mkdir –p ~/data/registry2
docker run -d –p 5000:5000 --restart=always --name registry \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
-v ~/data/registry2:/var/lib/registry registry:2.2
複製代碼
把上面的命令放到腳本start_reg.sh(愛取什麼名隨你),放到~/registry下。 --restart=always表示自啓動。
建立證書目錄:
mkdir -p /etc/docker/certs.d/reg.lajiaochaorou.com:5000
下載證書:
cp ~/registry/certs/registry.crt /etc/docker/certs.d/reg.lajiaochaorou.com:5000
域名解析:
echo 192.168.215.*** reg.lajiaochaorou.com >> /etc/hosts (這裏的ip寫宿主機ip)
登錄registry:
docker login reg.lajiaochaorou.com:5000
按照要求輸入用戶名,密碼(我這裏爲lajiaochaorou:123456)
登陸成功就能夠存放和拉取私有鏡像了!registry搭好了。
咱們在push鏡像到私有倉庫以前,要把鏡像的名稱改爲reg.lajiaochaorou.com:5000/imagename的形式,不然系統認爲你要push到公共倉庫,會提示沒有權限。命令:
docker tag ubuntu reg.lajiaochaorou.com:5000/ubuntu
docker push reg.lajiaochaorou.com:5000/ubuntu
上面是以修改ubuntu鏡像爲例,實際中咱們通常是操做本身的項目鏡像。
執行成功後鏡像被提交到倉庫了。
咱們刪除這個reg.lajiaochaorou.com:5000/ubuntu鏡像試試:
docker rmi reg.lajiaochaorou.com:5000/ubuntu
刪除成功,咱們再把這個鏡像pull下來試試:
docker pull reg.lajiaochaorou.com:5000/ubuntu
下拉成功,咱們運行這個鏡像吧:
docker run –it reg.lajiaochaorou.com:5000/ubuntu
應該有一個僞終端彈出來,這時的文件系統已是這個容器(ubuntu)的文件系統了,所以能夠很方便地對這個容器裏面的文件進行操做。好比:
touch test.c
echo 'hello world' > hello.txt
複製代碼
這時咱們在容器外面執行:
docker diff 容器id|容器名;
能夠看到有添加了兩個文件。
不如趁機提交成一個新的鏡像:
docker commit 容器id|容器名 reg.lajiaochaorou.com:5000/ubuntu2.0(新的鏡像名 )
這時,咱們看一下如今有哪些鏡像:
docker images
能夠看到,一個新的鏡像reg.lajiaochaorou.com:5000/ubuntu2.0產生了!
咱們運行這個新的鏡像:
docker run –it reg.lajiaochaorou.com:5000/ubuntu2.0
僞終端出來以後,咱們ls一下,能夠看到剛纔touch和echo的兩個文件確實在這個文件系統了。
以上就是所有的registry使用方法了, 缺點是,沒有圖片的展現。當時沒有及時截圖,就這樣吧。
docker run: 運行一個容器
-it 一般it兩個參數一塊兒用的,表示以交互模式執行,並分配一個僞終端
-v 掛載目錄,本地目錄:容器目錄
--name 給容器一個名字,不指定就隨機產生
-e 設置環境變量
--rm 容器退出以後就刪除
docker rm: 刪除一個容器
docker rm 容器名|容器id
docker rmi:刪除一個鏡像
docker rmi 鏡像名
docker ps: 查看正在運行的容器
docker ps –a :產看全部容器
docker kill :殺死一個運行中的容器,也能夠用-s參數向容器發送信號
docker stop:結束一個運行中的容器
docker exec : 在運行中的容器執行命令,一般能夠-t分配僞終端達到進入容器的目的
docker commit: 提交一個容器成新的鏡像,能夠-m 給出說明,-a給出做者
docker start: 啓動一個容器
docker inspect: 查看鏡像|容器的元數據
docker build: 編譯一個新的鏡像,與commit功能相似
複製代碼
Dockfile是一種被Docker程序解釋的腳本,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程序將這些Dockerfile指令翻譯真正的Linux命令。這是打包鏡像的主要方式。 命令解釋:
FROM //基於哪一個鏡像
MAINTAINER //建立人
CMD //容器啓動時執行的命令,Dockerfile只能有一條CMD
USER //用哪一個用戶跑container
ENV //設置環境變量
ADD //將文件<src>拷貝到container的文件系統對應的路徑<dest>
COPY //與ADD相似,COPY只能是本地數據
VOLUME //將本地文件夾掛載到container容器中
WORKDIR //切換目錄
複製代碼
例子:
FROM busybox
ENV foo /bar
WORKDIR ${foo} # WORKDIR /bar
ADD . $foo # ADD . /bar
COPY \$foo /quux # COPY $foo /quux
複製代碼
使用命令:
docker build –t ubuntu5.0 .
生成一個新的鏡像,名爲ubuntu5.0,不用-f指定Dockerfile的路徑那麼就是使用的當前目錄的Dockerfile。