Docker映象構建(五)
Docker 映象介紹
Docker映象構建分為兩種,一種是手動構建,另一種是Dockerfile(自動構建)
手動構建docker映象
案例:我們基於centos映象進行構建,製作自己的nginx映象
1 2 3 | docker run --name mynginx -it centos rpm -ivh http: //mirrors .aliyun.com /epel/epel-release-latest-7 .noarch.rpm yum install nginx -y |
我們需要修改nginx配置檔案,讓他執行在前臺
1 2 | vi /etc/nginx/nginx .conf daemon off; |
修改完之後我們退出,將mynginx本地提交
1 2 3 4 5 6 7 8 9 10 | [root@linux-node1 ~] # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2a8128fa6245 centos "/bin/bash" 9 minutes ago Exited (0) 2 minutes ago mynginx [root@linux-node1 ~] # docker commit -m "My Nginx" 2a8128fa6245 shhnwangjian/mynginx:v1 sha256:a8be358735525b50f49ca0bfe2b264427875333dcb1c02495b49dce4d1b10705 [root@linux-node1 ~] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE shhnwangjian /mynginx v1 a8be35873552 39 seconds ago 335.2 MB nginx latest 01f818af747d 3 weeks ago 181.6 MB centos latest 67591570dd29 4 weeks ago 191.8 MB |
上面commit命令一行註釋
- -m 描述
- 容器ID
- 第一個shhnwangjian是倉庫的名稱
- 第二個mynginx是映象的名稱
- v1 標籤,如果是最後一個版本我們可以打latest
我們現在啟動製作好的nginx映象
1 2 | [root@linux-node1 ~] # docker run --name mynginxv1 -d -p 88:80 shhnwangjian/mynginx:v1 nginx 21bb74c3979c26697b7f03a79c3ddb49363791d03160e07fd04617d7e8c00436<br><br> |
提示:最後面的nginx不是映象的nginx,而是服務的名稱
1 2 3 | [root@linux-node1 ~] # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 21bb74c3979c shhnwangjian /mynginx :v1 "nginx" 35 seconds ago Up 33 seconds 0.0.0.0:88->80 /tcp mynginxv1 |
Dockerfile
Dockerfile是由一行命令和語句組成的。
案例:我們基於centos映象進行自動構建(dockerfile)
規劃存放dockerfile檔案的目錄結構
1 2 3 4 | [root@linux-node1 ~] # cd /root [root@linux-node1 nginx] # mkdir -p dockerfile/nginx [root@linux-node1 nginx] # pwd /root/dockerfile/nginx |
建立檔案需注意:D需要大寫,當我們構建dockerfile的時候,docker預設會在我們當前目錄讀取一個名為Dockerfile的檔案。這時候的D必須大寫。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@linux-node1 nginx] # vim Dockerfile # This Dockerfile # Base image FROM centos # Maintainer MAINTAINER shhnwangjian xxx@163.com # Commands RUN rpm -ivh http: //mirrors .aliyun.com /epel/epel-release-latest-7 .noarch.rpm RUN yum install -y nginx && yum clean all RUN echo "daemon off;" >> /etc/nginx/nginx .conf ADD index.html /usr/share/nginx/html/index .html EXPOSE 80 CMD [ "nginx" ] |
說明:
- #井號代表註釋
- #Base image 除了註釋的第一行,必須是FROM,意思就是我們需要告訴dockerfile基礎映象是什麼
- #Maintainer 維護資訊
- #Commands 命令
- #ADD index.html 這個檔案需要我們在當前目錄下有才可以,我們配置我們可以準備好,然後使用ADD命令進行新增或修改
- EXPOSE 對外埠號
- CMD ["nginx"] 它要啟動的命令是nginx (就算是nginx服務)
我們寫好Dockerfile還需要一個index.html
1 | echo shhnwangjian > index.html |
開始構建
1 | docker build -t mynginx:v2 . |
提示:.代表構建的位置,我們是當前目錄。
構建完成
啟動容器
1 2 | [root@linux-node1 nginx] # docker run --name mynginxv2 -d -p 89:80 mynginx:v2 0c4f1703d96c63587825e62225ffc67a172b1233b958a320d881e5560383846d |
Dockerfile引數簡介:
- FROM (指定基礎映象)
- MAINTAINER (指定維護者資訊)
- RUN (在命令前面加上RUN)
- ADD (COPY檔案,會自動解壓)
- WORKDIR (設定當前工作目錄,類似於cd)
- VOLUME (設定卷,掛載主機目錄)
- EXPOSE (指定對外的埠)
- CMD (指定容器啟動後要乾的事情)
Dockerfile引數解釋
FROM
1 | 格式:FROM<image>或FROM<image>:<tag>。 |
解釋:FROM是Dockerfile裡的第一條指令(必須是),後面跟有效的映象名(如果該映象你的本地倉庫沒有則會從遠端倉庫Pull取)。然後後面的其它指令FROM的映象中執行。
MAINTAINER
1 | 格式:MAINTAINER <name> |
解釋:指定維護者資訊。
RUN
1 | 格式:RUN < command >或 RUN[ "executable" , "param1" , "param2" ]。 |
解釋:執行命令,命令較長使可以使用\來換行。推薦使用上面陣列的格式。
CMD
1 2 3 4 | 格式: CMD [ "executable" , "param1" , "param2" ] 使用 exec 執行,推薦方式; CMD command param1 param2 在 /bin/sh 中執行,提供給需要互動的應用; CMD [ "param1" , "param2" ] 提供給ENTRYPOINT的預設引數; |
解釋:CMD指定容器啟動時執行的命令,每個Dockerfile只能有一條CMD命令,如果指定了多條,只有最後一條會被執行。如果你在啟動容器的時候也指定的命令,那麼會覆蓋Dockerfile構建的映象裡面的CMD命令。
ENTRYPOINT
1 2 3 | 格式: ENTRYPOINT [ "executable" , "param1" , "param2" ] ENTRYPOINT command param1 param2(shell中執行)。 |
解釋:和CMD類似都是配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。ENTRYPOINT沒有CMD的可替換特性,也就是你啟動容器的時候增加執行的命令不會覆蓋ENTRYPOINT指定的命令。
所以生產實踐中我們可以同時使用ENTRYPOINT和CMD。
例:
1 2 | ENTRYPOINT [ "/usr/bin/rethinkdb" ] CMD [ "--help" ] |
USER
1 | 格式:USER daemon |
解釋:指定執行容器時的使用者名稱和UID,後續的RUN指令也會使用這裡指定的使用者。
EXPOSE
1 | 格式:EXPOSE<port> [<port>...] |
解釋:設定Docker容器內部暴露的埠號,如果需要外部訪問,還需要啟動容器時增加-p或者-P引數進行分配。
ENV
1 2 | 格式:ENV<key> <value> ENV <key>=<value> ... |
解釋:設定環境變數,可以在RUN之前使用,然後RUN命令時呼叫,容器啟動時這些環境變數都會被指定。
ADD
1 2 3 | 格式: ADD <src>... <dest> ADD [ "<src>" ,... "<dest>" ] |
解釋:將指定的<src>複製到容器檔案系統中的<dest>
所有拷貝到container中的檔案和資料夾許可權為0755,uid和gid為0
如果檔案是可識別的壓縮格式,則docker會幫忙解壓縮
VOLUME
1 | 格式:VOLUME [ "/data" ] |
解釋:可以將本地資料夾或者其他container的資料夾掛載到container中。
WORKDIR
1 | 格式:WORKDIR /path/to/workdir |
解釋:切換目錄,為後續的RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以多次切換(相當於cd命令), 也可以使用多個WORKDIR 指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。
例:
1 2 3 4 5 | WORKDIR /a WORKDIR b WORKDIR c RUN pwd 則最終路徑為 /a/b/c 。 |
ONBUILD
解釋:指定的命令在構建映象時並不執行,而是在它的子映象中執行。
ARG
1 | 格式:ARG<name>[=<default value>] |
解釋:ARG指定了一個變數在docker build的時候使用,可以使用--build-arg <varname>=<value>來指定引數的值,不過如果構建的時候不指定就會報錯。
相關文章
- docker構建映象Docker
- docker構建supervisor映象Docker
- Docker 構建 kubectl 映象Docker
- Docker映象構建原理解析(不裝docker也能構建映象)Docker
- docker 構建自己的映象Docker
- Docker 映象構建之 DockerfileDocker
- Docker 分階段構建映象Docker
- Docker 構建多平臺映象Docker
- Docker構建多平臺映象Docker
- Docker 構建PHP 映象環境DockerPHP
- Docker 映象分階段構建Docker
- 不用安裝docker也能構建docker映象Docker
- Docker(五)Docker映象講解Docker
- docker映象構建libreoffice轉換檔案Docker
- 構建 Docker 映象的 N 個小技巧Docker
- Docker從零構建php-nginx-alpine映象DockerPHPNginx
- SpringBoot 構建 Docker 映象的最佳 3 種方式Spring BootDocker
- apisix閘道器-構建docker映象構建及外掛化開發APIDocker
- 使用Docker buildx 為 .NET 構建多平臺映象DockerUI
- 使用 Docker 開發 - 使用多階段構建映象Docker
- docker:映象構建、倉庫、壓縮、匯入 二Docker
- Docker容器 關於映象構建的安全問題Docker
- Jenkins中構建(Build)Docker映象時出現permission deniedJenkinsUIDocker
- Docker映象構建:技術深度解析與實踐指南Docker
- 構建 Go 應用 docker 映象的十八種姿勢GoDocker
- Docker Buildx使用教程:使用Buildx構建多平臺映象DockerUI
- 構建私有映象
- DockerFile構建映象Docker
- [Dockerfile構建映象]Docker
- [第五篇]——Docker 映象加速Docker
- 怎樣去構建一個優質的Docker容器映象Docker
- 實戰Spring Boot 2.0系列(一) – 使用Gradle構建Docker映象Spring BootGradleDocker
- 實戰Spring Boot 2.0系列(一) - 使用Gradle構建Docker映象Spring BootGradleDocker
- Docker學習筆記(三):Dockerfile及多步驟構建映象Docker筆記
- 基於jib-maven-plugin快速構建微服務docker映象MavenPlugin微服務Docker
- Docker映象的構建以及資料卷和埠對映Docker
- 基於ubuntu映象構建redis映象UbuntuRedis
- 多多益善|基於Artifactory和Buildx構建多架構Docker映象UI架構Docker