Docker?鏡像構(gòu)建保姆級(jí)入門(mén)示例教程
一、概述
- Dockerfile 是一個(gè)用來(lái)構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說(shuō)明。
官方文檔:
Dockerfile 示例:
二、Dockerfile 結(jié)構(gòu)
Dockerfile 結(jié)構(gòu)主要分為四部分:
- 基礎(chǔ)鏡像信息
- 維護(hù)者信息
- 鏡像操作指令
- 容器啟動(dòng)時(shí)執(zhí)行指令 (CMD/ENTRYPOINT)
- 【溫馨提示】Dockerfile 每行支持一條指令,每條指令可攜帶多個(gè)參數(shù)(支持&&),支持使用以“#“號(hào)開(kāi)頭的注釋?zhuān)╦ason 文件不支持#注釋?zhuān)且卜潜仨殱M(mǎn)足上面的四點(diǎn)。
三、常用 Dockerfile 操作指令
- ARG—— 定義創(chuàng)建鏡像過(guò)程中使用的變量 ,唯一一個(gè)可以在 FROM 之前定義 。
- FROM——基于某個(gè)鏡像, FROM前面只能有一個(gè)或多個(gè)ARG指令 。
- MAINTAINER(已棄用) —— 鏡像維護(hù)者姓名或郵箱地址 。
- VOLUME —— 指定容器掛載點(diǎn)到宿主機(jī)自動(dòng)生成的目錄或其他容器
- RUN——執(zhí)行鏡像里的命令,跟在 liunx 執(zhí)行命令一樣,只需要在前面加上 RUN 關(guān)鍵詞就行。
- COPY——復(fù)制本地(宿主機(jī))上的文件到鏡像。
- ADD——復(fù)制并解壓(宿主機(jī))上的壓縮文件到鏡像。
- ENV——設(shè)置環(huán)境變量。
- WORKDIR —— 為 RUN、CMD、ENTRYPOINT、COPY 和 ADD 設(shè)置工作目錄,就是切換目錄 。
- USER —— 為 RUN、CMD、和 ENTRYPOINT 執(zhí)行命令指定運(yùn)行用戶(hù)。
- EXPOSE —— 聲明容器的服務(wù)端口(僅僅是聲明) 。
- CMD—— 容器啟動(dòng)后執(zhí)行的命令 ,多個(gè) CMD 只會(huì)執(zhí)行最后一個(gè),跟 ENTRYPOINT 的區(qū)別是,CMD 可以作為 ENTRYPOINT 的參數(shù),且會(huì)被 yaml 文件里的 command 覆蓋。
- ENTRYPOINT—— 容器啟動(dòng)后執(zhí)行的命令 ,多個(gè)只會(huì)執(zhí)行最后一個(gè)。
- HEALTHCHECH —— 健康檢查 。
- ONBUILD——它后面跟的是其它指令,比如 RUN, COPY 等,而這些指令,在當(dāng)前鏡像構(gòu)建時(shí)并不會(huì)被執(zhí)行。只有當(dāng)以當(dāng)前鏡像為基礎(chǔ)鏡像,去構(gòu)建下一級(jí)鏡像的時(shí)候才會(huì)被執(zhí)行。
- LABEL——LABEL 指令用來(lái)給鏡像添加一些元數(shù)據(jù)(metadata),以鍵值對(duì)的形式 ,替換 MAINTAINER。
1)鏡像構(gòu)建(docker build)
docker build -t text:v1 . --no-cache # 要在構(gòu)建后將映像標(biāo)記到多個(gè)存儲(chǔ)庫(kù)中,請(qǐng)?jiān)谶\(yùn)行命令-t時(shí)添加多個(gè)參數(shù) docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest . ### 參數(shù)解釋 # -t:指定鏡像名稱(chēng) # . :當(dāng)前目錄Dockerfile # -f:指定Dockerfile路徑 # --no-cache:不緩存
2)運(yùn)行容器測(cè)試(docker run)
# 非交互式運(yùn)行 docker run centos:7.4.1708 /bin/echo "Hello world" ### 交互式執(zhí)行 # -t: 在新容器內(nèi)指定一個(gè)偽終端或終端。 #-i: 允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。 # 會(huì)登錄到docker環(huán)境中,交互式 docker run -it centos:7.4.1708 /bin/bash # -d:后臺(tái)執(zhí)行,加了 -d 參數(shù)默認(rèn)不會(huì)進(jìn)入容器 docker run -itd centos:7.4.1708 /bin/bash ### 進(jìn)入容器 # 在使用 -d 參數(shù)時(shí),容器啟動(dòng)后會(huì)進(jìn)入后臺(tái)。此時(shí)想要進(jìn)入容器,可以通過(guò)以下指令進(jìn)入: #docker exec -it :推薦大家使用 docker exec -it 命令,因?yàn)榇嗣顣?huì)退出容器終端,但不會(huì)導(dǎo)致容器的停止。 #docker attach:容器退出,會(huì)導(dǎo)致容器的停止。 docker exec -it b2c0235dc53 /bin/bash docker attach b2c0235dc53
3)ARG
- 構(gòu)建參數(shù),與 ENV 作用一致。不過(guò)作用域不一樣。ARG 設(shè)置的環(huán)境變量?jī)H對(duì) Dockerfile 內(nèi)有效,也就是說(shuō)只有 docker build 的過(guò)程中有效,構(gòu)建好的鏡像內(nèi)不存在此環(huán)境變量。唯一一個(gè)可以在 FROM 之前定義 。構(gòu)建命令 docker build 中可以用 --build-arg <參數(shù)名>=<值> 來(lái)覆蓋。
語(yǔ)法格式:
ARG <參數(shù)名>[=<默認(rèn)值>]
示例:
# 在FROM之前定義ARG,只在 FROM 中生效 ARG VERSION=laster FROM centos:${VERSION} # 在FROM之后使用,得重新定義,不需要賦值 ARG VERSION RUN echo $VERSION >/tmp/image_version
4)FROM
- 定制的鏡像都是基于 FROM 的鏡像 ,【必選項(xiàng)】
語(yǔ)法格式:
FROM [--platform=<platform>] <image> [AS <name>] FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
- 如果引用多平臺(tái)圖像,可選--platform標(biāo)志可用于指定圖像的平臺(tái)。FROM例如,linux/amd64、 linux/arm64或windows/amd64。默認(rèn)情況下,使用構(gòu)建請(qǐng)求的目標(biāo)平臺(tái)。全局構(gòu)建參數(shù)可用于此標(biāo)志的值,例如允許您將階段強(qiáng)制為原生構(gòu)建平臺(tái) ( --platform=$BUILDPLATFORM),并使用它交叉編譯到階段內(nèi)的目標(biāo)平臺(tái)。
示例:
ARG VERSION=latest FROM busybox:$VERSION # FROM --platform="linux/amd64" busybox:$VERSION ARG VERSION RUN echo $VERSION > image_version
5)MAINTAINER(已棄用)
- 鏡像維護(hù)者信息
語(yǔ)法格式:
MAINTAINER <name>
示例:
LABEL org.opencontainers.image.authors="SvenDowideit@home.org.au"
6)VOLUME
- 定義匿名數(shù)據(jù)卷。在啟動(dòng)容器時(shí)忘記掛載數(shù)據(jù)卷,會(huì)自動(dòng)掛載到匿名卷。
作用:
- 避免重要的數(shù)據(jù),因容器重啟而丟失,這是非常致命的。
- 避免容器不斷變大。
- 在啟動(dòng)容器 docker run 的時(shí)候,我們可以通過(guò) -v 參數(shù)修改掛載點(diǎn)。
語(yǔ)法格式:
# 后面路徑是容器內(nèi)的路徑,對(duì)應(yīng)宿主機(jī)的目錄是隨機(jī)的 VOLUME ["<路徑1>", "<路徑2>"...] VOLUME <路徑>
示例:
FROM ubuntu RUN mkdir /myvol RUN echo "hello world" > /myvol/greeting VOLUME /myvol
7)RUN
- 用于執(zhí)行后面跟著的命令行命令。
語(yǔ)法格式:
- RUN (shell形式,命令在 shell 中運(yùn)行,默認(rèn)/bin/sh -c在 Linux 或cmd /S /CWindows 上)
- RUN ["executable", "param1", "param2"](執(zhí)行形式)
示例:
# 以下三種寫(xiě)法等價(jià) RUN /bin/bash -c 'source $HOME/.bashrc; \ echo $HOME' RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]
8)COPY
- 拷貝(宿主機(jī))文件或目錄到容器中,跟 ADD 類(lèi)似,但不具備自動(dòng)下載或解壓的功能 。所有新文件和目錄都使用 0 的 UID 和 GID 創(chuàng)建,除非可選--chown標(biāo)志指定給定的用戶(hù)名、組名或 UID/GID 組合以請(qǐng)求復(fù)制內(nèi)容的特定所有權(quán)。
語(yǔ)法格式:
COPY [--chown=<user>:<group>] <src>... <dest> COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
示例:
# 添加所有以“hom”開(kāi)頭的文件: COPY hom* /mydir/ # ?替換為任何單個(gè)字符,例如“home.txt”。 COPY hom?.txt /mydir/ # 使用相對(duì)路徑,并將“test.txt”添加到<WORKDIR>/relativeDir/: COPY test.txt relativeDir/ # 使用絕對(duì)路徑,并將“test.txt”添加到/absoluteDir/ COPY test.txt /absoluteDir/ # 修改文件權(quán)限 COPY --chown=55:mygroup files* /somedir/ COPY --chown=bin files* /somedir/ COPY --chown=1 files* /somedir/ COPY --chown=10:11 files* /somedir/
9)ADD
- 拷貝文件或目錄到容器中,如果是 URL 或壓縮包便會(huì)自動(dòng)下載或自動(dòng)解壓 。
ADD 指令和 COPY 的使用格類(lèi)似(同樣需求下,官方推薦使用 COPY)。功能也類(lèi)似,不同之處如下:
- ADD 的優(yōu)點(diǎn):在執(zhí)行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會(huì)自動(dòng)復(fù)制并解壓到 <目標(biāo)路徑>。
- ADD 的缺點(diǎn):在不解壓的前提下,無(wú)法復(fù)制 tar 壓縮文件。會(huì)令鏡像構(gòu)建緩存失效,從而可能會(huì)令鏡像構(gòu)建變得比較緩慢。具體是否使用,可以根據(jù)是否需要自動(dòng)解壓來(lái)決定。
語(yǔ)法格式:
ADD [--chown=<user>:<group>] <src>... <dest> ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
示例:
# 通配符 ADD hom* /mydir/ # 相對(duì)路徑,拷貝到WORKDIR目錄下relativeDir/ ADD test.txt relativeDir/ # 絕對(duì)路徑 ADD test.txt /absoluteDir/ # 更改權(quán)限 ADD --chown=55:mygroup files* /somedir/ ADD --chown=bin files* /somedir/ ADD --chown=1 files* /somedir/ ADD --chown=10:11 files* /somedir/
ADD 和 COPY 的區(qū)別和使用場(chǎng)景:
- ADD 支持添加遠(yuǎn)程 url 和自動(dòng)提取壓縮格式的文件,COPY 只允許從本機(jī)中復(fù)制文件
- COPY 支持從其他構(gòu)建階段中復(fù)制源文件(--from)
- 根據(jù)官方 Dockerfile 最佳實(shí)踐,除非真的需要從遠(yuǎn)程 url 添加文件或自動(dòng)提取壓縮文件才用 ADD,其他情況一律使用 COPY
10)ENV
- 設(shè)置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個(gè)環(huán)境變量。
語(yǔ)法格式:
ENV <key1>=<value1> <key2>=<value2>... # 省略"="此語(yǔ)法不允許在單個(gè)ENV指令中設(shè)置多個(gè)環(huán)境變量,并且可能會(huì)造成混淆。 ENV <key> <value>
示例:
ENV JAVA_HOME=/usr/local/jdk ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \ MY_CAT=fluffy # 此語(yǔ)法不允許在單個(gè)ENV指令中設(shè)置多個(gè)環(huán)境變量,并且可能會(huì)造成混淆。 ENV JAVA_HOME /usr/local/jdk
11)WORKDIR
- 指定工作目錄。用 WORKDIR 指定的工作目錄,會(huì)在構(gòu)建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前創(chuàng)建好的)。
語(yǔ)法格式:
WORKDIR <工作目錄路徑>
示例:
FROM busybox ENV FOO=/bar WORKDIR ${FOO} # WORKDIR /bar
12)USER
- 用于指定執(zhí)行后續(xù)命令的用戶(hù)和用戶(hù)組,這邊只是切換后續(xù)命令執(zhí)行的用戶(hù)(用戶(hù)和用戶(hù)組必須提前已經(jīng)存在)。
語(yǔ)法格式:
USER <用戶(hù)名>[:<用戶(hù)組>] USER <UID>[:<GID>]
示例:
FROM busybox RUN groupadd --system --gid=9999 admin && useradd --system --home-dir /home/admin --uid=9999 --gid=admin admin USER admin:admin # USER 9999:9999
13)EXPOSE
- 暴露端口 ,僅僅只是聲明端口。
作用:
- 幫助鏡像使用者理解這個(gè)鏡像服務(wù)的守護(hù)端口,以方便配置映射。
- 在運(yùn)行時(shí)使用隨機(jī)端口映射時(shí),也就是 docker run -P 時(shí),會(huì)自動(dòng)隨機(jī)映射 EXPOSE 的端口。
語(yǔ)法格式:
# 默認(rèn)情況下,EXPOSE假定 TCP。 EXPOSE <port> [<port>/<protocol>...]
示例:
EXPOSE 80/TCP 443/TCP EXPOSE 80 443 EXPOSE 80/tcp EXPOSE 80/udp
14)CMD
- 類(lèi)似于 RUN 指令,用于運(yùn)行程序,但二者運(yùn)行的時(shí)間點(diǎn)不同:CMD 在構(gòu)建鏡像時(shí)不會(huì)執(zhí)行,在容器運(yùn)行 時(shí)運(yùn)行。
語(yǔ)法格式:
CMD <shell 命令> CMD ["<可執(zhí)行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 該寫(xiě)法是為 ENTRYPOINT 指令指定的程序提供默認(rèn)參數(shù)
- 推薦使用第二種格式,執(zhí)行過(guò)程比較明確。第一種格式實(shí)際上在運(yùn)行的過(guò)程中也會(huì)自動(dòng)轉(zhuǎn)換成第二種格式運(yùn)行,并且默認(rèn)可執(zhí)行文件是 sh。
示例:
CMD cat /etc/profile CMD ["/bin/sh","-c","/etc/profile"]
- 注意:如果 Dockerfile 中如果存在多個(gè) CMD 指令,僅最后一個(gè)生效。
15)ENTRYPOINT
- 類(lèi)似于 CMD 指令,但其不會(huì)被 docker run 的命令行參數(shù)指定的指令所覆蓋,而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序。但是, 如果運(yùn)行 docker run 時(shí)使用了 --entrypoint 選項(xiàng),將覆蓋 ENTRYPOINT 指令指定的程序。在 k8s 中 command 也會(huì)覆蓋 ENTRYPOINT 指令指定的程序
語(yǔ)法格式:
# exec形式,這是首選形式: ENTRYPOINT ["executable", "param1", "param2"] # 外殼形式: ENTRYPOINT command param1 param2
示例:
FROM ubuntu ENTRYPOINT ["top", "-b"] # CMD作為ENTRYPOINT參數(shù) CMD ["-c"] # 與下面的等價(jià) ENTRYPOINT ["top", "-b -c"] ENTRYPOINT top -b -c
- 注意:如果 Dockerfile 中如果存在多個(gè) ENTRYPOINT 指令,僅最后一個(gè)生效。
16)HEALTHCHECK
- 用于指定某個(gè)程序或者指令來(lái)監(jiān)控 docker 容器服務(wù)的運(yùn)行狀態(tài)。
語(yǔ)法格式:
HEALTHCHECK [OPTIONS] CMD command(通過(guò)在容器內(nèi)運(yùn)行命令檢查容器運(yùn)行狀況) HEALTHCHECK NONE(禁用從基礎(chǔ)映像繼承的任何運(yùn)行狀況檢查)
選項(xiàng)CMD有:
- --interval=DURATION(默認(rèn)30s:):間隔,頻率
- --timeout=DURATION(默認(rèn)30s:):超時(shí)時(shí)間
- --start-period=DURATION(默認(rèn)0s:):為需要時(shí)間引導(dǎo)的容器提供初始化時(shí)間, 在此期間探測(cè)失敗將不計(jì)入最大重試次數(shù)。
- --retries=N(默認(rèn)3:):重試次數(shù)
命令的exit status指示容器的運(yùn)行狀況??赡艿闹禐椋?/p>
- 0:健康狀態(tài),容器健康且已準(zhǔn)備完成。
- 1:不健康狀態(tài),容器工作不正常。
- 2:保留,不要使用此退出代碼。
示例:
FROM nginx MAINTAINER Securitit HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -f http://localhost/ || exit 1 CMD ["usr/sbin/nginx", "-g", "daemon off;"]
17)ONBUILD
- ONBUILD 是一個(gè)特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而這些指令,在當(dāng)前鏡像構(gòu)建時(shí)并不會(huì)被執(zhí)行。只有當(dāng)以當(dāng)前鏡像為基礎(chǔ)鏡像,去構(gòu)建下一級(jí)鏡像的時(shí)候才會(huì)被執(zhí)行。
語(yǔ)法格式:
ONBUILD <其它指令>
示例:
FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ]
18)LABEL
- LABEL 指令用來(lái)給鏡像添加一些元數(shù)據(jù)(metadata),以鍵值對(duì)的形式。用來(lái)替代 MAINTAINER。
語(yǔ)法格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:比如我們可以添加鏡像的作者
LABEL org.opencontainers.image.authors="runoob"
四、ARG 和 ENV 的區(qū)別
- ARG 定義的變量只會(huì)存在于鏡像構(gòu)建過(guò)程,啟動(dòng)容器后并不保留這些變量
- ENV 定義的變量在啟動(dòng)容器后仍然保留
五、CMD,ENTRYPOINT,command,args 場(chǎng)景測(cè)試
當(dāng)用戶(hù)同時(shí)在 kubernetes 中的 yaml 文件中寫(xiě)了command和args的時(shí)候,默認(rèn)是會(huì)覆蓋DockerFile中的命令行和參數(shù),完整的情況分類(lèi)如下:
1)command 和 args 不存在場(chǎng)景測(cè)試
- 如果 command 和 args 都沒(méi)有寫(xiě),那么用DockerFile默認(rèn)的配置。
Dockerfile FROM centos COPY test.sh / RUN chmod +x /test.sh ### ENTRYPOINT將作為的子命令啟動(dòng)/bin/sh -c,它不會(huì)傳遞參數(shù),要傳遞參數(shù)只能這樣傳參 # ENTRYPOINT ["/bin/sh","-c","/test.sh ENTRYPOINT"] ENTRYPOINT ["/test.sh","ENTRYPOINT"] CMD ["CMD"]
/tmp/test.sh
#!/bin/bash echo $*
構(gòu)建
docker build -t test1:v1 -f Dockerfile .
yaml 編排
cat << EOF > test1.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: nodeName: local-168-182-110 containers: - name: test image: test:v1 #command: ['/bin/sh','-c','/test.sh'] #args: ['args'] EOF
執(zhí)行
kubectl apply -f test.yaml
2)command 存在,但 args 存在場(chǎng)景測(cè)試
- 如果 command 寫(xiě)了,但 args 沒(méi)有寫(xiě),那么 Docker 默認(rèn)的配置會(huì)被忽略而且僅僅執(zhí)行.yaml文件的 command(不帶任何參數(shù)的)。
cat << EOF > test2.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test2 spec: replicas: 1 selector: matchLabels: app: test2 template: metadata: labels: app: test2 spec: nodeName: local-168-182-110 containers: - name: test2 image: test:v1 # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會(huì)輸出hello,只能通過(guò)這樣傳參,['/bin/sh','-c','/test.sh command'];CMD里面的參數(shù)會(huì)被忽略 command: ['/test.sh'] # command帶參數(shù) # command: ['/test.sh','command'] #args: ['args'] EOF
3)command 不存在,但 args 存在場(chǎng)景測(cè)試
- 如果 command 沒(méi)寫(xiě),但 args 寫(xiě)了,那么 Docker 默認(rèn)配置的 ENTRYPOINT 的命令行會(huì)被執(zhí)行,但是調(diào)用的參數(shù)是.yaml中的 args,CMD 的參數(shù)會(huì)被覆蓋,但是 ENTRYPOINT 自帶的參數(shù)還是會(huì)執(zhí)行的。
cat << EOF > test3.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test3 spec: replicas: 1 selector: matchLabels: app: test3 template: metadata: labels: app: test3 spec: nodeName: local-168-182-110 containers: - name: test3 image: test:v1 # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會(huì)輸出hello,只能通過(guò)這樣傳參,['/bin/sh','-c','/test.sh command'];CMD里面的參數(shù)會(huì)被忽略 # command: ['/test.sh'] # command帶參數(shù) # command: ['/test.sh','command'] args: ['args'] EOF
4)command 和 args 都存在場(chǎng)景測(cè)試
- 如果如果 command 和 args 都寫(xiě)了,那么 Docker 默認(rèn)的配置被忽略,使用.yaml的配置。
cat << EOF > test4.yaml apiVersion: apps/v1 kind: Deployment metadata: name: test4 spec: replicas: 1 selector: matchLabels: app: test4 template: metadata: labels: app: test4 spec: nodeName: local-168-182-110 containers: - name: test4 image: test:v1 # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會(huì)輸出hello,只能通過(guò)這樣傳參,['/bin/sh','-c','/test.sh command'];CMD里面的參數(shù)會(huì)被忽略 # command: ['/test.sh'] # command帶參數(shù),command和args都會(huì)帶上 command: ['/test.sh','command'] args: ['args'] EOF
鏡像構(gòu)建 Dockerfile 的介紹就到這里了!
到此這篇關(guān)于Docker 鏡像構(gòu)建保姆級(jí)入門(mén)實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Docker 鏡像構(gòu)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
遠(yuǎn)程連接Docker上的Mysql失敗的分析與解決方案
這篇文章主要介紹了遠(yuǎn)程連接Docker上的Mysql失敗的分析與解決方案的相關(guān)資料,需要的朋友可以參考下2023-01-01使用Docker-compose部署mysql的簡(jiǎn)單步驟
Docker-compose是Docker官方推出的一個(gè)工具,用于定義和運(yùn)行多個(gè) Docker 容器的應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于使用Docker-compose部署mysql的簡(jiǎn)單步驟,需要的朋友可以參考下2023-04-04Ubuntu 搭建基于Docker的LNMP+Redis的開(kāi)發(fā)環(huán)境(圖文)
這篇文章主要介紹了Ubuntu 搭建基于Docker的LNMP+Redis的開(kāi)發(fā)環(huán)境的相關(guān)資料,這里詳細(xì)介紹如何搭建的步驟,并附圖文,需要的朋友可以參考下2016-12-12使用docker在服務(wù)器運(yùn)行多個(gè)php版本
這篇文章主要介紹了利用docker在服務(wù)器運(yùn)行多個(gè)版本php,本文以php7為例,通過(guò)實(shí)例代碼的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04