概要
眾所周知,Docker是當前非常火的虛擬化容器技術,對於它的優勢以及使用場景網上的資料非常多,這里我推薦大家去這個網站去學習了解docker(點我即可)。
我這里就寫一下作為一名后端開發程序員,自己學習docker的筆記以及對docker在實際工作中的應用。
開發->測試->運維的傳統環境配置問題
一開始之所以不介紹docker的安裝、語法等基礎知識點,是因為在實際工作中,作為一名后端開發者,我們不僅要扎實自己代碼與邏輯的基本功,更要弄清楚自己的工作在整個項目流程中所處的位置、跟整個項目負責其他工作的同事協同合作,確保項目從開發到測試再到上線的順利進行。
環境配置帶來的問題
在虛擬化技術出現之前,阻擋在開發、測試與運維之間的一道橫坎兒便是“環境配置”了,每台計算機的環境都不相同,應該如何確保自己的程序換一台機器能運行起來呢?
為了讓同一程序在不同的機器上跑起來,用戶必須確保的是:
- 操作系統的相同
- 各種平台庫和組件的安裝
- 例如python依賴包,環境變量等
如果一些低版本的依賴模塊和當前環境不兼容,那就頭疼了!
環境配置確實是個痛苦的過程,如果實際中換一台機器,就得重新配置一下,那么在安裝軟件的時候,就得按照原始環境一模一樣的復制過來。
網上有一個段子,對這個現象描述的十分生動:
然而,開發和運維之間聊天一般是這樣的~
虛擬化技術解決環境配置的問題
為了解決類似這種問題,聰明的人們發明了虛擬化技術。
其實就是為每種開發運行環境配置對應的開發環境,開發做完后將環境遷移到測試工程師那里,測試完畢后再將同一套環境遷移到實際的生產環境中給運維工程師去維護。
虛擬化技術分為兩種:一種是虛擬機,另外一種就是本文要介紹的docker虛擬化容器技術。
docker相比於虛擬機確實有十分強大的優勢,下表就是docker與傳統的虛擬機的性能對比:
下面是網上對於docker容器的優勢的詮釋:
更高效的利用系統資源
由於容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統 資源的利用率更高。
無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳 統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運 行更多數量的應用。
更快速的啟動時間
傳統的虛擬機技術啟動應用服務往往需要數分鍾,而 Docker 容器應用,由於直接 運行於宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟 動時間。大大的節約了開發、測試、部署的時間。
一致的運行環境
開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環 境不一致,導致有些 bug 並未在開發過程中被發現。
而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼 在我機器上沒問題啊” 這類問題。
持續交付和部署 對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意 地方正常運行。 使用 Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員 可以通過 Dockerfile 來進行鏡像構建,並結合 持續集成(Continuous Integration) 系 統進行集成測試, 而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。 而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環 境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。
更輕松的遷移
由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在 很多平台上運行,無論是物理機、虛擬機、公有雲、私有雲,甚至是筆記本,其運 行結果是一致的。
因此用戶可以很輕易的將在一個平台上運行的應用,遷移到另一 個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況。
開發->測試->運維基於docker的高效協作流程
有了docker后,開發、測試與運維之間不會再為環境配置而浪費不必要的時間了,我們可以把更多的精力放在自己本身的技術工作中!
下圖簡單的詮釋了利用dockerhub(docker鏡像的遠程存儲倉庫)與github程序員、測試員與運維人員之間的協作關系:
docker的三大概念
docker的三大概念是:
- 鏡像 image
- 容器 container
- 倉庫 repository
docker的整個生命周期就是這三個概念。
鏡像image
Docker鏡像就是一個只讀的模板。
例如:一個鏡像可以包含一個完整的CentOS操作系統環境,里面僅安裝了Apache或用戶需要的其他應用程序。
鏡像可以用來創建Docker容器。
Docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。
image的分層存儲
因為鏡像包含完整的root文件系統,體積是非常龐大的,因此docker在設計時按照Union FS的技術,將其設計為分層存儲的架構。
鏡像不是ISO那種完整的打包文件,鏡像只是一個虛擬的概念,他不是一個完整的文件,而是由一組文件組成,或者多組文件系統聯合組成。
容器container
image和container的關系,就像面向對象程序設計中的 類和實例一樣,鏡像是靜態的定義(class),容器是鏡像運行時的實體(object)。
容器可以被創建、啟動、停止、刪除、暫停
Docker利用容器來運行應用。 容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平台。 可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。 注意:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。
倉庫repository
倉庫是集中存放鏡像文件的場所。有時候把倉庫和倉庫注冊服務器(Registry)混為一談,並不嚴格區分。實際上,倉庫注冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,可以提供大陸用戶更穩定快讀的訪問。
當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下載在另外一台機器上使用這個鏡像時候,只需需要從倉庫上pull下來就可以了。
注意:Docker倉庫的概念跟Git類似,注冊服務器可以理解為GitHub這樣的托管服務。
docker Registry
Docker Registry公開服務是開放給用戶使用、允許用戶管理鏡像的Registry服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。
最常使用的Registry公開服務是官方的Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。
除此以外,還有CoreOS的Quay.io,CoreOS相關的鏡像存儲在這里;Google的Google Container Registry,Kubernetes的鏡像使用的就是這個服務。
由於某些原因,在國內訪問這些服務可能會比較慢。
國內的一些雲服務商提供了針對Docker Hub的鏡像服務(Registry Mirror),這些鏡像服務被稱為加速器。常見的有阿里雲加速器、DaoCloud加速器、靈雀雲加速器等。
使用加速器會直接從國內的地址下載Docker Hub的鏡像,比直接從官方網站下載速度會提高很多。在后面的章節中會有進一步如何配置加速器的講解。
國內也有一些雲服務商提供類似於Docker Hub的公開服務。比如時速雲鏡像倉庫、網易雲鏡像服務、DaoCloud鏡像市場、阿里雲鏡像庫等。
centos7中安裝docker
推薦遵循官方的安裝方式
官方的安裝方式:
1.卸載舊版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 2.設置存儲庫 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安裝docker社區版 sudo yum install docker-ce
4.啟動關閉docker systemctl start docker
如果你的網速不是很快,也可以用yum源安裝(注意提前配置好阿里雲的yum源!)
配置阿里雲的yum源參考我的這篇博客:https://www.cnblogs.com/paulwhw/p/11122400.html
yum install docker -y
docker版本
Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫為 CE)和企業版(Enterprise Edition,縮寫為 EE)。
企業版包含了一些收費服務,個人開發者一般用不到。本文的介紹都針對社區版。
系統環境支持
docker最低支持centos7且在64位平台上,內核版本在3.10以上 [root@oldboy_python ~ 10:48:11]#uname -r 3.10.0-693.el7.x86_64
配置docker加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
這個命令是修改/etc/docker/daemon.json文件,寫入一個json數據如下:
[root@s20 ~]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
注意這里有一個坑:
運行完加速命令后,會提示你restart docker,然后,你在重啟docker的時候可能會報錯:
這條錯誤的出現,原因其實是在執行加速命令的時候,上面的那個json文件多了一個逗號~
把文件中的那個逗號刪除,然后保存退出后再執行 systemctl restart docker 就可以了~
配置好docker加速器的目的是提高下載docker鏡像的速度!
下載centos的docker鏡像
當然你也可以下載ubuntu的鏡像,我們先拿centos的鏡像來舉例:
docker pull centos
運行docker容器
我們可以吧docker的鏡像比作是面向對象的類,而docker容器就是這個“類”實例化出的對象!
查看docker鏡像的命令為:
# 查看鏡像 docker images
通過鏡像運行出容器實例的命令為:
docker run 鏡像名/鏡像id
查看容器的命令如下:
#查看正在運行的容器進程 docker ps #顯示所有運行過的容器進程(正在運行的,以及掛掉的容器進程) docker ps -a #同上,是舊的命令 docker container ls -a
進行docker容器的管理
管理docker鏡像對於程序開發者來說十分重要,我這里單獨拿出一個篇幅去詳細介紹docker容器的管理!
docker容器的管理
注意以下3點:
# docker容器中必須有進程在后台運行,否則容器掛掉!!! # docker鏡像每次運行 都會生成新的容器id記錄 # 運行三次同一個鏡像,會出現三次容器新的記錄 docker run hello-world docker run hello-world docker run hello-world
常用命令
##獲取鏡像 (1) docker pull centos #下載docker鏡像 centos docker pull hello-world #獲取一個hello-world鏡像
(2)從指定的地點pull docker pull 192.168.16.142:5000/s20-hello-world docker pull yuchao163/centos-entrypoint-exec ##查看所有的docker鏡像 docker images 或者 docker image ls ##查看正在運行的docker實例 docker ps ##查看所有的docker實例 docker ps -a ##運行一個交互式的ubuntu容器實例 ##參數解釋 -i 交互式的命令操作 -t 開啟一個終端界面 /bin/bash 指定linux的解釋器 docker run -it ubuntu /bin/bash ##交互式的運行一個centos容器 docker run -it centos /bin/bash ##獲取一個python的flask的鏡像 ## docker run的特點是,如果鏡像不存在,會自動的先去docker pull docker run -d -P training/webapp python app.py -d 后台運行 -P 端口映射,隨機映射 training/webapp 鏡像名 python app.py 你要執行的命令 ##刪除容器id記錄,只能刪除掛掉的容器 docker rm 容器id
#刪除本地docker鏡像
docker rmi 鏡像id或者鏡像名
#強制刪除鏡像文件
docker rmi -f 鏡像id
##批量刪除掛掉的容器記錄 ##注意這不是引號,是鍵盤按鍵1左邊的那個符號! docker rm `docker ps -aq` ##在容器的后台運行一個進程,運行出活着的容器 docker run -d centos /bin/sh -c "while true;do echo 'naruto'; sleep 1;done" -d 就是daemonize 后台運行的意思 centos 指定哪個鏡像 /bin/sh 指定linux的解釋器 -c 指定一段shell代碼 "while true;do echo 'naruto'; sleep 1;done" 每秒打印一個naruto字符串 ##進入容器空間內 docker exec -it 運行着的容器id /bin/bash ##查看容器日志 docker logs 容器id docker logs -f 容器id #檢測容器內的日志
倉庫及容器端口映射的相關命令
#運行一個web容器的操作 獲取一個python的flask的鏡像 ## 注意 docker run的特點是,如果鏡像不存在,會自動的先去docker pull
docker run -d -P training/webapp python app.py -d 后台運行 -P 端口映射,隨機映射 training/webapp 鏡像名 python app.py 你要執行的命令 ##docker容器的端口映射 docker port 容器id ##容器的啟停管理 docker start 容器id docker stop 容器id
docker基本命令注釋:

