docker學習筆記

目錄

docker網址php

docker介紹html

docker安裝java

docker使用linux

  docker的使用命令nginx

    使用命令git

    rungithub

  詳細參數配置web

  docker詳細使用docker

    docker基本信息shell

    操做docker鏡像

    啓動容器

    查看容器

    操做容器

    保存和加載鏡像

    登陸

    發佈docker鏡像

    構建鏡像

    構建鏡像_Dockerfile文件語法

    重新鏡像啓動容器

    守護容器

 docker資料

 

docker網址

docker hub:https://hub.docker.com/

經常使用官網docs:https://docs.docker.com/

docker介紹

docker概念

  • Docker 的經常使用文檔:https://docs.docker.com/
  • Docker 鏡像: 用戶基於鏡像來運行本身的容器,能夠把鏡像當作容器的『源代碼』,鏡像體積很小,易於分享、存儲和更新
  • Registry: Docker 用 Registry 保存用戶構建的鏡像,Registry 分爲公共和私有兩種:
    • Docker 公司運營的公共 Registry 叫作 Docker Hub,咱們能夠在上面註冊帳號,分享並保存本身的鏡像。
    • 能夠在 Docker Hub 保存本身的私有鏡像或者架設本身私有的 Registry
  • Docker 容器: 把應用程序或服務打包放進去,容器是基於鏡像啓動的,容器中能夠運行一個或多個進程。
    • 鏡像是 Docker 生命週期中的構建或打包階段
    • 容器則是啓動或執行階段

docker的邏輯

容器與虛擬化

虛擬化使得許多操做系統可同時在單個系統上運行。

容器則可共享同一個操做系統內核,將應用進程與系統其餘部分隔離開。

普通虛擬化技術和Docker的對比圖

docker與lxc對比

傳統的 Linux 容器使用 init 系統來管理多種進程。這意味着,全部應用程序都做爲一個總體運行。與此相反,Docker 技術鼓勵應用程序各自獨立運行其進程,並提供相應工具以實現這一功能。這種精細化運做模式自有其優點。

 docker安裝

如下是centos版本

官網安裝指導:https://docs.docker.com/install/linux/docker-ce/centos/

# 如下親測有效,20190308版。

sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io

systemctl start docker

[root@localhost ~]# docker version
Client:
Version: 18.09.3
API version: 1.39
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:33:21 2019
OS/Arch: linux/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.3
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 774a1f4
Built: Thu Feb 28 06:02:24 2019
OS/Arch: linux/amd64
Experimental: false

 

增長開機啓動

chkconfig docker on

實測有效。

 

添加鏡像加速器

阿里鏡像加速器網址:https://cr.console.aliyun.com/cn-hangzhou/mirrors
可加快連接docker官網鏡像的速度


教程:
1. 安裝/升級Docker客戶端

推薦安裝1.10.0以上版本的Docker客戶端,參考文檔 docker-ce

2. 配置鏡像加速器

針對Docker客戶端版本大於 1.10.0 的用戶

您能夠經過修改daemon配置文件/etc/docker/daemon.json來使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

實測有效。

 補充:

刪除none的image

docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi

 

docker使用

docker的使用命令

docker 命令介紹

docker --help

管理命令:
  container   管理容器
  image       管理鏡像
  network     管理網絡
