Docker进阶(制作镜像,共享卷,网络通信,私有仓库)
目錄
一.創建簡單的鏡像
1.自定義鏡像原理
2.創建commit自定義鏡像
3.示例
二.用Dockerfile創建鏡像
1.Dockerfile的概述
2.Dockerfile語法
3.使用Dockerfile創建鏡像
4.示例
三.制作Dockerfile復雜鏡像
1.微服務架構
2.示例
3.訪問容器服務
四.容器共享卷
1.共享卷的用途
2.主機卷的映射
3.示例
五.容器間的網絡通信
1.容器的網絡通信模式
2.示例
六.私有鏡像倉庫
1.鏡像倉庫的概述
2.搭建私有倉庫
3.使用鏡像倉庫
# 制作空鏡像 ~]# tar -cf - --files-from=/dev/null | docker import - scratch ~]# docker images REPOSITORY ? TAG ? ? ? IMAGE ID ? ? ? ? ? CREATED ? ? ? ? ? ? SIZE scratch ? ? latest ? ? 130bf0c96118 ? ? ? ?19 seconds ago ? ? 0B
一.創建簡單的鏡像
1.自定義鏡像原理
-
鏡像采用分層設計
- 創建讀寫層
- 修改配置
- 重新打包
2.創建commit自定義鏡像
- 使用現有鏡像啟動容器,在該容器基礎上修改
- 使用commit制作新鏡像
- docker commit 容器id 新鏡像名稱:標簽
3.示例
# 創建一個底層容器 ~]# docker run -it centos:latest ? # 在容器里準備yum源并安裝軟件包(華為yum源) /]# rm -f /etc/yum.repos.d/*.repo /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.myhuaweicloud.com/repo/CentOS-Base-7.repo /]# yum install -y net-tools vim-enhanced tree bash-completion iproute psmisc && yum clean all ? # 退出容器并打包這個容器成為新的鏡像 /]# exit ~]# docker commit 02fd1719c038 myos:latest ? # 此時就是根據centos鏡像做出了一個新的獨立鏡像 ]# docker images REPOSITORY ? TAG ? ? ? IMAGE ID ? ? ? ? CREATED ? ? ? ? ? ? SIZE centos ? ? ? latest ? ? 5d0da3dc9764 ? ? ?3 months ago ? ? ? 231MB ? ~]# docker history centos IMAGE ? ? ? ? CREATED ? ? ? CREATED BY ? ? ? ? ? ? ? ? ? ? ? ? ? ? SIZE COMMENT 5d0da3dc9764 ? 3 months ago ? /bin/sh -c #(nop) CMD ["/bin/bash"] ? 0B ? ? ? ? ? ? ? ? ? .....二.用Dockerfile創建鏡像
1.Dockerfile的概述
1)commit的局限
-很容易制作簡單的鏡像,但碰到復雜的情況就十分不方便,
例如:
-需要設置默認的啟動命令
-需要設置環境變量(比如PATH)
-需要指定鏡像開放某些特定的端口
dockerfile是一種更強大的鏡像制作方式
-編寫類似于腳本的Dockerfile文件,通過該文件制作鏡像
2.Dockerfile語法
-FROM: 基礎鏡像 -MAINTAINER: 該指令用來設置鏡像的維護者信息(AINTAINER 說明信息<郵箱地址>) -RUN: 制作鏡像時執行的命令,可以有多個 -ADD: 復制文件到鏡像,自動解壓 -COPY: 復制文件到鏡像,不解壓 -EXPOSE: 聲明開放的端口 -ENV: 設置容器啟動后的環境變量 -WORKDIR: 定義容器默認工作目錄(等于cd) -CMD: 容器啟動時執行的命令, 僅可以有一條CMD3.使用Dockerfile創建鏡像
docker build 根據Dockerfile里的內容生成鏡像
使用Dockerfile工作流程
-創建目錄mkdir mybuild(文件名任意)
-在目錄中編寫Dockerfile
-生成鏡像
~]# docker build -t 鏡像名稱:標簽 Dockerfile所在目錄 -t: 指定鏡像名與標簽 -f: 指定Dockerfile文件路徑4.示例
## 制作apache鏡像 # 書寫Dokcerfile,這里用commit制作的鏡像作為底層鏡像 ~]# mkdir web; cd web ~]# vim Dockerfile FROM myos:latest ? ? ? ? ? ? ? ? # commit制作的鏡像作為底層鏡像 RUN yum install -y httpd php ? ? # 由于底層鏡像里有yum所以這里直接安裝httpd與php(相等于遠程執行命令) ENV LANG=C ? ? ? ? ? ? ? ? ? ? ? # locale可以查看到本機的操作系統語言,這里是防止出現亂碼,所以設置為英文‘C’ ADD webhome.tar.gz /var/www/html/ ? # 類似于`docker cp` 隨便找一個web頁面的壓縮包,拷貝到容器的httpd網頁配置文件中 WORKDIR /var/www/html/ ? ? ? # 類似于cd,創建容器的時候直接以這個目錄為首目錄 EXPOSE 80 ? ? ? ? ? ? ? ? ? ? # 監聽端口 CMD ["/usr/sbin/httpd", "-DFOREGROUND"] # 容器啟動命令 ? ## 啟動命令示例 # /bin/ls 則寫成CMD ["/bin/ls"] # /bin/ls -l -a 則寫成 CMD ["bin/ls","-l","-a"] ? #注:那么我們怎么知道啟動命令呢;找服務啟動文件 ~]# rpm -ql httpd | grep service /usr/lib/systemd/system/httpd.service ~]# cat /usr/lib/systemd/system/httpd.service ..... ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ..... ~]# echo $OPTIONS # 此時發現echo為空,所以啟動命令是/usr/sbin/httpd -DFOREGROUND(-DFOREGROUND為選項,寫法如上) ? ## 隨便找一個web頁面拷貝到當前目錄中(也就是寫dockerfile文件的目錄) # 開始制作鏡像 ~]# docker build -t myos:httpd . # 查看與驗證鏡像 -t 鏡像名于版本 -f 指定dockerfile文件 --network=host 使用宿主網絡(因為容器默認的網絡有些不可用) ? #查看鏡像 ~]# docker images ? # 刪除所有多余的鏡像(方便測試) ~]# docker rm -f $(docker ps -aq) ? # 安裝一個服務測試 ~]# docker run -itd myos:httpd ? ## 訪問測試 # 先找到ip ~]# docker inspect 753ff4121bda "Networks": { ......"IPAddress": "172.17.0.2", ...... ~]# curl http://172.17.0.2/info.php三.制作Dockerfile復雜鏡像
1.微服務架構
?? ?- 微服務架構是一種架構模式,它提倡將單一應用程序劃分 成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。
? ?- 微服務架構有別于更為傳統的單體式方案,將應用拆分成 多個核心功能。可以單獨構建和部署
? ?- 微服務架構不只是應用核心功能間的這種松散耦合,它還 涉及如何進行服務間通信以應對不可避免的故障、滿足未來的可擴展性并實現新的功能集成
2)優點
?? ?- 它解決了復雜性問題。它將單體應用分解為一組服務。雖然功能總量不變,但應用程序已被分解為可管理的模塊或 服務,這種體系結構使得每個服務都可以獨立開發、運行,降低了服務的耦合性更適合CI/CD
3)微服務的優點是:
?? ?- 高度可擴展、出色的彈性、易于部署、易于訪問、更加開發
? ?- 松耦合高內聚
4)如何構建微服務
-微服務的核心就是“拆”
? - 如何拆分服務?
- ?? 要想構建微服務就要理清各個服務之間的關系
- ?? 保持服務的持續演進,使服務能夠快速、低成本地被拆分和 合并,以快速響應業務的變化,持續迭代
? - docker這種應用的管理模式正是微服務的思想, 每個容器 承載一個服務。一臺計算機同時運行多個容器,從而就能 很輕松地模擬出復雜的微服務架構
2.示例
注:容器是否要配置環境變量屈決于配置文件是否有環境變量
# 示例,查看service文件(yum安裝的默認就有) ~]# cat /usr/lib/systemd/system/chronyd.service ...... EnvironmentFile=-/etc/sysconfig/chronyd ? # 該文件就是環境配置文件 ExecStart=/usr/sbin/chronyd $OPTIONS ....... # 查看環境配置文件 ~]# cat /etc/sysconfig/chronyd OPTIONS="" # 可以看到chrony服務的啟動變量是空,所以不要配置,如果有的話則要把變量改成參數## 制作php-fpm鏡像 # 準備工作,創建目錄與查看啟動命令 ~]# mkdir php; cd php ~]# cat /usr/lib/systemd/system/php-fpm.service ..... ExecStart=/usr/sbin/php-fpm --nodaemonize ..... ? # 創建Dockerfile文件,根據commit所創建的基礎鏡像制作 ~]# vim Dockerfile FROM myos:latest RUN yum install -y php-fpm COPY www.conf /etc/php-fpm.d/www.conf EXPOSE 9000 WORKDIR /usr/local/nginx/html COPY info.php info.php CMD ["/usr/sbin/php-fpm", "--nodaemonize"] ? # 制作鏡像 ~]# docker build -t myos:php-fpm . ? # 測試 ~]# docker run -it [鏡像id] /bin/bash /]# ps -ef 或 ss -nulpt # 此時就可以查看到php的進程與端口,如果不能使用改命令則基礎鏡像內軟件包安裝不齊(包名:psmisc)制作nginx鏡像
-nginx一般采用編譯安裝,在容器內編譯不容易拍錯也不便于管理
-
Dockerfile 中ADD可以將一一個壓縮包在容器內解壓釋放
-
利用這一-特性,我們可以在外部編譯nginx, 并把編譯好的文件打包,使用打包文件構建nginx 鏡像服務
-
nginx進程默認在后臺運行,可以使用參數daemon off;強制進程在前臺運行
查看nginx啟動官網
啟動當前進程,而不殺掉父進程
官網:Core functionality
3.訪問容器服務
默認容器可以訪問外網
●但外部網絡的主機不可以訪問容器內的資源
●容器每次創建IP地址都會改變;
●解決這個問題的最佳方法是端口綁定,
●容器可以與宿主機的端口進行綁定,
●從而把宿主機變成對應的服務,不用關心容器的IP地址
發布容器web服務
使用-p參數把容器端口和宿主機端口綁定,同一個宿主機端口只能綁定一個容器服務
-p [選項IP]:宿主機端口:容器端口(可以有多個) ~]# docker run -itd -p 80:80 myos:httpd # 此時在內網環境就可以直接訪問宿主機的ip加端口就可以直接訪問 ~]# curl http://127.0.0.1:80對外發布服務
給綁定容器的那臺服務器綁定一個公網IP
~]# docker run -itd -p 80:80 myos:httpd # 此時直接到瀏覽器公網訪問 ~]# http://(公網ip):80再起一個nginx,如果要用80訪問web服務,首先必須停止 apache
~]# docker ps -a| grep httpd ~]# docker stop (httpd容器的ID) ~]# docker run -itd -p 80:80 -p 9000:9000 myos:nginx # -p可以寫多個?驗證方式: 通過瀏覽器訪問公網ip即可
四.容器共享卷
1.共享卷的用途
??? - Docker容器不適合保存任何數據
?? - 數據文件與配置文件頻繁更改
?? - 修改多個容器中的數據非常困難多
?? - 容器之間有數據共享、同步需求
?? - 重要數據在容器內不方便管理易丟失
?? - 解決這些問題請使用主機卷映射功能
2.主機卷的映射
Docker可以映射宿主機文件或目錄到容器中
?? ?- 目標對象不存在就自動創建
? ?- 目標對象存在就直接覆蓋掉
? ?- 多個容器可以映射同一個目標對象來達到數據共享的目的
啟動容器時,使用-v映射參數(可有多個)
????????docker run -itd -v 宿主機對象:容器內對象myos:latest
3.示例
# 創建映射目錄{網頁目錄與配置文件} ~]# mkdir -p /var/{webroot,webconf} ? # 準備訪問頁面與配置文件 ~]# cp info.php info.html /var/webroot/ ~]# cp /usr/local/nginx/conf/nginx.conf /var/webconf/ # 修改配置文件啟動php ~]# vim /var/webconf/nginx.conf ...... location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } ...... ~]# docker run -itd -p 80:80 --name nginx \ -v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf ?-v /var/webroot:/usr/local/nginx/html myos:nginx ? #驗證方式: 使用 exec 進入容器查看 ~]# docker exec -it nginx /bin/bash html]# cat /usr/local/nginx/conf/nginx.conf # 查看 php 相關配置是否被映射到容器內 # 報錯處理 ~]# docker logs [容器ID]五.容器間的網絡通信
1.容器的網絡通信模式
-host 模式,與宿主機共享網絡-container 模式,共享其他容器的網絡命名空間-none模式,無網絡模式-bridge模式,默認模式-自定義網絡,自由創建橋接網絡或者overlay網絡 # 注:共享網卡之后容器之間就可以訪問了--network=container:[要共享的容器名]# 示例 ~]# docker ..... --net host ... 鏡像2.示例
啟動前端 nginx 服務,并映射共享目錄和配置文件
# 創建共享目錄{網頁目錄與配置文件} ~]# mkdir -p /var/{webroot,webconf} # 準備訪問頁面與配置文件(測試用的,隨便整兩個) ~]# cp info.php info.html /var/webroot/ [root@docker-0001 ~]# cp /usr/local/nginx/conf/nginx.conf /var/webconf/ # 修改配置文件 [root@docker-0001 ~]# vim /var/webconf/nginx.conf .......location ~ \.php$ {root ? ? ? ? ? html;fastcgi_pass ? 127.0.0.1:9000;fastcgi_index? index.php;include ? ? ?? fastcgi.conf;} ....... ? # 啟動前端 nginx 服務,并映射共享目錄和配置文件 ~]# docker run -itd --name nginx -p 80:80 \-v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf \-v /var/webroot:/usr/local/nginx/html myos:nginx ? # 啟動后端 php 服務,并映射共享網頁目錄 ~]# docker run -itd --network=container:nginx -v /var/webroot:/usr/local/nginx/html myos:php-fpm ? # 驗證服務 ~]# curl http://宿主ip/info.html ~]# curl http://宿主ip/info.php ? # 概述,先創建一個容器并配置名字;然后再創建一個容器,在創建時指定共享網絡,共享網絡指定上一個容器的名字六.私有鏡像倉庫
1.鏡像倉庫的概述
鏡像倉庫作為Docker技術的核心組件之一,其主要作用就是負責鏡像內容的存儲和分發。Docker鏡像倉庫從使用范圍來說分為“公有鏡像倉庫”和“私有鏡像倉庫”,公有鏡像倉庫是可以被任何人使用的,例如Docker公司維護的在線存儲庫Docker Hub以及部分云服務廠商(如阿里云)提供的在線Docker鏡像庫等,都屬于公有鏡像倉庫的范疇。
而私有鏡像倉庫則是指部署在公司或組織內部,用于自身應用Docker鏡像存儲、分發的鏡像倉庫。在構建公司內部使用的自動化發布系統的過程中,從安全的角度出發,應用的打包鏡像一般情況下只會被存儲在私有鏡像倉庫中,CI/CD流程的銜接點也是通過向私有鏡像倉庫上傳鏡像和拉取鏡像的操作來完成的。
在現階段主流的企業級私有鏡像倉庫構建方案中,比較流行的是:開源的企業級Docker鏡像倉庫——Harbor、以及商業鏡像倉庫——JFrog Artifactory。這兩種Docker鏡像倉庫各自都有一定的市場,就作者所工作過的公司來說使用Harbor和JFrog Artifactory作為私有鏡像倉庫的都有,但就成熟度和功能性完整性來說JFrog Artifactory作為商業級解決方案會更具優勢,所以目前國內有錢的互聯網公司選擇JFrog Artifactory作為企業級私有倉庫的比較多,本文的主要內容是演示如何通過Docker的方式來快速部署JFrog Artifactory并將其作為Devops自動發布系統的私有鏡像倉庫。
注:如果不配置倉庫,那么每臺docker只能查看與運用本機的鏡像
倉庫配置文件及鏡像存儲路徑
-
/etc/docker-distribution/registry/config.yml
-
/var/lib/registry
-
默認端口號5000
-
我們可以通過curl命令訪問倉庫
# 鏡像名稱訪問(查看倉庫里的鏡像名) ~]# curl http://倉庫ip:5000/v2/_catalog # 標簽訪問(查看該鏡像的所有標簽) ~]# curl http://倉庫ip:5000/v2/鏡像名稱/tags/list ? # v2是api的參數,用的是版本二的意思 # 鏡像是由鏡像的名稱與鏡像的標簽組成;所以這兩個訪問方式分別訪問名稱與標簽2.搭建私有倉庫
1)服務端配置
# 準備一臺服務器,并安裝服務倉庫服務,啟動并設置開啟自啟 ~]# yum install -y docker-distribution ~]# systemctl enable --now docker-distribution # 訪問測試 ~]# curl http://192.168.1.100:5000/v2/_catalog {"repositories":[]}2)docker客戶端配置
如何讓Docker知道私有倉庫的地址
配置文件/etc/docker/damon.json
- cgroup 驅動,docker默認 cgroupfs
"exec-opts": ["native.cgroupdriver=systemd"]- 默認下載倉庫(使用國內源能快一點)
"registry-mirrors": ["https://hub-mirror.c.163.com"]- 私有倉庫地址(重點)(:”聲明了主機ip“,“主機名”)
"insecure-registries":["192.168.1.100:5000", "registry:5000"]3)配置示例
所有node節點都需要配置
~]# vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://hub-mirror.c.163.com"], "insecure-registries":["192.168.1.100:5000", "registry:5000"] } # 重啟服務生效 ~]# systemctl restart docker3.使用鏡像倉庫
1)上傳鏡像
上傳 myos:latest, myos:httpd, myos:nginx, myos:php-fpm
# 由于可能會由很多個倉庫,所以必須打上標簽標記;此時如果有一個域名,可以讓這個域名來解析這個ip,那么這里的ip就可以用域名代替 ~]# docker tag myos:latest 192.168.1.100:5000/myos:latest ~]# docker push 192.168.1.100:5000/myos:latest # 前面這一段就是聲明鏡像倉庫名(192.168.1.100:5000) ? ## 驗證測試 # 查看鏡像名 curl http://倉庫IP:5000/v2/_catalog ~]# curl http://192.168.1.100:5000/v2/_catalog {"repositories":["myos"]} ? # 查看標簽 curl http://倉庫IP:5000/v2/鏡像名稱/tags/list ~]# curl http://192.168.1.100:5000/v2/myos/tags/list {"name":"myos","tags":["latest"]}2)下載鏡像
第一種方法
## 使用遠程鏡像啟動容器 # 先查看有哪些鏡像 ~]# curl http://192.168.1.100:5000/v2/_catalog ~]# curl http://192.168.1.100:5000/v2/myos/tags/list # 拉取鏡像(前面是鏡像倉庫名192.168.1.100:5000/) ~]# docker pull 192.168.1.100:5000/myos:latest Unable to find image '192.168.1.100:5000/myos:latest' locally latest: Pulling from myos 7dc0dca2b151: Pull complete 95c297b4d705: Pull complete Digest: sha256:d61ffc053895e2dc16f63b8a2988dfe5f34207b48b1e74d397bb3267650ba4ce Status: Downloaded newer image for 192.168.1.100:5000/myos:latest # 查看 ~]# docker images REPOSITORY ? ? ? ? ? ? ? TAG ? ? ? ? IMAGE ID ? ? ? ? ? CREATED ? ? ? ? ? ? SIZE 192.168.1.100:5000/myos latest ? ? 8d17db982b34 ? ? ? ?3 days ago ? ? ? ? 281MB # 此時就可以查看到鏡像,然后再啟動容器,但是這樣的話步驟太繁瑣,所以還有一種方法第二種方法
## 可以直接run啟動時直接拉取倉庫鏡像 ~]# docker run -itd -p 80:80 192.168.1.100:5000/myos:latest # 查看容器是否啟動 ~]# docker ps -a ONTAINER ID IMAGE ? ? ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? ? ? ? CREATED ? ? STATUS ? PORTS ? ? ? ? ? ? ? NAMES a36f00980554 192.168.1.100:5000/myos "/usr/sbin/http -DF.." ? ?3 days ago ? Up 3 days ? 0.0.0.0:80->80/tcp ? registry-http總結
以上是生活随笔為你收集整理的Docker进阶(制作镜像,共享卷,网络通信,私有仓库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker安装与镜像,容器命令管理
- 下一篇: 部署Dashboard图形界面控制doc