1、docker怎麼修改拉取源從指定的國內倉庫拉取鏡像
我看到這個問題首先想到的就是去docker hub搜官方的鏡像.然後看了redis的Dockerfile。官方的方法是(對應樓上的1)Additionally, If you want to use your own redis.conf ...You can create your own Dockerfile that adds a redis.conf from the context into /data/, like soFROM redisCOPY redis.conf /usr/local/etc/redis/redis.confCMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]或者$ docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf這個鏡像啟動的時候就默認運行redis-server了。無法通過docker run -it redis修改。試圖docker run -it redis /bin/bash進去覆蓋默認的啟動命令然後添加自己的配置就好了。希望能幫到你
2、如何合並兩個Docker 鏡像
如何通過docker history命令來對docker 鏡像進行反向工程推測它們的Dockerfile,從而在對不同的Docker 鏡像反向工程獲取Dockerfile 之後合並成一個。
常言道,「不要重復發明輪子!」
在使用docker 時,最好在構建你自己的鏡像前上 Docker Hub 尋找一些直接可以用的。把你的軟體架構分布到一系列容器中,每一個容器只做一件事情是非常有用的。構建分布式應用的最好的基石是使用來自Docker Hub 的官方鏡像,因為你可以信任它們的質量。
在某些情況下,你可能想讓一個容器做兩件不同的事情。在另一些情況下,你可能想讓一個Docker 鏡像包含來自兩個不同鏡像的依賴。 如果你有每個鏡像的Dockerfile,這是非常簡單的。將它們組織到一個Dockerfile 里然後build 即可。
但是,如果大多數時間你都在使用Docker Hub 上准備好的鏡像,你將沒有它們的源Dockerfile。我花了一些時間來找這樣一個工具,它可以合並(或flatten)兩個不同的我沒有它們的 Dockerfile 的Docker 鏡像。即我在找一個能做下面這件事的東西:
image 1 --
\
---> merged_image_12
/
image 2 --
盡管這個問題在之前的兩個進程中被關閉了( 1 , 2 ),當你想這么做時,這個問題仍然會產生。
3、如何使用Dockerfile構建鏡像
你好,使用方法如下:
Dockerfile結構
dockerfile由4部分信息組成:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# Base image to use, this must be set as the first line
FROM ubuntu
# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user [email protected]
# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /usr/sbin/nginx
其中#表注釋,可以標注一些說明性的文字。
FROM關鍵字指定鏡像的來源,默認為DockerHub,也可以寫私有倉庫的鏡像,例如:localhost:5000/centos:6.7,如果本地已經存在指定的鏡像名稱,則會從本地緩存直接獲取。MAINTAINER 指定鏡像的作者,之後為鏡像操作執行RUN、ADD等,最後是容器啟動時發起的指令。
Dockerfile中的指令
FROM: 指定鏡像名稱,格式為FROM <image> 或FROM <image>:<tag>,例如FROM ubuntu 或 FROM ubuntu:12.04
MAINTAINER: 鏡像作者 ,格式為 MAINTAINER <name>
RUN:格式為 RUN <command> 或 RUN ["executable", "param1", "param2"]。
前者將在 shell 終端中運行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條 RUN 指令將在當前鏡像基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 \ 來換行。
CMD:支持三種格式
1.CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
2.CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
3.CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。
EXPOSE:格式為 EXPOSE <port> [<port>...]。
告訴 Docker 服務端容器暴露的埠號,供互聯系統使用。在啟動容器時需要通過 -P,Docker 主機會自動分配一個埠轉發到指定的埠。
ENV:格式為 ENV <key> <value>。 指定一個環境變數,會被後續 RUN 指令使用,並在容器運行時保持。這就對應程序語言中的變數定義,可在需要的時候引用。例如:
1
2
3
4
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD:格式為 ADD <src> <dest>。
該命令將復制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 文件(自動解壓為目錄)。
COPY:格式為 COPY <src> <dest>。
復制本地主機的 <src>(為 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。當使用本地目錄為源目錄時,推薦使用 COPY。
COPY和ADD的不同就是:ADD多了自動解壓和支持URL路徑的功能。
ENTRYPOINT:
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啟動後執行的命令,並且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。
CMD和ENTRYPOINT比較:兩個命令都是只能使用一次,並且都是在執行docker run指令時運行,如果有多個,只執行最後一條。
兩者的不同在於參數的傳遞方式,如果在Dockerfile中定義如下指令
1
CMD echo hello
或
1
ENTRYPOINT ["echo","hello"]
那麼在運行命令docker run containerId echo hello時,指定了CMD的輸入結果為world,可以看出Dockerfile中指定的命令被覆蓋了,而指定了ENTRYPOINT時,輸出結果為hello echo world,可以看出指定的命令被作為ENTRYPOINT指定指令的參數了。
VOLUME:格式為 VOLUME ["/data"]。創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫和需要保持的數據等。不過此屬性在Dockerfile中指定並沒有什麼意義,因為沒有辦法指定本地主機的目錄。如果需要指定掛載點可以在執行docker run命令時指定:
1
docker run -it -v /home/fengzheng/ftp/:/data 859666d51c6d /bin/bash
USER:格式為 USER daemon。指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶。
當服務不需要管理員許可權時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員許可權可以使用 gosu,而不推薦 sudo。
WORKDIR:格式為 WORKDIR /path/to/workdir。為後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如
1
2
3
4
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑為 /a/b/c。
ONBUILD:格式為 ONBUILD [INSTRUCTION]。
配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。
例如,Dockerfile 使用如下的內容創建了鏡像 image-A。
1
2
3
4
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基於 image-A 創建新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行ONBUILD 指令內容,等價於在後面添加了兩條指令。
1
2
3
4
5
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的鏡像,推薦在標簽中註明,例如 ruby:1.9-onbuild。
基於CentOS6.7並源碼安裝nginx
首先准備了nginx-1.9.9.tar.gz安裝包和CentOS6-Base-163.repo(163源),將這兩個文件放到同一目錄下,並在此目錄下創建名稱為Dockerfile的文件。之後在此文件中實現源替換、nginx編譯安裝、及一些依賴包的安裝,Dockerfile內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# this is a test ubuntu 12.04 image dockerfile
# Author:fengzheng
# Base image,this must be set as the first line
#localhost:5000/centos:6.7是我的私有倉庫的鏡像,可替換為centos:6.7(DockerHub中的鏡像)
FROM localhost:5000/centos:6.7
MAINTAINER fengzheng
# Commands to update the image
RUN mkdir /usr/nginx1.9.9
ADD nginx-1.9.9.tar.gz /usr/nginx1.9.9/
#RUN yum -y install tar
#RUN tar -zxvf /usr/nginx1.9.9/nginx-1.9.9.tar.gz
RUN cd /etc/yum.repos.d/ && mv CentOS-Base.repo CentOS-Base.repo.bak
ADD CentOS6-Base-163.repo /etc/yum.repos.d/
RUN cd /etc/yum.repos.d/ && mv CentOS6-Base-163.repo CentOS-Base.repo \
&& yum clean all && yum makecache \
&& yum -y install gcc \
&& yum -y install yum install -y pcre-devel \
&& yum -y install zlib zlib-devel \
&& yum -y install openssl openssl--devel \
&& cd /usr/nginx1.9.9/nginx-1.9.9/ && ./configure && make && make install
#如果設置daemon off; nginx無法啟動
#RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
# 啟動nginx 需進入/usr/local/nginx/sbin 執行./configure
CMD /bin/bash
最後執行命令"docker build -t nginx-centos:6.7 ."
其中.表示在當前目錄下搜索Dockerfile文件,-t參數指定鏡像名稱和tag。
4、如何構建docker鏡像
?
5、如何用Gradle創建Docker鏡像
Dockerfile結構
dockerfile由4部信息組:基礎鏡像信息、維護者信息、鏡像操作指令容器啟執行指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# Base image to use, this must be set as the first line
FROM ubuntu
# Maintainer: docker_user (@docker_user)
MAINTAINER docker_user [email protected]
# Commands to update the image
RUN echo "deb raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /usr/sbin/nginx
其#表注釋標注些說明性文字
FROM關鍵字指定鏡像源默認DockerHub寫私倉庫鏡像例:localhost:5000/centos:6.7本已經存指定鏡像名稱則本緩存直接獲取MAINTAINER 指定鏡像作者鏡像操作執行RUN、ADD等容器啟發起指令
Dockerfile指令
FROM: 指定鏡像名稱格式FROM 或FROM :例FROM ubuntu 或 FROM ubuntu:12.04
MAINTAINER: 鏡像作者 格式 MAINTAINER
RUN:格式 RUN 或 RUN ["executable", "param1", "param2"]
前者 shell 終端運行命令即 /bin/sh -c;者則使用 exec 執行指定使用其終端通第二種式實現例 RUN ["/bin/bash", "-c", "echo hello"]
每條 RUN 指令前鏡像基礎執行指定命令並提交新鏡像命令較使用 \ 換行
CMD:支持三種格式
1.CMD ["executable","param1","param2"] 使用 exec 執行推薦式;
2.CMD command param1 param2 /bin/sh 執行提供給需要交互應用;
3.CMD ["param1","param2"] 提供給 ENTRYPOINT 默認參數;
指定啟容器執行命令每 Dockerfile 能條 CMD 命令指定條命令條執行用戶啟容器候指定運行命令則覆蓋掉 CMD 指定命令
EXPOSE:格式 EXPOSE [...]
告訴 Docker 服務端容器暴露埠號供互聯系統使用啟容器需要通 -PDocker 主機自配埠轉發指定埠
ENV:格式 ENV 指定環境變數續 RUN 指令使用並容器運行保持應程序語言變數定義需要候引用例:
1
2
3
4
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD:格式 ADD
該命令復制指定 容器 其 Dockerfile所目錄相路徑; URL; tar 文件(自解壓目錄)
COPY:格式 COPY
復制本主機 ( Dockerfile 所目錄相路徑)容器 使用本目錄源目錄推薦使用 COPY
COPYADD同:ADD自解壓支持URL路徑功能
ENTRYPOINT:
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell執行)
配置容器啟執行命令並且 docker run 提供參數覆蓋
每 Dockerfile 能 ENTRYPOINT指定起效
CMDENTRYPOINT比較:兩命令都能使用並且都執行docker run指令運行執行條
兩者同於參數傳遞式Dockerfile定義指令
1
CMD echo hello
或
1
ENTRYPOINT ["echo","hello"]
運行命令docker run containerId echo hello指定CMD輸入結world看Dockerfile指定命令覆蓋指定ENTRYPOINT輸結hello echo world看指定命令作ENTRYPOINT指定指令參數
VOLUME:格式 VOLUME ["/data"]創建本主機或其容器掛載掛載點般用存放資料庫需要保持數據等屬性Dockerfile指定並沒意義沒辦指定本主機目錄需要指定掛載點執行docker run命令指定:
1
docker run -it -v /home/fengzheng/ftp/:/data 859666d51c6d /bin/bash
USER:格式 USER daemon指定運行容器用戶名或 UID續 RUN 使用指定用戶
服務需要管理員許可權通該命令指定運行用戶並且前創建所需要用戶例:RUN groupadd -r postgres && useradd -r -g postgres postgres要臨獲取管理員許可權使用 gosu推薦 sudo
WORKDIR:格式 WORKDIR /path/to/workdir續 RUN、CMD、ENTRYPOINT 指令配置工作目錄使用 WORKDIR 指令續命令參數相路徑則基於前命令指定路徑例
1
2
3
4
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則終路徑 /a/b/c
ONBUILD:格式 ONBUILD [INSTRUCTION]
配置所創建鏡像作其新創建鏡像基礎鏡像所執行操作指令
例Dockerfile 使用內容創建鏡像 image-A
1
2
3
4
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
基於 image-A 創建新鏡像新Dockerfile使用 FROM image-A指定基礎鏡像自執行ONBUILD 指令內容等價於面添加兩條指令
1
2
3
4
5
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令鏡像推薦標簽註明例 ruby:1.9-onbuild
基於CentOS6.7並源碼安裝nginx
首先准備nginx-1.9.9.tar.gz安裝包CentOS6-Base-163.repo(163源)兩文件放同目錄並目錄創建名稱Dockerfile文件文件實現源替換、nginx編譯安裝、及些依賴包安裝Dockerfile內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# this is a test ubuntu 12.04 image dockerfile
# Author:fengzheng
# Base image,this must be set as the first line
#localhost:5000/centos:6.7我私倉庫鏡像替換centos:6.7(DockerHub鏡像)
FROM localhost:5000/centos:6.7
MAINTAINER fengzheng
# Commands to update the image
RUN mkdir /usr/nginx1.9.9
ADD nginx-1.9.9.tar.gz /usr/nginx1.9.9/
#RUN yum -y install tar
#RUN tar -zxvf /usr/nginx1.9.9/nginx-1.9.9.tar.gz
RUN cd /etc/yum.repos.d/ && mv CentOS-Base.repo CentOS-Base.repo.bak
ADD CentOS6-Base-163.repo /etc/yum.repos.d/
RUN cd /etc/yum.repos.d/ && mv CentOS6-Base-163.repo CentOS-Base.repo \
&& yum clean all && yum makecache \
&& yum -y install gcc \
&& yum -y install yum install -y pcre-devel \
&& yum -y install zlib zlib-devel \
&& yum -y install openssl openssl--devel \
&& cd /usr/nginx1.9.9/nginx-1.9.9/ && ./configure && make && make install
#設置daemon off; nginx啟
#RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
# 啟nginx 需進入/usr/local/nginx/sbin 執行./configure
CMD /bin/bash
執行命令"docker build -t nginx-centos:6.7 ."
其.表示前目錄搜索Dockerfile文件-t參數指定鏡像名稱tag
6、docker 怎麼從鏡像倉庫獲取鏡像
配置docker的啟動參數。
執行:
# systemctl status docker 1
如圖紅框所示,修改/usr/lib/systemd/system/docker.service
啟動參數增加--add-registry=master.example.com:5000 --insecure-registry=master.example.com:5000
重啟docker:
# systemctl daemon-reload# systemctl restart docker12
驗證
執行:
# docker info1
輸出最後一行有:回
Registries: master.example.com:5000 (insecure), docker.io (secure)1
registry添加成功。答
我的docker本地鏡像倉庫中有tomcat:8.5.16。內網環境下測試執行:
# docker pull tomcat:8.5.161
可以看出,這里在執行docker pull的時候不需要帶上本地鏡像倉庫的地址,直接會自動從本地鏡像倉庫拉取。
7、怎麼把docker做成鏡像文件
方法/步驟
在使用Docker的過程中,我們除了從Docker Hub上下載已經做好的鏡像,很多時候回需要我們自己製作答鏡像。下面想在這個文章中說明一下鏡像的製作方法。
製作鏡像的方式主要有兩種:
通過docker commit 製作鏡像
通過docker build 製作鏡像
這兩種方式都是通過改進已有的鏡像來達到自己的目的。製作基礎鏡像,會在另外一篇文章「從零開始製作基礎鏡像」中介紹。
docker commit
docker commit 是往版本控制系統里提交一次變更。使用這種方式製作鏡像,本質上是運行一個基礎鏡像,然後在基礎鏡像上進行軟體安裝和修改。最後再將改動提交到版本系統中。