命令:
  attach      介入到一個正在運行的容器
  build       根據 Dockerfile 構建一個鏡像
  commit      根據容器的更改建立一個新的鏡像
  cp          在本地文件系統與容器中複製 文件/文件夾

          # 從主機複製到容器sudo docker cp host_path containerID:container_path

          # 從容器複製到主機sudo docker cp containerID:container_path host_path

  create      建立一個新容器
  exec        在容器中執行一條命令
  images      列出鏡像
  kill        殺死一個或多個正在運行的容器    
  logs        取得容器的日誌
  pause       暫停一個或多個容器的全部進程
  ps          列出全部容器
  pull        拉取一個鏡像或倉庫到 registry
  push        推送一個鏡像或倉庫到 registry
  rename      重命名一個容器
  restart     從新啓動一個或多個容器
  rm          刪除一個或多個容器
  rmi         刪除一個或多個鏡像
  run         在一個新的容器中執行一條命令
  search      在 Docker Hub 中搜索鏡像
  start       啓動一個或多個已經中止運行的容器
  stats       顯示一個容器的實時資源佔用
  stop        中止一個或多個正在運行的容器
  tag         爲鏡像建立一個新的標籤
  top         顯示一個容器內的全部進程
  unpause     恢復一個或多個容器內全部被暫停的進程

 

docker run命令

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]    
  
  -d, --detach=false         指定容器運行於前臺仍是後臺,默認爲false     
  -i, --interactive=false   打開STDIN,用於控制檯交互    
  -t, --tty=false            分配tty設備,該能夠支持終端登陸,默認爲false    
  -u, --user=""              指定容器的用戶    
  -a, --attach=[]            登陸容器(必須是以docker run -d啓動的容器)  
  -w, --workdir=""           指定容器的工做目錄   
  -c, --cpu-shares=0        設置容器CPU權重,在CPU共享場景使用    
  -e, --env=[]               指定環境變量,容器中可使用該環境變量    
  -m, --memory=""            指定容器的內存上限    
  -P, --publish-all=false    指定容器暴露的端口    
  -p, --publish=[]           指定容器暴露的端口   
  -h, --hostname=""          指定容器的主機名    
  -v, --volume=[]            給容器掛載存儲卷,掛載到容器的某個目錄    
  --volumes-from=[]          給容器掛載其餘容器上的卷,掛載到容器的某個目錄  
  --cap-add=[]               添加權限,權限清單詳見:http://linux.die.net/man/7/capabilities    
  --cap-drop=[]              刪除權限,權限清單詳見:http://linux.die.net/man/7/capabilities    
  --cidfile=""               運行容器後,在指定文件中寫入容器PID值,一種典型的監控系統用法    
  --cpuset=""                設置容器可使用哪些CPU,此參數能夠用來容器獨佔CPU    
  --device=[]                添加主機設備給容器,至關於設備直通    
  --dns=[]                   指定容器的dns服務器    
  --dns-search=[]            指定容器的dns搜索域名,寫入到容器的/etc/resolv.conf文件    
  --entrypoint=""            覆蓋image的入口點    
  --env-file=[]              指定環境變量文件,文件格式爲每行一個環境變量    
  --expose=[]                指定容器暴露的端口,即修改鏡像的暴露端口    
  --link=[]                  指定容器間的關聯,使用其餘容器的IP、env等信息    
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc時使用    
  --name=""                  指定容器名字,後續能夠經過名字進行容器管理,links特性須要使用名字    
  --net="bridge"             容器網絡設置:  
                                bridge 使用docker daemon指定的網橋       
                                host    //容器使用主機的網絡    
                                container:NAME_or_ID  >//使用其餘容器的網路,共享IP和PORT等網絡資源    
                                none 容器使用本身的網絡(相似--net=bridge),可是不進行配置   
  --privileged=false         指定容器是否爲特權容器,特權容器擁有全部的capabilities    
  --restart="no"             指定容器中止後的重啓策略:  
                                no:容器退出時不重啓    
                                on-failure:容器故障退出(返回值非零)時重啓   
                                always:容器退出時老是重啓    
  --rm=false                 指定容器中止後自動刪除容器(不支持以docker run -d啓動的容器)    
  --sig-proxy=true           設置由代理接受並處理信號,可是SIGCHLD、SIGSTOP和SIGKILL不能被代理    

更詳細的功能參數配置

