docker pull [IMAGE_NAME] # 拉取鏡像
docker run -it -p 5000:5000 ubuntu /bin/bash參數說明: -i: 交互式操作 -t: 終端 -d: 後臺運行 -p: 埠映射 主機埠:容器埠 -v: 目錄映射 本地目錄:/容器目錄 ubuntu: ubuntu 鏡像 /bin/bash:放在鏡像名後的是命令
docker exec -it [CONTAINER_ID] /bin/bash # 進入容器
docker export [CONTAINER_ID] > ubuntu.tar # 導出容器docker import ubuntu.tar # 導入容器為鏡像
docker save -o ubuntu.tar [IMAGE_NAME] # 導出鏡像# 使用鏡像ID打包的話導致解壓的出來的鏡像沒有名字docker load < ubuntu.tar # 導入鏡像docker tag [IMAGE_ID] [IMAGE_NAME]:[IMAGE_TAG] # 重命名鏡像
docker container update --restart=always ubuntu # 更新容器配置,開機自啟Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
在 Dockerfile 文件的存放目錄下,執行構建動作。
以下示例,通過目錄下的 Dockerfile 構建一個 nginx:v3(鏡像名稱:鏡像標籤)。
上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如複製),docker build 命令得知這個路徑後,會將路徑下的所有內容打包。
解析:由於 docker 的運行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的文件。這就需要把我們本機的指定目錄下的文件一起打包提供給 docker 引擎使用。
如果未說明最後一個參數,那麼默認上下文路徑就是 Dockerfile 所在的位置。
注意:上下文路徑下不要放無用的文件,因為會一起打包發送給 docker 引擎,如果文件過多會造成過程緩慢。2.2.1 RUN
用於執行後面跟著的命令行命令。有以下倆種格式:
shell 格式:
RUN <命令行命令># <命令行命令> 等同於,在終端操作的 shell 命令。exec 格式:
RUN ["可執行文件", "參數1", "參數2"]# 例如:# RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offlineDockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。
FROM centosRUN yum -y install wgetRUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"RUN tar -xvf redis.tar.gzFROM centosRUN yum -y install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz2.2.2 COPY
複製指令,從上下文目錄中複製文件或者目錄到容器裡指定路徑。
格式:
COPY [--chown=<user>:<group>] <源路徑1>... <目標路徑>COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"][--chown=<user>:<group>]:可選參數,用戶改變複製到容器內文件的擁有者和屬組。
COPY ['source1.txt', 'source2.txt', 'source3.txt', 'Path']2.2.3 ADD
ADD 指令和 COPY 的使用格類似(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:
ADD 的優點:在執行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會自動複製並解壓到 <目標路徑>。
ADD 的缺點:在不解壓的前提下,無法複製 tar 壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。
2.2.4 CMD
類似於 RUN 指令,用於運行程序,但二者運行的時間點不同:
CMD 在 docker run 時運行。
RUN 是在 docker build。
作用:為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD 指令指定的程序可被 docker run 命令行參數中指定要運行的程序所覆蓋。
注意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最後一個生效。
格式:
CMD <shell 命令> CMD ["<可執行文件或命令>","<param1>","<param2>",...]2.2.5 ENV
設置環境變量,定義了環境變量,那麼在後續的指令中,就可以使用這個環境變量。
格式:
ENV <key> <value>ENV <key1>=<value1> <key2>=<value2>...以下示例設置 NODE_VERSION = 7.2.0 , 在後續的指令中可以通過 $NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"ENV key1=value1 key2=value22.2.6 VOLUME
定義匿名數據卷。在啟動容器時忘記掛載數據卷,會自動掛載到匿名卷。
作用:
VOLUME ["<路徑1>", "<路徑2>"...]VOLUME <路徑>在啟動容器 docker run 的時候,我們可以通過 -v 參數修改掛載點。
2.2.7 ENTRYPOINT
格式和 RUN 指令格式一樣,分為 exec 格式和 shell 格式。
ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程序及參數。
ENTRYPOINT 在運行時也可以替代,不過比 CMD 要略顯繁瑣,需要通過 docker run 的參數 --entrypoint 來指定。
當指定了 ENTRYPOINT 後,CMD 的含義就發生了改變,不再是直接的運行其命令,而是將 CMD 的內容作為參數傳給 ENTRYPOINT 指令,換句話說實際執行時,將變為: