Dockerfile創建鏡像介紹

1.介紹

????????Docker 提供了一種更便捷的方式,叫作 Dockerfile,docker build命令用于根據給定的Dockerfile構建Docker鏡像。

docker build語法: # docker build [OPTIONS] <PATH | URL | ->

常用選項說明
--build-arg,設置構建時的變量
--no-cache,默認false。設置該選項,將不使用Build Cache構建鏡像
--pull,默認false。設置該選項,總是嘗試pull鏡像的最新版本
--compress,默認false。設置該選項,將使用gzip壓縮構建的上下文
--disable-content-trust,默認true。設置該選項,將對鏡像進行驗證
--file, -f,Dockerfile的完整路徑,默認值為‘PATH/Dockerfile’
--isolation,默認--isolation="default",即Linux命名空間;其他還有process或hyperv
--label,為生成的鏡像設置metadata
--squash,默認false。設置該選項,將新構建出的多個層壓縮為一個新層,但是將無法在多個鏡像之間共享新層;設置該選項,實際上是創建了新image,同時保留原有image。
--tag, -t,鏡像的名字及tag,通常name:tag或者name格式;可以在一次構建中為一個鏡像設置多個tag
--network,默認default。設置該選項,Set the networking mode for the RUN instructions during build
--quiet, -q ,默認false。設置該選項,Suppress the build output and print image ID on success
--force-rm,默認false。設置該選項,總是刪除掉中間環節的容器
--rm,默認--rm=true,即整個構建過程成功后刪除中間環節的容器

示例:?
docker build -t newrain/bbauto:v2.1 .

docker build ?是docker創建鏡像的命令?
-t 是標識新建的鏡像屬于 newrain的 bbauto鏡像?
:v2 是tag?
"."是用來指明 我們的使用的Dockerfile文件當前目錄的?

2.?創建鏡像

2.1、 創建鏡像所在的文件夾和Dockerfile文件

[root@docker ~]# mkdir sinatra
[root@docker ~]# cd sinatra/
[root@docker sinatra]# touch Dockerfile

2.2、 在Dockerfile文件中寫入指令,每一條指令都會更新鏡像的信息例如:

[root@docker sinatra]# vim Dockerfile
#This is a comment 
FROM daocloud.io/library/centos:7
MAINTAINER newrain newrain@docker
RUN yum install -y wget
RUN touch a.txt
RUN mkdir /test

命令要大寫,"#"是注解。?
每一個指令后面需要跟空格,語法。
FROM 命令是告訴docker 我們的鏡像什么從哪里下載。?
MAINTAINER 是描述 鏡像的創建人。 ? maintainer
RUN 命令是在鏡像內部執行。就是說他后面的命令應該是針對鏡像可以運行的命令。??

? 2.3、創建鏡像

命令:
# docker build -t newrain/centso:7 .?

docker build ?是docker創建鏡像的命令 ?

2.4、創建完成后,從鏡像創建容器

3.?Dockerfile實例:容器化python的flask應用

????????實戰練習

1.創建一個nginx的dockerfile
[root@docker ~]# mkdir nginx  
[root@docker ~]# cd nginx/
[root@docker nginx]# vim Dockerfile
# This my first nginx Dockerfile
# Version 1.0
FROM daocloud.io/library/centos:7
MAINTAINER docker
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx-1.16.1.tar.gz /usr/local/
ADD epel-release-7-11.noarch.rpm /usr/local/
RUN rpm -ivh /usr/local/epel-release-7-11.noarch.rpm
RUN yum install -y gcc gcc-c++ make && yum -y install openssl openssl-devel && yum install -y zlib zlib-devel && yum clean all
RUN useradd -s /sbin/nologin -M www
WORKDIR /usr/local/nginx-1.16.1
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
EXPOSE 80
CMD /bin/sh -c 'nginx -g "daemon off;"'  #放前臺啟動[root@docker nginx]# ls   #將nginx的tar包與epel源上傳到nginx目錄下面
Dockerfile  epel-release-7-11.noarch.rpm  nginx-1.16.1.tar.gz
[root@docker nginx]# pwd
/root/nginx
[root@docker nginx]# docker build -t nginx:v7.1 .
[root@docker nginx]# docker run -itd --name nginx9 -p 8088:80 nginx:v7.1  #啟動容器
[root@docker nginx]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
fec1f3a37cb0        nginx:v7.1          "/bin/sh -c '/bin/sh…"   6 seconds ago       Up 5 seconds        0.0.0.0:8088->80/tcp