參數 解釋
--api-enable-cors=false 開放遠程API調用的 CORS 頭信息。這個接口開關對想進行二次開發的上層應用提供了支持.
-b, --bridge="" 掛載已經存在的網橋設備到 Docker 容器裏。注意,使用 none 能夠停用容器裏的網絡.
--bip="" 使用 CIDR 地址來設定網絡橋的 IP。注意,此參數和 -b 不能一塊兒使用.
-D, --debug=false 開啓Debug模式。例如:docker -d -D
-d, --daemon=false 開啓Daemon模式.
--dns=[] 強制容器使用DNS服務器.例如: docker -d --dns 8.8.8.8
--dns-search=[] 強制容器使用指定的DNS搜索域名.例如: docker -d --dns-search example.com
-e, --exec-driver="native" 強制容器使用指定的運行時驅動.例如:docker -d -e lxc
-G, --group="docker" 在後臺運行模式下,賦予指定的Group到相應的unix socket上。注意,當此參數 --group 賦予空字符串時,將去除組信息。
-g, --graph="/var/lib/docker" 配置Docker運行時根目錄
-H, --host=[] 在後臺模式下指定socket綁定,能夠綁定一個或多個 tcp://host:port, unix:///path/to/socket, fd://* 或 fd://socketfd。例如:$ docker -H tcp://0.0.0.0:2375 ps 或者 $ export DOCKER_HOST="tcp://0.0.0.0:2375" $ docker ps
--icc=true 啓用內聯容器的通訊.
--ip="0.0.0.0" 容器綁定IP時使用的默認IP地址.
--ip-forward=true 啓動容器的 net.ipv4.ip_forward.
--iptables=true 啓動Docker容器自定義的iptable規則.
--mtu=0 設置容器網絡的MTU值,若是沒有這個參數,選用默認 route MTU,若是沒有默認route,就設置成常量值 1500.
-p, --pidfile="/var/run/docker.pid" 後臺進程PID文件路徑.
-r, --restart=true 重啓以前運行中的容器.
-s, --storage-driver="" 強制容器運行時使用指定的存儲驅動,例如,指定使用devicemapper, 能夠這樣:docker -d -s devicemapper
--selinux-enabled=false 啓用selinux支持
--storage-opt=[] 配置存儲驅動的參數
--tls=false 啓動TLS認證開關
--tlscacert="/Users/dxiao/.docker/ca.pem" 經過CA認證過的的certificate文件路徑
--tlscert="/Users/dxiao/.docker/cert.pem" TLS的certificate文件路徑
--tlskey="/Users/dxiao/.docker/key.pem" TLS的key文件路徑
--tlsverify=false 使用TLS並作後臺進程與客戶端通信的驗證
-v, --version=false 顯示版本信息

*注意:其中帶有[] 的啓動參數能夠指定屢次,例如

docker run -a stdin -a stdout -a stderr -i -t ubuntu /bin/bash

docker詳細使用

docker基本信息

uname -r 查看系統內核
systemctl start docker 啓動docker 境像
docker verison 查看docker版本
docker info 顯示docker系統的信息

操做docker鏡像

docker search image-name 檢索image
docker pull image-name 下載image
docker images 列出鏡像列表
docker rmi image-name 刪除一個或者多個鏡像
docker history image-name 顯示一個鏡像的歷史

*從已經建立的容器中更新鏡像,而且提交這個鏡像 *使用 Dockerfile 指令來建立一個新的鏡像 下面經過已存在的容器建立一個新的鏡像。
docker commit -m="First Image" -a="keke" 7a15f99695c0 keke/unbantu:17.10.0

上面命令參數說明:
* -m 提交的描述信息
* -a 指定鏡像做者
* 7a15f99695c0 記住這個是容器id,不是鏡像id
* keke/unbantu:17.10.0 建立的目標鏡像名

1.在Docker 註冊帳戶,發佈的鏡像都在這個頁面裏展現
2.將上面作的鏡像unbantu,起個新的名字unbantu-test
docker tag keke/unbantu:17.10.0 keke/unbantu-test:lastest

3.登陸docker
docker login

