Docker是一個用于開發(fā),,交付和運行應(yīng)用程序的開放平臺,。開發(fā)者可以利用Docker來快速交付,測試和部署代碼,,從而大大減少編寫代碼和在生產(chǎn)環(huán)境中運行代碼之間的差異,,尤其是在多人合作開發(fā)項目時保持開發(fā)和生產(chǎn)環(huán)境一致性有著很重要的意義。 Docker大家應(yīng)該很熟悉了,,Docker的安裝這里就直接省略了,,直接去 Docker官方 文檔安裝一下。 如何創(chuàng)建一個鏡像,,主要有兩種方法:1. 從現(xiàn)有的鏡像基礎(chǔ)上,,創(chuàng)建容器并自定義后Commit成鏡像;2. 利用Dockerfile,,根據(jù)自己的需要,,如同寫shell腳本一般,將自己需要搭建的容器環(huán)境所需的指令一條一條的匯集成指令集,,然后讓Docker根據(jù)Dockerfile來自動創(chuàng)建你想要的鏡像,。 本文在64位系統(tǒng)CentOS7.7上,并構(gòu)建一個PHP版本為7.4,,并帶有最新的Swoole和Redis擴展的自定義鏡像,,直接可以使用。本文演示時系統(tǒng)安裝的Docker版本是: [root@localhost ~]# **docker** **—version****Docker** **version** 19.03.6-rc1, **build** 77739**a9875**12 Dockerfile 是一個用來構(gòu)建鏡像的文本文件,,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說明,。 默認的官方php docker鏡像是不帶redis和swoole擴展的,甚至連gd,、opcache,、pdo_mysql等擴展也要自己配置。以下是Dockerfile文件內(nèi)容: *# 設(shè)置時區(qū)*ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
*# 更新安裝依賴包和PHP核心拓展*RUN apt-get update && apt-get install -y —no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev curl \ && rm -r /var/lib/apt/lists/* \ && docker-php-ext-configure gd \ && docker-php-ext-install -j$(nproc) gd opcache pdo_mysql gettext sockets
*# 安裝 PECL 拓展,,安裝Redis,,swoole*RUN pecl install redis \ && pecl install swoole \ && docker-php-ext-enable redis swoole
*# 安裝 Composer*ENV COMPOSER_HOME /root/composer
RUN curl -sS https:///installer | php — —install-dir=/usr/local/bin —filename=composer
ENV PATH $COMPOSER_HOME/vendor/bin:$PATHWORKDIR /data12345678910111213141516171819202122 Dockerfile文件中使用了一些指令關(guān)鍵字,以下是簡要說明: FROM 指定哪個鏡像作為你的基礎(chǔ)鏡像,,我們是以官方的php:7.4-fpm作為基礎(chǔ)鏡像 ENV 用于配置環(huán)境變量,,在其他指令中可以直接引用ENV設(shè)置的環(huán)境變量 RUN 執(zhí)行命令并創(chuàng)建新的Image Layer,看起來就跟shell命令一樣 WORKDIR 指定工作目錄,,如果使用docker exec進入容器時,,默認目錄就是指定的工作目錄,如/data Dockerfile文件還有很多指令,,如EXPOSE:暴露端口,,VOLUME:定義匿名卷,等等,有興趣的同學(xué)可以自行查找相關(guān)資料,,本文不做過多講解,。 本文的Dockerfile文件除了安裝必要的PHP依賴包,我們還使用pecl安裝了redis和swoole,,設(shè)置了安裝Composer的命令,。 注意了,使用pecl安裝的redis和swoole擴展,,不需要在php.ini中增加so擴展了,,使用docker-php-ext-enable即可啟用這些擴展。
保存好Dockerfile文件,,在同一目錄下執(zhí)行構(gòu)建鏡像的代碼: **docker** **build** **-t** **hwphp**:7.4.2 .1 以上代碼構(gòu)建了一個名為hwphp,,標(biāo)簽版本號為7.4.2的PHP鏡像,注意在版本號后空格后還有一個點.,,表示當(dāng)前目錄,。此外在構(gòu)建時,執(zhí)行了apt-get update,,有可能網(wǎng)絡(luò)原因?qū)е赂聢?zhí)行特別慢,,因此可以將本地源設(shè)置為國內(nèi)如阿里云的鏡像更新升級。 執(zhí)行完build構(gòu)建代碼后,,如果回顯以下信息說明構(gòu)建成功,。 Removing intermediate container d00d6a4b2a21
**—>** 1c1cd84bbd3f
Successfully built 1c1cd84bbd3f
Successfully tagged hwphp:7.4-fpm1234 使用docker images查看鏡像: [root@localhost ~]# **docker** **images****REPOSITORY** **TAG** **IMAGE** **ID** **CREATED** **SIZE**
**hwphp** 7.4-fpm 1**c1cd84bbd3f** 42 **hours** **ago** 443**MB**123 然后執(zhí)行命令啟動容器: **docker** **run** **-d** **—name** **myhwphp-fpm** **hwphp**:7.4-fpm1 再執(zhí)行docker ps命令,可以看到容器已經(jīng)啟動并運行,。 [root@localhost ~]*# docker run -d —name myhwphp-fpm hwphp:7.4-fpm*9057a9da4b45ae634ba1b6d0d8e5f92886ca830c5d854eb96a97750a7b846c97[root@localhost ~]*# docker ps*CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9057a9da4b45 hwphp:7.4-fpm “docker-php…” 8 seconds ago Up 7 seconds 9000/tcp myhwphp-fpm12345 現(xiàn)在進入該容器: docker **exec** -it myhwphp-fpm bash使用php -v查看下PHP版本信息:
root@9057a9da4b45:/data*# php -v*PHP 7.4.2 (cli) (built: Jan 24 2020 06:56:01) ( NTS )Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.2, Copyright (c), by Zend Technologies
使用php -m查看PHP擴展
…
**PDO**
**pdo_mysql**
**pdo_sqlite**
**Phar**
**posix**
**readline**
**redis**
**Reflection**
**session**
**SimpleXML**
**sockets**
**sodium**
**SPL**
**sqlite3**
**standard**
**swoole**
**tokenizer**
**xml**
**xmlreader**
**xmlwriter**
**Zend** **OPcache**
**zlib**[Zend Modules]**Zend** **OPcache**12345678910111213141516171819202122232425262728293031323334 我們可以看到redis,,swoole,pdo等擴展已經(jīng)啟用,。 你可以使用php —ri swoole查看swoole的相關(guān)信息: root@9057a9da4b45:/data*# php —ri swoole*swoole
Swoole => enabled
Author => Swoole Team <[email protected]>Version => 4.4.15
Built => Feb 1 2020 21:28:3712345678 現(xiàn)在我們就可以像其他容器一樣使用自定義PHP鏡像下的容器了,。 附:常用的Docker命令 #1.顯示所有容器
docker ps -a[包括未運行] -q[僅顯示編號]
#2.停止、重啟,、啟動某一容器
docker stop|restart|start 容器id|容器名
#3.停止,、重啟、啟動所有容器
docker stop|restart|start $(docker ps -a -q)
#4.獲取容器
ipdocker inspect 容器id
#5.容器開機啟動
docker update --restart=always $(docker ps -a -q)
#6.刪除容器[需要先停止運行]
docker rm 容器id|容器名
#7.刪除鏡像[需要先停止且刪除所有關(guān)聯(lián)的容器]
docker rmi 鏡像id
#8.進入容器
docker exec -it 容器id|容器名 bash
#9.搜索鏡像
docker search 鏡像關(guān)鍵字
#10.下載鏡像
docker pull 鏡像名字:版本號
#11.查看本機所有docker鏡像
docker images
#12.導(dǎo)出鏡像
docker save -o 導(dǎo)出的鏡像文件.tar 鏡像名字:版本號
#13.導(dǎo)入鏡像
docker load -i 鏡像文件.tar
#14.從容器里面拷文件到宿主機
docker cp 容器名:要拷貝的文件在容器里面的路徑 要拷貝到宿主機的相應(yīng)路徑
#如:docker cp myphp:/home/data/test/js/test.js /opt
#15.從宿主機拷文件到容器里面docker cp 要拷貝的文件路徑 容器名:要拷貝到容器里面對應(yīng)的路徑#如:docker cp /opt/test.js myphp:/home/data/test/js
|