[root@docker ~]# docker --help Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files #客戶端配置文件的位置 -D, --debug=false Enable debug mode #啟用Debug調試模式 -H, --host=[] Daemon socket(s) to connect to #守護進程的套接字(Socket)連接 -h, --help=false Print usage #打印使用 -l, --log-level=info Set the logging level #設置日志級別 --tls=false Use TLS; implied by--tlsverify # --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任證書簽名CA --tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS證書文件路徑 --tlskey=~/.docker/key.pem Path to TLS key file #TLS密鑰文件路徑 --tlsverify=false Use TLS and verify the remote #使用TLS驗證遠程 -v, --version=false Print version information and quit #打印版本信息並退出 Commands: attach Attach to a running container #當前shell下attach連接指定運行鏡像 build Build an image from a Dockerfile #通過Dockerfile定制鏡像 commit Create a new image from a container's changes #提交當前容器為新的鏡像 cp Copy files/folders from a container to a HOSTDIR or to STDOUT #從容器中拷貝指定文件或者目錄到宿主機中 create Create a new container #創建一個新的容器,同run 但不啟動容器 diff Inspect changes on a container's filesystem #查看docker容器變化 events Get real time events from the server#從docker服務獲取容器實時事件 exec Run a command in a running container#在已存在的容器上運行命令 export Export a container's filesystem as a tar archive #導出容器的內容流作為一個tar歸檔文件(對應import) history Show the history of an image #展示一個鏡像形成歷史 images List images #列出系統當前鏡像 import Import the contents from a tarball to create a filesystem image #從tar包中的內容創建一個新的文件系統映像(對應export) info Display system-wide information #顯示系統相關信息 inspect Return low-level information on a container or image #查看容器詳細信息 kill Kill a running container #kill指定docker容器 load Load an image from a tar archive or STDIN #從一個tar包中加載一個鏡像(對應save) login Register or log in to a Docker registry#注冊或者登陸一個docker源服務器 logout Log out from a Docker registry #從當前Docker registry退出 logs Fetch the logs of a container #輸出當前容器日志信息 pause Pause all processes within a container#暫停容器 port List port mappings or a specific mapping for the CONTAINER #查看映射端口對應的容器內部源端口 ps List containers #列出容器列表 pull Pull an image or a repository from a registry #從docker鏡像源服務器拉取指定鏡像或者庫鏡像 push Push an image or a repository to a registry #推送指定鏡像或者庫鏡像至docker源服務器 rename Rename a container #重命名容器 restart Restart a running container #重啟運行的容器 rm Remove one or more containers #移除一個或者多個容器 rmi Remove one or more images #移除一個或多個鏡像(無容器使用該鏡像才可以刪除,否則需要刪除相關容器才可以繼續或者-f強制刪除) run Run a command in a new container #創建一個新的容器並運行一個命令 save Save an image(s) to a tar archive#保存一個鏡像為一個tar包(對應load) search Search the Docker Hub for images #在docker hub中搜索鏡像 start Start one or more stopped containers#啟動容器 stats Display a live stream of container(s) resource usage statistics #統計容器使用資源 stop Stop a running container #停止容器 tag Tag an image into a repository #給源中鏡像打標簽 top Display the running processes of a container #查看容器中運行的進程信息 unpause Unpause all processes within a container #取消暫停容器 version Show the Docker version information#查看容器版本號 wait Block until a container stops, then print its exit code #截取容器停止時的退出狀態值 Run 'docker COMMAND --help' for more information on a command. #運行docker命令在幫助可以獲取更多信息
制作docker及使用制作好的docker鏡像的簡單過程
##1.獲取一個centos基礎鏡像,運行處容器后 docker run -it centos /bin/bash ##2.進入容器空間內,默認沒有python3 和其他軟件 進入之后,安裝一個vim yum install vim -y
##3.自定義軟件后,退出容器,提交這個容器,成為一個新的鏡像 exit退出容器
##4.此時這個鏡像文件,可以發送給其他同事了 docker commit 容器id 新的鏡像的名字 docker commit 5c2 s20/centos-vim ##5.查看提交的鏡像文件 docker images ##6.導出這個鏡像文件,指定導出的文件名和后綴 docker save 鏡像名/id > /opt/s20-centos-vim.tar.gz ##7.在本地測試導入這個鏡像 ###### 可以在本地測試,先刪除原本的鏡像 導入命令 docker load < /opt/s20-centos-vim.tar.gz ##8.給導入的鏡像,修改tag別名 docker tag 舊的鏡像名 以dockerhub倉庫id開頭的/新的鏡像名 ### 以dockerhub倉庫id開頭的是為了以后在推送的時候,根據這個名字在遠程倉庫找到對應的倉庫名 docker tag 621 yuchao163/s20-centos-vim ##9.執行這個docker鏡像,運行處容器后,查看是否攜帶了vim #語法 關鍵字 關鍵字 參數 鏡像名 你要執行的命令 docker run -it yuchao163/s20-centos-vim /bin/bash
dockerfile***
dockerfile實在是太重要了,我這里也單獨把它作為一個篇幅來講。
獲取docker鏡像的三種方式
1.去docker倉庫獲取的方式,一個是公網倉庫,一個是私有倉庫 docker pull 2.獲取別人發來的鏡像,也就是自定義的鏡像 3.通過dockerfile構建docker鏡像
大家可以再返回看一下上面的那張闡述了開發與測試跟運維之間解決環境配置的簡圖,其中最為重要的一點就是:開發把dockerfile(可以看成是docker配置環境的文件)上傳至github,運維跟測試依據這個dockerfile去快速的搭建環境!
之所以利用這種方式去構建環境是因為通過dockerfile我們可以自定制鏡像。
鏡像的定制就是定制每一層所添加的配置、文件。如果可以吧每一層修改、安裝、構建、操作的命令都寫入到一個腳本,用腳本來構建、定制鏡像,這個腳本就是dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
說白了,這個文件就是定制docker鏡像的一個腳本而已,我們需要學習里面的功能性的參數
通過dockerfile構建docker鏡像的說明:
FROM scratch #制作base image 基礎鏡像,盡量使用官方的image作為base image FROM centos #使用base image FROM ubuntu:14.04 #帶有tag的base image LABEL version=“1.0” #容器元信息,幫助信息,Metadata,類似於代碼注釋 LABEL maintainer=“yc_uuu@163.com" #對於復雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令! RUN yum update && yum install -y vim \ Python-dev #反斜線換行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME” WORKDIR /root #相當於linux的cd命令,改變目錄,盡量使用絕對路徑!!!不要用RUN cd WORKDIR /test #如果沒有就自動創建 WORKDIR demo #再進入demo文件夾 RUN pwd #打印結果應該是/test/demo ADD and COPY ADD hello / #把本地文件添加到鏡像中,吧本地的hello可執行文件拷貝到鏡像的/目錄 ADD test.tar.gz / #添加到根目錄並解壓 WORKDIR /root ADD hello test/ #進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑 COPY hello test/ #等同於上述ADD效果 ADD與COPY - 優先使用COPY命令 -ADD除了COPY功能還有解壓功能 添加遠程文件/目錄使用curl或wget ENV #環境變量,盡可能使用ENV增加可維護性 ENV MYSQL_VERSION 5.6 #設置一個mysql常量 RUN yum install -y mysql-server=“${MYSQL_VERSION}”
------這里需要稍微理解一下了-------中級知識--- VOLUME and EXPOSE 存儲和網絡 RUN and CMD and ENTRYPOINT RUN:執行命令並創建新的Image Layer CMD:設置容器啟動后默認執行的命令和參數 ENTRYPOINT:設置容器啟動時運行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo ”hello docker” ENTRYPOINT echo “hello docker” Exec格式 RUN [“apt-get”,”install”,”-y”,”vim”] CMD [“/bin/echo”,”hello docker”] ENTRYPOINT [“/bin/echo”,”hello docker”] 通過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [“/bin/echo”,”hello $name”]#這個僅僅是執行echo命令,讀取不了shell變量 ENTRYPOINT [“/bin/bash”,”-c”,”echo hello $name"] CMD 容器啟動時默認執行的命令 如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略 如果定義多個CMD,只有最后一個執行 ENTRYPOINT 讓容器以應用程序或服務形式運行 不會被忽略,一定會執行 最佳實踐:寫一個shell腳本作為entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [“docker-entrypoint.sh] EXPOSE 27017 CMD [“mongod”] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name”]
通過dockerfile定制一個python flask web程序,運行出容器
配置過程如下:
1.准備一個flask代碼文件
touch whwflask.py
vim whwflask.py
flask的代碼如下:
#coding:utf8 from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "HELLO NARUTO" if __name__=="__main__": app.run(host='0.0.0.0',port=8080)
2.配置python2的包管理,安裝flask
easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
3.准備Dockerfile,寫入如下內容
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 -i https://pypi.tuna.tsinghua.edu.cn/simple flask COPY whwflask.py /opt/ WORKDIR /opt EXPOSE 8080 #暴露容器內的8080端口 CMD ["python","whwflask.py"] #讓容器執行如下命令
4.准備好齊全的文件,開始構建docker鏡像
[root@s20 s20docker]# ls CentOS-Base.repo Dockerfile epel.repo whwflask.py
5.構建docker鏡像的命令,這個命令得在Dockerfile的目錄下執行!!!
docker build .
6.構建鏡像完成之后,查看鏡像文件
docker images
# 6f0是docker鏡像的id的前三個字母
docker tag 6f0 whw-flask-docker
7.運行這個鏡像即可
docker run -d -p 7777:8080 6f0
docker倉庫的學習
docker提供了一個類似於github的倉庫dockerhub。
網址是https://hub.docker.com/需要注冊使用。
公有倉庫
公有倉庫的使用比較簡單,基本步驟如下:
#注冊docker id后,在linux中登錄dockerhub docker login #輸入你的賬號密碼 就可以成功登錄 #注意要保證image的tag是賬戶名,如果鏡像名字不對,需要改一下tag docker tag 你的dockerhub賬號名/你的docker鏡像名 本地的鏡像id或名 語法是:docker tag 倉庫名 huoyingwhw/倉庫名 #推送docker image到dockerhub docker push huoyingwhw/centps-cmd-exec:latest #在dockerhub中檢查鏡像 https://hub.docker.com/ #刪除本地鏡像,測試下載pull 鏡像文件 docker pull huoyingwhw/centos-entrypoint-exec
私有倉庫
私有倉庫的配置方法如下:
1.下載一個registry 私有倉庫鏡像 # 這個 \ 是換行符的意思 # -v 是數據文件夾掛載 ,宿主機的數據文件夾:容器內的文件夾 docker run -d \ -p 5000:5000 \ -v /opt/data/registry:/var/lib/registry \ registry 2.可以查看私有倉庫的api數據地址,如下 http://10.0.0.128:5000/v2/_catalog 3.但是此時的私有倉庫還沒法使用,它不支持http方式的推送,修改默認的配置文件即可 1.編輯docker的配置文件 vim /etc/docker/daemon.json 2.寫入如下信息,地址改成你自己的ip {"registry-mirrors": ["http://f1361db2.m.daocloud.io"], "insecure-registries":["10.0.0.128:5000"] } 3.修改docker的配置文件
vim /lib/systemd/system/docker.service 添加如下配置,在[Service]的代碼區域塊中,添加如下參數 [Service] EnvironmentFile=-/etc/docker/daemon.json 4.重新加載這個文件 systemctl daemon-reload 5.重啟整個docker服務 systemctl restart docker 6.重新啟動一個私有倉庫 # 外部的9000端口映射到docker容器的5000端口 docker run --privileged=true -d -p 9000:5000 -v /opt/data/registry:/var/lib/registry registry 參數解釋: --privileged=true docker容器的安全機制:設置特權級運行的容器 7.推送本地的鏡像,到私有倉庫中去 docker push 10.0.0.128:5000/whw-hello-world 8.其他同事就可以通過這個私有倉庫的鏡像地址獲取你的鏡像了 docker pull 10.0.0.128:5000/whw-hello-world 4.還得修改本地鏡像的名字,以倉庫地址為開頭 #docker tag 你要修改的鏡像 修改之后的鏡像名 docker tag fce 10.0.0.128:5000/whw-hello-world 5.編寫Dockerfile,文件名固定 touch dockerfile vim dockerfile ...