4.上傳unbantu鏡像
docker push keke/unbantu-test:lastest

經過容器建立鏡像

 啓動容器

docker run image-name apt-get install -y -name 在容器中安裝新的程序
docker run image-name echo "hello word"  在容器中運行"echo"命令,輸出"hello word"

docker run -i -t image_name /bin/bash
注意:在執行apt-get 命令的時候,要帶上-y參數。若是不指定-y參數的話,apt-get命令會進入交互模式,須要用戶輸入命令來進行確認,但在docker環境中是沒法響應這種交互的。apt-get 命令執行完畢以後,容器就會中止,但對容器的改動不會丟失.

交互式進入容器中

查看容器

docker ps 列出當前全部正在運行的container
docker ps -a 列出全部的container
docker ps -l 列出最近一次啓動的container

docker commit ID new-image-name
保存對容器的修改; -a, --author="" Author; -m, --message="" Commit message

保存對容器的修改 當你對某一個容器作了修改以後(經過在容器中運行某一個命令),能夠把對容器的修改保存下來,這樣下次能夠從保存後的最新狀態運行該容器。

操做容器

docker rm `docker ps -a -q` 刪除全部容器

docker rm Name/ID
-f, --force=false; -l, --link=false Remove the specified link and not the underlying container; -v, --volumes=false Remove the volumes associated to the container

 刪除單個容器

docker stop Name/ID
docker start Name/ID
docker kill Name/ID

 中止、啓動、殺死一個容器

docker logs Name/ID
-f, --follow=false Follow log output; -t, --timestamps=false Show timestamps

 從一個容器中取日誌
 docker diff Name/ID  列出一個容器裏面被改變的文件或者目錄,list列表會顯示出三種事件,A 增長的,D 刪除的,C 被改變的
 docker top Name/ID  顯示一個運行的容器裏面的進程信息
 

docker cp Name:/container-path to-path
docker cp ID:/container-path to-path

 從容器裏面拷貝文件/目錄到本地一個路徑
 

docker restart Name/ID
-t, --time=10 Number of seconds to try to stop for before killing the container, Default=10

 重啓一個正在運行的容器
 

docker attach ID #從新啓動並運行一個交互式會話shell
--no-stdin=false Do not attach stdin; --sig-proxy=true Proxify all received signal to the process
注意:使用這個命令能夠掛載正在後臺運行的容器,在開發應用的過程當中運用這個命令能夠隨時觀察容器內進程的運行情況.

 附加到一個運行的容器上面

保存和加載鏡像

docker save image-name -o file-path
-o, --output="" Write to an file

保存鏡像到一個tar包

docker load -i file-path
-i, --input="" Read from a tar archive file

加載一個tar包格式的鏡像

docker save image-name > /home/keke/main.tar

*使用scp將main.tar拷到機器A上:
docker load < /home/keke/main.tar

從機器A拷貝到機器B

登陸

docker login
-e, --email="" Email; -p, --password="" Password; -u, --username="" Username

登錄registry server

發佈docker鏡像

docker push new-image-name  發佈docker鏡像

構建鏡像

  1. Dockerfile文件使用

docker build命令會根據Dockerfile文件及上下文構建新Docker鏡像。構建上下文是指Dockerfile所在的本地路徑或一個URL(Git倉庫地址)。構建上下文環境會被遞歸處理,因此,構建所指定的路徑還包括了子目錄,而URL還包括了其中指定的子模塊。

  • 構建鏡像

將當前目錄作爲構建上下文時,能夠像下面這樣使用docker build命令構建鏡像:

$ ~/Downloads/hello-system$ sudo docker build .
Sending build context to Docker daemon  70.14kB

說明:構建會在Docker後臺守護進程(daemon)中執行,而不是CLI中。構建前,構建進程會將所有內容(遞歸)發送到守護進程。大多狀況下,應該將一個空目錄做爲構建上下文環境,並將Dockerfile文件放在該目錄下。