2.創建一個jenkins的Dockerfile
[root@docker ~]# mkdir tomcat 
[root@docker ~]# cd tomcat/
[root@docker tomcat]# vim Dockerfile
# This my first jenkins Dockerfile
# Version 1.0
FROM daocloud.io/library/centos:7
MAINTAINER docker
ENV JAVA_HOME /usr/local/jdk1.8.0_211
ENV TOMCAT_HOME /usr/local/apache-tomcat-8.5.47
ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
ADD apache-tomcat-8.5.47.tar.gz /usr/local/
ADD jdk-8u211-linux-x64.tar.gz /usr/local/
RUN rm -rf /usr/local/apache-tomcat-8.5.47/webapps/*
ADD jenkins.war /usr/local/apache-tomcat-8.5.47/webapps
RUN rm -rf apache-tomcat-8.5.47.tar.gz  apache-tomcat-8.5.47.tar.gz
EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat-8.5.47/bin/catalina.sh","run"]  #運行的命令
[root@docker tomcat]# pwd
/root/tomcat
[root@docker tomcat]# ls  #將jdk與tomcat還有jenkins的包上傳到tomcat目錄中
apache-tomcat-8.5.47.tar.gz  Dockerfile  jdk-8u211-linux-x64.tar.gz  jenkins.war
[root@docker tomcat]# docker build -t jenkins:v1 .
[root@docker tomcat]# docker run -itd --name jenkins1 -p 8081:8080 jenkins:v1

????????擴展----CMD與ENTRYPOINT區別

一、dockerfile中的 CMD

1、每個dockerfile中只能有一個CMD如果有多個那么只執行最后一個。
2、CMD 相當于啟動docker時候后面添加的參數看,舉個簡單例子:
# docker run -itd --name test image(鏡像) /bin/bash -c
a、鏡像名稱后面跟了一個/bin/bash -c ,其實等價于在dockerfile中的CMD ["/bin/bash","-c"]。
b、如果dockerfile中的CMD中有了CMD["/bin/bash","-c"],那么就不用在執行的時候再添加了,如果添加了參數的話那么就相當于要執行你添加的參數,默認的CMD中的參數就無效了。

二、dockerfile中的ENTRYPOINT
1、一個dockerfile中ENTRYPOINT也只能存在一個,若存在多個那么只執行最后一個,你可以理解為開機啟動的意思,和CMD有點像,不過還是有區別。

2、舉個簡單例子:
a、dockerfile中有ENTRYPOINT ["tail","-f","/var/log/nginx/access.log"],那么啟動的時候鏡像就執行了這個里面的內容,如果你像上面帶參數的話就相當于在這個執行的內容后面再加入參數。
案例:
如果我們的dockerfile中有a中的這句話然后我們啟動我們的docker:
#docker run -itd --name test image(鏡像名) /bin/bash -c

此時就相當于我們啟動docker的時候執行了:tail -f /var/log/nginx/access.log /bin/bash -c
這個命令明顯就不對.

?????????dockerfile優化

1、RUN 命令要盡量寫在一條里,每次 RUN 命令都是在之前的鏡像上封裝,只會增大不會減小
2、每次進行依賴安裝后,記得yum clean all【centos】?
#yum clean all 清除緩存中的rpm頭文件和包文件
3、選擇比較小的基礎鏡像。alpine

4.部署私有倉庫應用

????????私有倉庫鏡像:

????????registry --官方出品, 沒有圖形界面.Docker hub官方已提供容器鏡像registry,用于搭建私有倉庫,拉取鏡像:

[root@docker ~]# docker pull daocloud.io/library/registry:latest

????????運行容器:

[root@docker ~]# docker run -d -v /home/dockerdata/registry:/var/lib/registry --name "pri_registry" --restart=always -p 5000:5000 daocloud.io/library/registry參數解釋:
/home/dockerdata/registry表示為宿主機的目錄,如果不存在自動創建
-v映射目錄:  宿主機的目錄:容器目錄
把宿主機的目錄掛載到容器中,將數據目錄掛載出來就是為了防止docker私有倉庫這個容器被刪除的時候,倉庫里面的鏡像也被刪除。
-p 端口映射:本地端口:容器端口

????????注:如果創建容器不成功,報錯防火墻,解決方案如下

#systemctl stop firewalld
#yum install iptaqbles*
#systemctl start iptables
#iptables -F
#systemctl restart docker  
[root@docker ~]# docker ps 
CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS              PORTS                    NAMES
0823df72b160        daocloud.io/library/registry   "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   pri_registry 

????????連接容器查看端口狀態:

[root@docker ~]# docker exec -it  0823df7  /bin/sh
/ # netstat -lntp    #查看5000端口是否開啟
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::5000                 :::*                    LISTEN      1/registry
/ #

?????????在本機查看能否訪問該私有倉庫, 看看狀態碼是不是200:

[root@docker ~]# curl -I http://127.0.0.1:5000
HTTP/1.1 200 OK 

????????為了方便,下載1個比較小的鏡像,buysbox

[root@docker ~]# docker pull daocloud.io/library/busybox

????????上傳前必須給鏡像打tag 注明ip和端口:

[root@docker ~]# docker tag busybox 192.168.246.141:5000/busybox
宿主機查看目錄:
[root@docker ~]# ls /home/dockerdata/registry/docker/registry/v2/repositories/

???????? 下面這個Mysql是我測試的第二個鏡像,從daocloud拉取的:

[root@docker ~]# docker pull daocloud.io/library/mysql
[root@docker ~]# docker tag daocloud.io/library/mysql 192.168.246.141:5000/daocloud.io/library/mysql
[root@docker ~]# docker images

????????注:tag后面可以使用鏡像名稱也可以使用id,我這里使用的鏡像名稱,如果使用官方的鏡像,不需要加前綴,但是daocloud.io的得加前綴.

????????修改請求方式為http:

默認為https,不改會報以下錯誤:
Get https://master.up.com:5000/v1/_ping: http: server gave HTTP response to HTTPS client[root@docker ~]# vim /etc/docker/daemon.json    #不存在則創建
{ "insecure-registries":["192.168.246.141:5000"] }重啟docker:
[root@docker ~]# systemctl restart docker

????????上傳鏡像到私有倉庫:

[root@docker ~]# docker push 192.168.246.141:5000/busybox
[root@docker ~]# docker push 192.168.246.141:5000/daocloud.io/library/mysql

????????查看私有倉庫里的所有鏡像:

語法: # curl  http://ip:port/v2/repo名字/tags/list
[root@docker ~]# curl http://192.168.246.141:5000/v2/busybox/tags/list
{"name":"busybox","tags":["latest"]}[root@docker ~]# curl http://192.168.246.141:5000/v2/daocloud.io/library/mysql/tags/list
{"name":"daocloud.io/library/mysql","tags":["latest"]} 這條命令會查看倉庫下面所有的鏡像:
[root@docker ~]# curl http://192.168.246.141:5000/v2/_catalog

????????拉取鏡像測試:

1.先將剛才打了tags的鏡像刪掉
[root@docker ~]# docker rmi 192.168.246.141:5000/busybox
2.拉取鏡像:
[root@docker ~]# docker pull 192.168.246.141:5000/busybox
[root@docker ~]# docker images

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215304.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

上海亞商投顧:滬指探底回升 AI應用方向再度爆發

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一.市場情緒 三大指數昨日探底回升&#xff0c;早盤一度均跌超1%&#xff0c;午后集體拉升翻紅&#xff0c;深成指、創業板…

FFmpeg的AVcodecParser

文章目錄 結構體操作函數支持的AVCodecParser 這個模塊是AVCodec中的子模塊&#xff0c;專門用來提前解析碼流的元數據&#xff0c;為后面的解碼做準備&#xff0c;這一點對cuda-NVdec非常明顯&#xff0c;英偉達解碼器的元數據解析是放在CPU上的&#xff0c;所以就非常依賴這個…

為什么Vue3的proxy需要Reflect呢

何為proxy Proxy 對象用于定義或修改某些操作的自定義行為&#xff0c;可以在外界對目標對象進行訪問前&#xff0c;對外界的訪問進行改寫。 var proxy new Proxy(target, handler)ES6 中的proxy目前提供了13種可代理操作攔截的行為。 何為reflect ES6 標準中&#xff0c;…

遠程工作:自由職業者如何成功賺錢

前言 在這個不斷進步的數字化時代&#xff0c;遠程工作已經從一個可選的邊緣工作方式&#xff0c;成長為主流職業趨勢的一部分。特別是自從全球疫情改變了我們的生活和工作方式以來&#xff0c;遠程工作的概念不再是遙不可及的理想&#xff0c;而是已經成為許多人日常工作的現…

SpringBoot集成swagger2配置權限認證參數

作者簡介&#xff1a;大家好&#xff0c;我是擼代碼的羊駝&#xff0c;前阿里巴巴架構師&#xff0c;現某互聯網公司CTO 聯系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我進群&#xff0c;大家一起學習&#xff0c;一起進步&#xff0c;一起對抗…

[Java][JDK5]可變參數

我們可以假設一種情況&#xff0c;我們需要進行求和計算 在原先&#xff0c;我們考慮到參數只能傳入一個數字&#xff0c;因此我們會將需要求和的數字放在一個數組&#xff0c;傳入該數組進入方法再拆分計算 比如下面的例子:使用了增強for來對數組進行遍歷 public class Mai…

【Lidar】基于Python的三維點云數據轉二維平面+散點圖繪制

最近一直在搞點云相關的操作&#xff0c;有時候在處理點云數據時需要查看處理后的數據是否滿足需求&#xff0c;所以就想著寫一套展示點云的代碼。之前已經分享過如何可視化點云了&#xff0c;感興趣的可以自己去看下&#xff1a;【Lidar】基于Python的Open3D庫可視化點云數據。…

golang https server如何設計方便抓包定位且安全

代碼 測試 用go寫后端https服務時&#xff0c;需要定位https包中的內容是否符合預期。 有涉獵的朋友應該了解過https有一種keylog技術&#xff0c;它允許在HTTPS連接中捕獲和記錄SSL或TLS會話密鑰&#xff0c;以便于調試和分析加密流量。 本文將的就是通過可控制開啟和關閉的…

單身狗(Python)

題目描述 單身狗 “單身狗”是中文對于單身人士的一種愛稱。本題請你從上萬人的大型派對中找出落單的客人&#xff0c;以便給予特殊關愛。 輸入格式&#xff1a; 輸入第一行給出一個正整數 N&#xff08;≤50000&#xff09;&#xff0c;是已知夫妻/伴侶的對數&#xff1b;…

CPU 混合推理,非常見大模型量化方案:“二三五六” 位量化

本篇文章聊聊網上聊的比較少的具體量化操作&#xff0c;非常見整型位數的量化&#xff0c;來自讓各種開源模型能夠在 CPU 環境、CPU & GPU 環境混合推理的技術方案&#xff1a;llama.cpp 。 寫在前面 接下來&#xff0c;有計劃分享一些關于各種開源模型的實踐內容。為了能…

安裝ThingBox Eclipse Plugin

1. ChatGPT問 The latest version of the ThingBox Eclipse Plugin requires Eclipse IDE 2021-06 or later. 2. PTC官網下載 MED-61378-CD-092_F000_Eclipse-Plugin-9-0-1.zip文件, 和 MED-61098-CD-085_F000_ThingWorx-Extension-SDK-8-5-0&#xff08;需要賬號&#xff09…

虛擬化邏輯架構:KVM虛擬機通過OVS端口組實現網絡連接

目錄 一、實驗 1.CentOS 7 安裝 OpenVSwitch(構建RPM安裝包&#xff09; 2.KVM虛擬機通過OVS端口組實現網絡連接 二、問題 1.安裝openvswitch-2.5.10報錯 2.virt-install未找到命令 3.如何刪除自定義網絡 一、實驗 1.CentOS 7 安裝 OpenVSwitch(構建RPM安裝包&#xff…

字符串知識點

一. 1.字符占據一個字節 2.字符數組&#xff1a;char name[15] { W, a, n, g, L, i}; 字符串&#xff1a;char name[15] “Wang Li”&#xff1b; 二. 1.字符串&#xff1a;為有效長度&#xff08;有效字符的個數&#xff09;而不是字符數組的長度&#xff1b; 2.&#…

創建一個有陰影的threejs三維幾何體

import * as THREE from "three" import { OrbitControls } from three/examples/jsm/controls/OrbitControlsconst width window.innerWidth; const height window.innerHeight;//創建場景 const scene new THREE.Scene(); scene.background new THREE.Color(#6…

LinuxBasicsForHackers筆記 --Python 腳本基礎

添加Python模塊 Python 有一個專門用于安裝和管理 Python 包的包管理器&#xff0c;稱為 pip&#xff08;Pip Installs Packages&#xff09;。由于我們在這里使用 Python 3&#xff0c;因此您將需要 Python 3 的 pip 來下載和安裝軟件包。默認情況下應包含 Pip&#xff0c;但…

學習Node.js與Webpack總結

今天學習了模塊化的簡介&#xff0c;其實一個項目是由很多個模塊文件組成的&#xff0c;它們有它們各自的功能和用途來協助這個項目的完成&#xff0c;這樣的模塊組成有很多的好處比如提高代碼的復用性、還可以按需加載、還有獨立的作用域&#xff0c;還需要搞清楚的一點就是No…

如何截取Hive數組中的前N個元素?

文章目錄 1、需求描述2、使用索引3、使用posexplode()4、轉換為字符串操作 1、需求描述 需求&#xff1a;截取任意給定數組中的前N個元素&#xff0c;返回截取后的子數組 假設我們有如下三種類型的Hive數組&#xff1a; select array(1,2,3,4) -- [1,2,3,4] selec…

vue前端訪問Django channels WebSocket失敗

現象 前端報錯&#xff1a;SSH.vue:51 WebSocket connection to ‘ws://127.0.0.1:8000/server/terminal/120.59.88.26/22/1/’ failed: 后端報錯&#xff1a;Not Found: /server/terminal/120.79.83.26/22/1/ 原因 django的版本與channels的版本不匹配&#xff08;django…

關于個人職業選擇

職業選擇&#xff0c;一直是個老生常談的話題。這并不是一個容易做的決定。 讓我們來看看AI怎么說。 首先是方向性的回答&#xff1a; 然后是一些具體的回答 我個人比較傾向于深耕網絡安全。這是一個很有趣也是一個持續發展著的領域。 不知道關于這個事情你怎么看&#xff0…

在線學習平臺-課程分頁、用戶管理、教師查詢

在線學習平臺------手把手教程&#x1f448; 用戶管理 添加功能增強 新增屬性 若依里的用戶模塊(SysUser)是沒有課程這一屬性的,要實現我們自己的課程分頁查詢功能 這個位置傳入的實體類SysUser要加上classId,記得加上get、set方法 更改sql語句 ctrl 鼠標左鍵不斷點進去…