本期目標(biāo) : 基于 Centos 7.6 , 封裝出一個(gè)可用于運(yùn)行 php 項(xiàng)目的開箱即用鏡像準(zhǔn)備工作
本文不討論 dockerfile 語(yǔ)法 , 并且假設(shè)你懂得基本的類unix 操作系統(tǒng)常識(shí)并擁有類unix 運(yùn)行環(huán)境 (包括但不限于安裝了mac 或 linux 的實(shí)體機(jī) , 類unix虛擬機(jī) , 安裝了 MinGW 或 CygWin 的 windows 機(jī)器) , 并且認(rèn)為你懂得基本的 docker 操作和有一定的 dockerfile 閱讀能力
建立工作目錄
mkdir ~/docker-learn cd ~/docker-learn
創(chuàng)建Dockerfile
touch Dockerfile
然后拷貝你常用的 nginx.conf 到工作目錄
cp xxx/nginx.conf nginx.conf封裝基礎(chǔ)鏡像
編輯我們創(chuàng)建好的 Dockerfile
基礎(chǔ)內(nèi)容聲明本鏡像繼承自 centos 最新版
FROM centos安裝 nginx
創(chuàng)建nginx源文件
由于 centos 倉(cāng)庫(kù)里是沒有 nginx 的 , 所以我們要自力更新添加nginx的源到 docker 里
復(fù)制 nginx.org 里關(guān)于 RHEL 源的內(nèi)容到 nginx.repo 文件
也可以本地執(zhí)行以下命令創(chuàng)建 nginx.repo
sudo tee ./nginx.repo <<-"EOF" [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key EOF
寫入復(fù)制 nginx.repo 指令到docker鏡像中
COPY nginx.repo /etc/yum.repos.d/nginx.repo
使用yum安裝nginx并設(shè)置為開機(jī)啟動(dòng)
RUN yum makecache && yum install nginx && chkconfig nginx on安裝 php
centos 默認(rèn)源中擁有低版本的 php 以及相關(guān)包 , 我們需要換一個(gè)版本新一些的源 .
本文 remi開源鏡像
安裝 remi 源
RUN rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && yum update -y
使用 yum 安裝php和相關(guān)包并設(shè)置為開機(jī)啟動(dòng)
RUN yum install -y --enablerepo=remi --enablerepo=remi-php72 php php-openssl php-curl php-bcmath php-devel php-mbstring php-mcrypt php-mysqlnd php-pdo php-gd php-xml php-opcache php-fpm && chkconfig php-fpm on清理工作
眾所周知,如果要推送到線上的話鏡像越小越好,docker yum 的運(yùn)行會(huì)生成大量緩存,那么我們就很有必要做一些清理工作了
RUN yum clean headers && yum clean packages && yum clean metadata && rm -rf /usr/share/man聲明鏡像運(yùn)行時(shí)入口點(diǎn)
即容器運(yùn)行時(shí)執(zhí)行的第一個(gè)命令,如果不是 init 的話很有可能部分特權(quán)命令無法運(yùn)行,例如 chkconfig
ENTRYPOINT ["/sbin/init"]合并 dockerfile
dockerfile 中的每個(gè)指令都會(huì)多帶帶生成一層鏡像,這樣勢(shì)必會(huì)增加我們的鏡像體積
通常做法是盡可能把多條指令整理順序合并為一條,就可以有效減小鏡像體積
FROM centos # 復(fù)制兩個(gè)repo COPY conf/tsinghua-base.repo /etc/yum.repos.d/CentOS-Base.repo COPY conf/nginx.repo /etc/yum.repos.d/nginx.repo # 安裝組件和相關(guān)包 RUN yum makecache && yum -y install nginx && chkconfig nginx on && yum install -y epel-release && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && yum update -y && yum install -y --enablerepo=remi --enablerepo=remi-php72 php php-openssl php-curl php-bcmath php-devel php-mbstring php-mcrypt php-mysqlnd php-pdo php-gd php-xml php-opcache php-fpm && chkconfig php-fpm on && yum clean headers && yum clean packages && yum clean metadata && rm -rf /usr/share/man # 聲明入口點(diǎn) ENTRYPOINT ["/sbin/init"]測(cè)試鏡像可用性
構(gòu)建鏡像
值得注意的是 nginx 官方 repo 并不是很穩(wěn)定 , 運(yùn)行時(shí)可能會(huì)出錯(cuò) , 重試幾次一般都可以成功
如果是其他類型的錯(cuò)誤,那么就要檢查環(huán)境以及 dockerfile 有沒有問題
docker build . -t first-build
帶有特權(quán)啟動(dòng)一個(gè)后臺(tái)運(yùn)行的容器,將會(huì)返回一個(gè)ID
使用了 --privileged 選項(xiàng)之后,容器會(huì)擁有真的 root 權(quán)限,否則就只有本地普通用戶權(quán)限.容器中執(zhí)行了某些特殊操作(例如 systemctl)時(shí)才需要該選項(xiàng)
docker run -d --privileged first-build
測(cè)試鏡像的運(yùn)行狀況
docker exec -it ( docker run 命令返回的ID ) ps aux | grep "[nginx|php]"
如果返回結(jié)果類似這樣,那么說明我們的操作是正確的
> docker exec -it cca6 ps aux | grep "[nginx|php]" root 1 0.0 0.0 43112 4888 ? Ss 09:15 0:00 /sbin/init root 17 0.0 0.0 39096 6476 ? Ss 09:15 0:00 /usr/lib/system root 29 0.1 0.0 35100 3308 ? Ss 09:15 0:00 /usr/lib/system root 370 0.0 0.1 371588 21424 ? Ss 09:15 0:00 php-fpm: master root 381 0.0 0.0 24264 2784 ? Ss 09:15 0:00 /usr/lib/system dbus 386 0.0 0.0 58000 4164 ? Ss 09:15 0:00 /usr/bin/dbus-d root 418 0.0 0.0 46432 980 ? Ss 09:15 0:00 nginx: master p nginx 421 0.0 0.0 46832 3512 ? S 09:15 0:00 nginx: worker p root 564 0.0 0.0 8096 1820 tty1 Ss+ 09:15 0:00 /sbin/agetty -- apache 822 0.0 0.0 371588 12468 ? S 09:15 0:00 php-fpm: pool w apache 825 0.0 0.0 371588 12468 ? S 09:15 0:00 php-fpm: pool w root 2859 0.0 0.0 51752 3448 pts/0 Rs+ 09:21 0:00 ps aux
此時(shí)如果使用了端口映射來啟動(dòng)鏡像,那么你甚至可以在本地瀏覽器里看到 nginx 的默認(rèn)歡迎頁(yè)
docker run -d --privileged -p 8080:80 first-build
注冊(cè)阿里云命名空間
進(jìn)入阿里云鏡像控制臺(tái),
https://cr.console.aliyun.com/cn-zhangjiakou/instances/repositories
界面大概長(zhǎng)像這樣
使用鏡像加速器
點(diǎn)開左下角的鏡像加速器https://cr.console.aliyun.com/cn-zhangjiakou/instances/mirrors,你會(huì)看到你專屬的加速鏈接
找到你的操作系統(tǒng),逐條執(zhí)行即可,本文使用 Ubuntu 版本.
可見執(zhí)行很順利,沒有任何異常
登錄到阿里云docker倉(cāng)庫(kù)
sudo docker login --username=你的阿里云用戶名 registry.cn-zhangjiakou.aliyuncs.com Password: 你的阿里云密碼 Login Succeeded
建立命名空間
點(diǎn)擊左側(cè)的命名空間,點(diǎn)擊創(chuàng)建命名空間,輸入你的命名空間名稱
命名空間可以理解為鏡像所屬的組織
例如: centos 鏡像的全名是 docker.io/centos,docker.io 就是centos鏡像的命名空間,但是docker.io這個(gè)命名空間下卻存在不止centos一種鏡像.公開和私有是指鏡像是否可以在阿里云鏡像市場(chǎng)中被大眾查看和是否能夠不需要任何權(quán)限拉取
建立倉(cāng)庫(kù)
剛才我們已經(jīng)創(chuàng)建好了命名空間,那么接下來就是創(chuàng)建倉(cāng)庫(kù)了.
倉(cāng)庫(kù)可以理解為組織創(chuàng)建的軟件包包名
例如: centos 鏡像的全名是 docker.io/centos,centos 就是docker.io的一個(gè)倉(cāng)庫(kù)(軟件),同時(shí)centos這個(gè)軟件可以有很多個(gè)版本.
進(jìn)入 https://cr.console.aliyun.com/cn-zhangjiakou/instances/repositories 倉(cāng)庫(kù)頁(yè)面 , 點(diǎn)擊新建倉(cāng)庫(kù).
命名空間選擇剛才創(chuàng)建好的,摘要即為鏡像簡(jiǎn)介.
點(diǎn)擊下一步,代碼源選擇本地倉(cāng)庫(kù)
點(diǎn)擊創(chuàng)建鏡像倉(cāng)庫(kù)之后,就會(huì)發(fā)現(xiàn)頁(yè)面上多了一行數(shù)據(jù),說明創(chuàng)建成功
鼠標(biāo)放到那個(gè)下載一樣的圖標(biāo)上,會(huì)看到倉(cāng)庫(kù)的專屬地址
修改鏡像名
我們要把我們剛才構(gòu)建的一個(gè)叫做 first-build 的鏡像推送到阿里云倉(cāng)庫(kù)中.首先我們使用 docker images | grep first-build 查找到它鏡像ID.接下來我們修改鏡像的名字為符合docker第三方倉(cāng)庫(kù)的鏡像名格式.
第三方鏡像倉(cāng)庫(kù)鏡像名格式:倉(cāng)庫(kù)地址/組織/鏡像名:鏡像版本號(hào)以阿里云為例:阿里云倉(cāng)庫(kù)地址/命名空間/倉(cāng)庫(kù)名:版本 registry.cn-zhangjiakou.aliyuncs.com/leasn-docker/learn-docker:1
然后執(zhí)行以下命令來修改:
docker tag 3482e8529a90 registry.cn-zhangjiakou.aliyuncs.com/leasn-docker/learn-docker:1
再次使用 docker images | grep first-build 發(fā)現(xiàn)已經(jīng)找不到了,因?yàn)樗拿忠呀?jīng)變掉了
推送鏡像
sudo docker push registry.cn-zhangjiakou.aliyuncs.com/leasn-docker/learn-docker
等所有的 Pushing 運(yùn)行結(jié)束之后我們會(huì)發(fā)現(xiàn)阿里云倉(cāng)庫(kù)中多了一個(gè)版本.
至此,鏡像已經(jīng)推送成功.我們已經(jīng)可以基于阿里云的支持,在全世界范圍內(nèi)使用我們的鏡像.
對(duì)于向開源事業(yè)無私奉獻(xiàn)的阿里云致敬
現(xiàn)在我們就要研究怎么讓鏡像跑我們自己的項(xiàng)目了
這次就可以基于我們推送阿里云的鏡像了
FROM registry.cn-zhangjiakou.aliyuncs.com/leasn-docker/learn-docker:1
復(fù)制我們準(zhǔn)備好的 nginx.conf 到鏡像里
COPY nginx.conf /etc/nginx/conf/nginx.conf
nginx.conf 全文
user nginx; worker_processes auto; pid /run/nginx.pid; events { worker_connections 1024; } http { server { listen 80; server_name 127.0.0.1; root /var/www/html; index index.php; location ~ .php($|/) { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^(.+.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
復(fù)制工程源碼到鏡像里
在當(dāng)前目錄建立我們的工程,并且假裝我們的工程只有一個(gè)文件,它位于./proj
復(fù)制我們的工程到鏡像里并為運(yùn)行目錄加權(quán)
COPY proj /var/www/html RUN chmod -R 755 /var/www/html/
Dockerfile 全文
FROM registry.cn-zhangjiakou.aliyuncs.com/leasn-docker/learn-docker:1 COPY nginx.conf /etc/nginx/nginx.conf COPY proj /var/www/html RUN chmod -R 755 /var/www/html/
構(gòu)建鏡像并使用端口映射運(yùn)行我們的容器
docker build . docker run --privileged -d -p 8080:80 773ed8872493
如果不出意外,我們已經(jīng)可以在本地的 127.0.0.1:8080 中看到 phpinfo() 了
既然phpinfo已經(jīng)看到了,那么如何讓整個(gè)工程跑起來我就不贅述了.
值得一提的是,推送新版本到
使用 docker-compose 編排鏡像Compose 是一個(gè)用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具。使用Compose,您可以使用YAML文件來配置應(yīng)用程序的服務(wù)。然后,使用單個(gè)命令,您可以從配置中創(chuàng)建并啟動(dòng)所有服務(wù)該應(yīng)用使用 sudo apt install docker-compose 安裝
調(diào)整目錄結(jié)構(gòu)
在我們現(xiàn)在工作目錄外面再加一層目錄,大致是: 工作目錄 > docker-learn (以前的工作目錄) && docker-compose.yaml
目錄樹形結(jié)構(gòu):
編輯 docker-compose.yaml
docker-compose 包含多個(gè)指令,并采用yaml語(yǔ)言編寫.可以理解為把我們?cè)诿钚羞\(yùn)行的 run 命令參數(shù)寫到了文件里,經(jīng)過統(tǒng)一的工具協(xié)調(diào)啟動(dòng).
主要指令:
version 版本信息,不知道為什么必須是 3
version: 3
services 需要編排的服務(wù)列表,本次我們主要編寫一個(gè)叫做 docker-learn 的服務(wù)
services:
docker-compose.yaml 全文
version: "3" services: # 服務(wù)名 docker-learn: # 該服務(wù)是否以特權(quán)啟動(dòng) , 即 --privileged privileged: true # 構(gòu)建 build: # 構(gòu)建上下文 即: docker build ./docker-learn context: ./docker-learn # 端口映射,即 -p 80:80 ports: - 80:80 # 對(duì)外暴露的端口 ,相當(dāng)于Dockerfile 的 EXPOSE 指令 # EXPOSE指令只是聲明了容器應(yīng)該打開的端口,但是并沒有實(shí)際上將它打開! # 該選項(xiàng)在 docker run -it -P(大寫) 時(shí)會(huì)真的起作用 expose: - 80 # 目錄映射 , 相當(dāng)于 docker run -v # volumes: # - ./logs/php-fpm:/var/log/php-fpm # - ./logs/nginx:/var/log/nginx
使用docker-compose 啟動(dòng)鏡像
關(guān)閉其他運(yùn)行中的容器,以免與我們即將運(yùn)行的容器沖突
docker ps | awk "{print $1}" | grep -v CON | xargs docker kill
啟動(dòng)鏡像
多帶帶 up 不使用服務(wù)名會(huì)運(yùn)行 services 中定義的所有容器.
如果services中有多個(gè)服務(wù),那么可以使用 up 服務(wù)名來多帶帶 up 一個(gè)服務(wù)容器
up 默認(rèn)會(huì)使用 build:context 中的 Dockerfile 文件編譯好的鏡像進(jìn)行容器啟動(dòng),--build 是強(qiáng)制再次使用 Dockerfile 進(jìn)行重新編譯鏡像再啟動(dòng) . 但是 --build 仍然會(huì)使用已經(jīng)存在的鏡像層的緩存
--force-recreate 重新編譯時(shí)不使用鏡像層緩存 , 完全重新編譯如果出現(xiàn) bind: address already in use 類似的提示 , 就換一個(gè) ports 里的綁定端口重試
docker-compose up [docker-learn] [--build] [--force-recreate]
我們發(fā)現(xiàn)現(xiàn)在訪問 127.0.0.1:8080 仍然可以看到 phpinfo
接入 jenkins 進(jìn)行持續(xù)集成更新中接入 kubernetes
更新中大功告成
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/27813.html
本期目標(biāo) : 基于 Centos 7.6 , 封裝出一個(gè)可用于運(yùn)行 php 項(xiàng)目的開箱即用鏡像本文不討論 dockerfile 語(yǔ)法 , 并且假設(shè)你懂得基本的類unix 操作系統(tǒng)常識(shí)并擁有類unix 運(yùn)行環(huán)境 (包括但不限于安裝了mac 或 linux 的實(shí)體機(jī) , 類unix虛擬機(jī) , 安裝了 MinGW 或 CygWin 的 windows 機(jī)器) , 并且認(rèn)為你懂得基本的 docker 操作...
本期目標(biāo) : 基于 Centos 7.6 , 封裝出一個(gè)可用于運(yùn)行 php 項(xiàng)目的開箱即用鏡像本文不討論 dockerfile 語(yǔ)法 , 并且假設(shè)你懂得基本的類unix 操作系統(tǒng)常識(shí)并擁有類unix 運(yùn)行環(huán)境 (包括但不限于安裝了mac 或 linux 的實(shí)體機(jī) , 類unix虛擬機(jī) , 安裝了 MinGW 或 CygWin 的 windows 機(jī)器) , 并且認(rèn)為你懂得基本的 docker 操作...
摘要:而所謂的持續(xù),就是說每完成一個(gè)完整的部分,就向下個(gè)環(huán)節(jié)交付,發(fā)現(xiàn)問題可以馬上調(diào)整。那么每完成一部分就測(cè)試,這是持續(xù)部署。這是一個(gè)免費(fèi)的源代碼,可以處理任何類型的構(gòu)建或持續(xù)集成。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。 導(dǎo)讀: 很久沒有更新文章了 最近公司在使用Spring Cloud構(gòu)建的項(xiàng)目中經(jīng)常會(huì)持續(xù)發(fā)布變更頻繁,一天中會(huì)出現(xiàn)發(fā)布多次的情況 在這種情況下對(duì)測(cè)試環(huán)境做了改造 ...
摘要:所以我們選一個(gè)倉(cāng)庫(kù)倉(cāng)庫(kù)比較多,我這里選用,都行,根據(jù)需求自行選擇訪問端口,然后就沒有然后了功能沒有那么強(qiáng)大,不過占用資源少,速度快,我們穩(wěn)定運(yùn)行了幾年了。 kubernetes集群三步安裝 CI 概述 用一個(gè)可描述的配置定義整個(gè)工作流 程序員是很懶的動(dòng)物,所以想各種辦法解決重復(fù)勞動(dòng)的問題,如果你的工作流中還在重復(fù)一些事,那么可能就得想想如何優(yōu)化了 持續(xù)集成就是可以幫助我們解決重復(fù)的代碼...
摘要:基于年底或年初沒有推廣的現(xiàn)狀,唯品會(huì)部門目前已經(jīng)做了兩年的時(shí)間。唯品會(huì)現(xiàn)狀唯品會(huì)目前線上有一千多個(gè)域,每個(gè)域之間相互的依賴比較復(fù)雜,每次的部署發(fā)布困難。這是唯品會(huì)的架構(gòu),主要包含持續(xù)集成和持續(xù)部署。 數(shù)人云上海&深圳兩地容器之Mesos/K8S/Swarm三國(guó)演義的嘉賓精彩實(shí)錄第三更來啦。唯品會(huì)是數(shù)人云Meetup的老朋友,去年曾做過RPC服務(wù)框架和Mesos容器化的分享。本次分享中,...
閱讀 1864·2021-09-22 15:45
閱讀 1649·2019-08-30 15:55
閱讀 1834·2019-08-29 11:16
閱讀 3308·2019-08-26 11:44
閱讀 711·2019-08-23 17:58
閱讀 2701·2019-08-23 12:25
閱讀 1633·2019-08-22 17:15
閱讀 3611·2019-08-22 16:09