在構建上下文中使用的Dockerfile文件,是一個構建指令文件。爲了提升構建性能,能夠經過.dockerignore文件排除上下文目錄下,不須要的文件和目錄。

Dockerfile通常位於構建上下文的根目錄下,也能夠經過-f指定該文件的位置:

$ sudo docker build -f /home/keke/Downloads/hello-system/Dockerfile .

構建時,還能夠經過-t參數指定構建成後,鏡像的倉庫,標籤等:

  • 鏡像標籤
$ ~/Downloads/hello-system$ sudo docker build -t keke/myapp .

若是存在多個倉庫下,或使用多個鏡像標籤,就可使用多個-t參數:

$ docker build -t keke/myapp:1.0.2 -t keke/myapp:latest .

在Docker守護進程執行Dockerfile中的指令前,首先會對Dockerfile進行語法檢查,有語法錯誤時會返回:

$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
  • Dockerfile文件格式 Dockerfile文件中指令不區分大小寫,但爲了更易區分,約定使用大寫形式。

Docker 會依次執行Dockerfile中的指令,文件中的第一條指令必須是FROM,FROM指令用於指定一個基礎鏡像。

FROM指令用於指定其後構建新鏡像所使用的基礎鏡像。FROM指令必是Dockerfile文件中的首條命令,啓動構建流程後,Docker將會基於該鏡像構建新鏡像,FROM後的命令也會基於這個基礎鏡像。

Dockerfile文件格式以下:

# Comment
INSTRUCTION arguments

Dockerfile文件中指令不區分大小寫,但爲了更易區分,約定使用大寫形式。

Docker 會依次執行Dockerfile中的指令,文件中的第一條指令必須是FROM,FROM指令用於指定一個基礎鏡像。

  • FROM語法格式爲:
FROM <image> 或 FROM <image>:<tag>

經過FROM指定的鏡像,能夠是任何有效的基礎鏡像。FROM有如下限制:

FROM必須是Dockerfile中第一條非註釋命令 在一個Dockerfile文件中建立多個鏡像時,FROM能夠屢次出現。只需在每一個新命令FROM以前,記錄提交上次的鏡像ID。 tag或digest是可選的,若是不使用這兩個值時,會使用latest版本的基礎鏡像

  • RUN RUN用於在鏡像容器中執行命令,其有如下兩種命令執行方式: shell執行 在這種方式會在shell中執行命令,Linux下默認使用/bin/sh -c,Windows下使用cmd /S /C。 注意:經過SHELL命令修改RUN所使用的默認shell
RUN <command>

exec執行

RUN ["executable", "param1", "param2"]

RUN能夠執行任何命令,而後在當前鏡像上建立一個新層並提交。提交後的結果鏡像將會用在Dockerfile文件的下一步。

經過RUN執行多條命令時,能夠經過\換行執行:

RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'

也能夠在同一行中,經過分號分隔命令:

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

RUN指令建立的中間鏡像會被緩存,並會在下次構建中使用。若是不想使用這些緩存鏡像,能夠在構建時指定--no-cache參數,如:docker build --no-cache。

  • CMD CMD用於指定在容器啓動時所要執行的命令。CMD有如下三種格式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

CMD不一樣於RUN,CMD用於指定在容器啓動時所要執行的命令,而RUN用於指定鏡像構建時所要執行的命令。 CMD與RUN在功能實現上也有類似之處。如:

docker run -t -i keke/static /bin/true 等價於:cmd ["/bin/true"]

CMD在Dockerfile文件中僅可指定一次,指定屢次時,會覆蓋前的指令。 另外,docker run命令也會覆蓋Dockerfile中CMD命令。若是docker run運行容器時,使用了Dockerfile中CMD相同的命令,就會覆蓋Dockerfile中的CMD命令。 如,咱們在構建鏡像的Dockerfile文件中使用了以下指令:

CMD ["/bin/bash"]

