Docker 鏡像使用node
當運行容器時,使用的鏡像若是在本地中不存在,docker就會自動從 docker鏡像倉庫中下載,默認是從Docker Hub公共鏡像源下載。linux
使用docker images來列出本地主機上的鏡像。nginx
[root@test01 ~]# docker imagesweb
REPOSITORY TAG IMAGE ID CREATED SIZEdocker
centos7.3-jdk latest 63667b92c4d8 11 minutes ago 1.537 GBshell
192.168.20.199:5000/centos7 latest b12c7cf69db2 30 hours ago 1.161 GB數據庫
各個選項說明:npm
REPOSTITORY:表示鏡像的倉庫源json
TAG:鏡像的標籤ubuntu
IMAGE ID:鏡像ID
CREATED:鏡像建立時間
SIZE:鏡像大小
同一倉庫源能夠有多個 TAG,表明這個倉庫源的不一樣的版本,如ubuntu倉庫源裏,有15.十、14.04等多個不一樣的版本,咱們使用 REPOSTITORY:TAG 來定義不一樣的鏡像。
因此,咱們若是要使用版本爲15.10的ubuntu系統鏡像來運行容器時,命令以下:
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@d77ccb2e5cca:/#
獲取一個新的鏡像
當咱們在本地主機上使用一個不存在的鏡像時 Docker 就會自動下載這個鏡像。
若是咱們想預先下載這個鏡像,咱們能夠使用 docker pull 命令來下載它。
Crunoob@runoob:~$ docker pull ubuntu:13.10
下載完成後,咱們能夠直接使用這個鏡像來運行容器。
查找鏡像
咱們能夠從 Docker Hub 網站來搜索鏡像,Docker Hub 網址爲: https://hub.docker.com/
咱們也能夠使用 docker search 命令來搜索鏡像。好比咱們須要一個httpd的鏡像來做爲咱們的web服務。咱們能夠經過 docker search 命令搜索 httpd 來尋找適合咱們的鏡像。
NAME:鏡像倉庫源的名稱
DESCRIPTION:鏡像的描述
OFFICIAL:是否docker官方發佈
拖取鏡像
咱們決定使用上圖中的httpd 官方版本的鏡像,使用命令 docker pull 來下載鏡像。
runoob@runoob:~$ docker pull
建立鏡像
當咱們從docker鏡像倉庫中下載的鏡像不能知足咱們的需求時,咱們能夠經過如下兩種方式對鏡像進行更改。
1.從已經建立的容器中更新鏡像,而且提交這個鏡像
2.使用 Dockerfile 指令來建立一個新的鏡像
更新鏡像
更新鏡像以前,咱們須要使用鏡像來建立一個容器。
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/#
在運行的容器內使用 apt-get update 命令進行更新。
在完成操做以後,輸入 exit命令來退出這個容器。
此時ID爲e218edb10161的容器,是按咱們的需求更改的容器。咱們能夠經過命令 docker commit來提交容器副本。
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8
各個參數說明:
-m:提交的描述信息
-a:指定鏡像做者
e218edb10161:容器ID
runoob/ubuntu:v2:指定要建立的目標鏡像名
咱們能夠使用 docker images 命令來查看咱們的新鏡像 runoob/ubuntu:v2:
使用咱們的新鏡像 runoob/ubuntu 來啓動一個容器
runoob@runoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash
root@1a9fbdeb5da3:/#
構建鏡像
咱們使用命令 docker build , 從零開始來建立一個新的鏡像。
咱們須要建立一個 dockerfile 文件(文件名必須是dockerfile),其中包含一組指令來告訴 Docker 如何構建咱們的鏡像。
[root@test01 ~]# cat dockerfile
COPY im /opt/app/im
WORKDIR /opt/app/im
ADD node-v6.10.2-linux-x64.tar /usr/local/
RUN mv /usr/local/node-v6.10.2-linux-x64 /usr/local/node
ENV PATH /usr/local/node/bin:$PATH
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org \
&& cnpm install -g pm2 \
&& cd /opt/app/im \
&& cnpm install
EXPOSE 3000
若是要在 <command> 沒有shell 的狀況下運行,則必須將該命令表示爲JSON數組,並提供可執行文件的完整路徑。 此數組形式是首選格式CMD。任何其餘參數必須在數組中單獨表示爲字符串:
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
每個指令都會在鏡像上建立一個新的層,每個指令的前綴都必須是大寫的。
FROM:指定使用哪一個鏡像源,第一條指令必須爲FROM指令,而且,若是在同一個Dockerfile中建立多個鏡像時,能夠使用多個FROM指令(每一個鏡像一次)。
MAINTAINET:指定維護者的信息
RUN:指令告訴docker 在鏡像內執行命令,安裝了什麼。每條指令將在當前鏡像基礎上執行,並提交爲新的鏡像。(能夠用「\」換行)
ADD:複製指定的<src>到容器的<dest>中,<src>能夠是Dockerfile所在的目錄的一個相對路徑;能夠是URL,也能夠是tar.gz(自動解壓,並自動刪除源文件包)
COPY:複製本地主機的 <src> ( 爲 Dockerfile 所在目錄的相對路徑)到容器中的 <dest> (當使用本地目錄爲源目錄時,推薦使用 COPY)
CMD:指定啓動容器時執行的命令,每一個Dockerfile只能有一條CMD指令,若是指定了多條指令,則最後一條執行。(會被啓動時指定的命令覆蓋)
格式:CMD ["","",""]
EXPOSE:告訴Docker服務端暴露端口,在容器啓動時須要經過 -p 作端口映射
ENV:指定環境變量,會被RUN指令使用,並在容器運行時保存
ENTRYPOINT:配置容器啓動後執行的命令,而且不可被 docker run 提供的參數覆蓋。(每一個 Dockerfile 中只能有一個 ENTRYPOINT ,當指定多個時,只有最後一個起效)
格式:ENTRYPOINT ["","",""]
VOLUME: 是在container中建立一個掛載點,咱們能夠將本地的一個文件卷掛載在container中的/data下面,這樣咱們在container的data目錄下的操做就和在本地卷的操做是同樣的。
USER:指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶。
WORKDIR:爲後續的 RUN 、 CMD 、 ENTRYPOINT 指令配置工做目錄。(能夠使用多個 WORKDIR 指令,後續命令若是參數是相對路徑, 則會基於以前命令指定的路徑)
ONBUILD:配置當所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令
而後,咱們使用 dockerfile 文件,經過 docker build 命令來構建一個鏡像。
[root@test01 ~]# docker build -t centos7.3-jdk .(. 表示當前路徑)
參數說明:
-t :指定要建立的目標鏡像名
. :dockerfile 文件所在目錄,能夠指定dockerfile的絕對路徑
dockerfile 安裝nginx的時候報錯:
緣由是應該使用一個RUN來執行更多的命令來減小層數,由於每一個instruction(指令)都會生成一個新的層。
https://stackoverflow.com/questions/44451696/bin-sh-1-configure-not-found-dockerfile
構建鏡像時,有時候提示我
Rpmdb checksum is invalid: dCDPT(pkg checksums): dracut.x86_64 0:033-502.el7_4.1 - u
解決辦法以下:
是rpm數據庫損壞須要重建。所以須要在 「yum install …」 前使用 「rpm –rebuilddb」 重建數據庫。好比:
RUN rpm --rebuilddb && yum install -y sudo ...
在個人環境中發現有時候若是有多條 「RUN yum install -y …」 指令,須要在每條以前都加上 「rpm –rebuilddb」。
咱們能夠使用新的鏡像來建立容器
runoob@runoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash
設置鏡像標籤
咱們能夠使用 docker tag 命令,爲鏡像添加一個新的標籤。
runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev
docker tag 鏡像ID,這裏是 860c279d2fec ,用戶名稱、鏡像源名(repository name)和新的標籤名(tag)。
使用 docker images 命令能夠看到,ID爲860c279d2fec的鏡像多一個標籤。
刪除本地鏡像
docker rmi `docker images -q`