使用docker build構建一個新鏡像,鏡像名爲keke/test。構建完成後,使用這個鏡像運行一個新容器,運行效果以下:

sudo docker run -i -t keke/test

在使用docker run運行容器時,咱們並無在命令結尾指定會在容器中執行的命令,這時Docker就會執行在Dockerfile的CMD中指定的命令。 若是不想使用CMD中指定的命令,就能夠在docker run命令的結尾指定所要運行的命令:

sudo docker run -i  -t keke/test /bin/ps

這時,docker run結尾指定的/bin/ps命令覆蓋了Dockerfile的CMD中指定的命令.

  • ENTRYPOINT ENTRYPOINT用於給容器配置一個可執行程序。也就是說,每次使用鏡像建立容器時,經過ENTRYPOINT指定的程序都會被設置爲默認程序。ENTRYPOINT有如下兩種形式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

ENTRYPOINT與CMD很是相似,不一樣的是經過docker run執行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何參數,都會被當作參數再次傳遞給ENTRYPOINT。Dockerfile中只容許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設置,而只執行最後的ENTRYPOINT指令。 docker run運行容器時指定的參數都會被傳遞給ENTRYPOINT,且會覆蓋CMD命令指定的參數。如,執行docker run -d時, -d參數將被傳遞給入口點。也能夠經過docker run --entrypoint重寫ENTRYPOINT入口點。 如:能夠像下面這樣指定一個容器執行程序:

ENTRYPOINT ["/usr/bin/nginx"]

完整構建代碼:

FROM ...
MAINTAINER keke "2536495681@gmail.com"
RUN ...

# 指定容器內的程序將會使用容器的指定端口
# 配合 docker run -p
EXPOSE ...

使用docker build構建鏡像,並將鏡像指定爲keke/test:

sudo docker build -t="itbilu/test" .

構建完成後,使用keke/test啓動一個容器:

sudo docker run -i -t keke/test -g "daemon off;"

在運行容器時,咱們使用了-g "daemon off;" ,這個參數將會被傳遞給ENTRYPOINT,最終在容器中執行的命令爲/usr/sbin/nginx -g "daemon off;" 。

  • EXPOSE EXPOSE用於指定容器在運行時監聽的端口:
EXPOSE <port> [<port>...]

EXPOSE並不會讓容器的端口訪問到主機。要使其可訪問,須要在docker run運行容器時經過-p來發布這些端口,或經過-P參數來發布EXPOSE導出的全部端口。

  • RUN: 指定鏡像被構建時要運行的命令
  • CMD: 指定容器被啓動時要運行的命令
  • ENTRYPOINT: 同 CMD ,但不會被 docker run -t 覆蓋
  • WORKDIR: CMD/ENTRYPOINT 會在這個目錄下執行
  • VOLUME:建立掛載點,即向基於所構建鏡像創始的容器添加捲
  • ADD:用於複製構建環境中的文件或目錄到鏡像中
  • COPY:一樣用於複製構建環境中的文件或目錄到鏡像中
docker history images-name

Dockerfile文件語法

dockerfile主要組成部分:

     基礎鏡像信息 FROM centos:6.8

     製做鏡像操做指令RUN yum insatll openssh-server -y

     容器啓動時執行指令 CMD ["/bin/bash"]

dockerfile經常使用指令:

     FROM 這個鏡像的媽媽是誰?(指定基礎鏡像)

     MAINTAINER 告訴別人,誰負責養它?(指定維護者信息,能夠沒有)

     RUN 你想讓它幹啥(在命令前面加上RUN便可)

     ADD 給它點創業資金(COPY文件,會自動解壓)

     WORKDIR 我是cd,今天剛化了妝(設置當前工做目錄)

     VOLUME 給它一個存放行李的地方(設置卷,掛載主機目錄)

     EXPOSE 它要打開的門是啥(指定對外的端口)

     CMD 奔跑吧,兄弟!(指定容器啓動後的要乾的事情)

dockerfile其餘指令: 

    COPY 複製文件

    ENV  環境變量

    ENTRYPOINT  容器啓動後執行的命令

 

(1)FROM(指定基礎image)
構建指令,必須指定且須要在Dockerfile其餘指令的前面。後續的指令都依賴於該指令指定的image。FROM指令指定的基礎image能夠是官方遠程倉庫中的,也能夠位於本地倉庫。鏡像能夠指定標籤。格式:

FROM <image>:<tag> 

(2)MAINTAINER(用來指定鏡像建立者信息)
構建指令,用於將image的製做者相關的信息寫入到image中。當咱們對該image執行docker inspect命令時,輸出中有相應的字段記錄該信息。
格式:

MAINTAINER <name> 

(3)RUN
構建指令,RUN能夠運行任何被基礎image支持的命令。如基礎image選擇了ubuntu,那麼軟件管理部分只能使用ubuntu的命令。RUN指令能夠有多條,每條RUN指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時,能夠用\來換行。
該指令有兩種格式:

# 在shell終端中運行 - `/bin/sh -c`
RUN <command>

# 使用exec執行
RUN ["executable", "param1", "param2" ... ]

(4)CMD(設置容器啓動時執行的操做)
設置指令,用於容器啓動時指定的操做。該操做能夠是執行自定義腳本,也能夠是執行系統命令。該指令只能在文件中存在一次,若是有多個,則只執行最後一條。
該指令有三種格式:

# 格式一:like an exec, this is the preferred form
CMD ["executable","param1","param2"]

# 格式二:as a shell
CMD command param1 param2

# 當Dockerfile指定了ENTRYPOINT,那麼使用下面的格式:做爲ENTRYPOINT的缺省參數
CMD ["param1","param2"]

注意:
1) CMD運行在鏡像構建以後,容器啓動的時候;
2) CMD只執行最後一條
3) CMD能夠被用戶指定的命令覆蓋

(5)ENTRYPOINT(設置容器啓動時執行的操做)
設置指令,指定容器啓動時執行的命令,能夠屢次設置,可是隻有最後一個有效。
兩種格式:

# 格式一:like an exec, this is the preferred form
ENTRYPOINT ["executable", "param1", "param2"]

# 格式二:as a shell
ENTRYPOINT command param1 param2

該指令的使用分爲兩種狀況,一種是獨自使用,另外一種和CMD指令配合使用。

當獨自使用時,若是你還使用了CMD命令且CMD是一個完整的可執行的命令,那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效:

# CMD指令將不會被執行,只有ENTRYPOINT指令被執行  
CMD echo 「Hello, World!」  
ENTRYPOINT ls -l 

另外一種用法和CMD指令配合使用來指定ENTRYPOINT的默認參數,這時CMD指令不是一個完整的可執行命令,僅僅是參數部分;ENTRYPOINT指令只能使用JSON方式指定執行命令,而不能指定參數:

FROM ubuntu  
CMD ["-l"]  
ENTRYPOINT ["/usr/bin/ls"] 

注意:
1) 和CMD指令基本同樣,可是不能被用戶指定的命令所覆蓋;
2) 能夠和CMD組合使用,ENTRYPOINT提供不可變得命令,CMD提供缺省參數。

(6)USER(設置容器的用戶)
設置指令,設置啓動容器的用戶,默認是root用戶。

# 指定memcached的運行用戶  
ENTRYPOINT ["memcached"]  
USER daemon  

# 或  
ENTRYPOINT ["memcached", "-u", "daemon"]  

(7)EXPOSE(指定容器須要映射到宿主機器的端口)
設置指令,該指令會將容器中的端口映射成宿主機器中的某個端口。格式爲:

EXPOSE <port> [<port> ...]
例如:

EXPOSE 80 443 11211

告訴Docker服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時須要經過-P,Docker主機會自動分配一個端口轉發到指定的端口;使用-p,則能夠具體指定哪一個本地端口映射過來。

(8)ENV(用於設置環境變量)
構建指令,在image中設置一個環境變量。格式:

ENV <key> <value>

設置了後,後續的RUN命令均可以使用,容器啓動後,能夠經過docker inspect查看這個環境變量,也能夠經過在docker run --env key=value時設置或修改環境變量。

假如你安裝了JAVA程序,須要設置JAVA_HOME,那麼能夠在Dockerfile中這樣寫:

ENV JAVA_HOME /path/to/java/dirent

(9)ADD(從src複製文件到容器的dest路徑)
構建指令,全部拷貝到容器中的文件和文件夾權限爲0755,uid和gid爲0。格式爲:

ADD <src> <dest> 
<src> 是相對被構建的源目錄的相對路徑,能夠是文件或目錄的路徑,也能夠是一個遠程的文件url;<dest>是容器中的絕對路徑。

該命令將複製指定的<src>到容器中的<dest>。其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄);也能夠是一個URL;還能夠是一個tar文件(自動解壓爲目錄)。

若是是一個目錄,那麼會將該目錄下的全部文件添加到容器中,不包括目錄;若是文件是可識別的壓縮格式,則docker會幫忙解壓縮(注意壓縮格式);若是<src>是文件且<dest>中不使用斜槓結束,則會將<dest>視爲文件,<src>的內容會寫入<dest>;若是<src>是文件且<dest>中使用斜槓結束,則會<src>文件拷貝到<dest>目錄下。

(10)COPY
格式爲

COPY <src> <dest>

複製本地主機的<src>(爲Dockerfile所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在時,會自動建立。
當使用本地目錄爲源目錄時,推薦使用COPY。

(11)VOLUME(指定掛載點))
設置指令,使容器中的一個目錄具備持久化存儲數據的功能,該目錄能夠被容器自己使用,也能夠共享給其餘容器使用。咱們知道容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉後,全部的更改都會丟失。當容器中的應用有持久化數據的需求時能夠在Dockerfile中使用該指令。格式:

VOLUME ["<mountpoint>"] 

示例:

FROM base VOLUME ["/tmp/data"] 

運行經過該Dockerfile生成image的容器,/tmp/data目錄中的數據在容器關閉後,裏面的數據還存在。例如另外一個容器也有持久化數據的需求,且想使用上面容器共享的/tmp/data目錄,那麼能夠運行下面的命令啓動一個容器:

docker run -t -i -rm -volumes-from container1 image2 bash  

# container1爲第一個容器的ID,image2爲第二個容器運行image的名字。

(12)WORKDIR(切換目錄)
設置指令,能夠屢次切換(至關於cd命令),對RUN,CMD,ENTRYPOINT生效。格式:

WORKDIR /path/to/workdir  
示例:

# 在 /p1/p2 下執行 vim a.txt  
WORKDIR /p1
WORKDIR p2
RUN vim a.txt  

(13)ONBUILD(在子鏡像中執行)

ONBUILD <Dockerfile關鍵字>  
# ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行。

(14)ARG(指定構建過程當中使用的環境變量)

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"

重新鏡像啓動容器

docker run -d -p 4000:80 --name [name] #能夠在 Dokcer 宿主機上指定一個具體的端口映射到容器的80端口上

守護容器

docker run -d container-name #建立守護容器
docker top container-name #查看容器內進程
docker exec container-name touch a.txt #在容器內部運行進程
docker stop container-name #中止容器

疑難雜症

docker login時出現問題以下:
Error saving credentials: error storing credentials - err: exit status 1, out: `The connection is closed`

解決方案:
sudo apt install gnupg2 pass

 

docker資料

官方英文資源

中文資源

其它資源

 

參考or轉發

https://www.cnblogs.com/52fhy/p/5638571.html

https://github.com/KeKe-Li/docker-directive

https://www.cnblogs.com/52fhy/p/5638571.html

相關文章
相關標籤/搜索