Docker菜鳥教程-硬敲系列
Docker
容器技術/相互隔離,一次部署,多次複用,
建議直接看菜鳥教程,抄的它的
0. Centos安裝
curl -sSL https://get.daocloud.io/docker | sh
1. HelloWorld
docker run ubuntu:15.10 /bin/echo "hello"
- docker: Docker 的二進位制執行檔案。
- run: 與前面的 docker 組合來執行一個容器。
- ubuntu:15.10 指定要執行的映象,Docker 首先從本地主機上查詢映象是否存在,如果不存在,Docker 就會從映象倉庫 Docker Hub 下載公共映象。
- /bin/echo "Hello world":
互動式執行容器
docker run -i -t ubuntu:15.10 /bin/bash
- -t: 在新容器內指定一個偽終端或終端。
- -i: 允許你對容器內的標準輸入 (STDIN) 進行互動。
exit: 退出容器
後臺執行容器
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
- -d:後臺執行容器,返回一個容器ID
檢視容器狀態
docker ps -a
輸出詳情介紹:
CONTAINER ID: 容器 ID。
IMAGE: 使用的映象。
COMMAND: 啟動容器時執行的命令。
CREATED: 容器的建立時間。
STATUS: 容器狀態。
狀態有7種:
- created(已建立)
- restarting(重啟中)
- running 或 Up(執行中)
- removing(遷移中)
- paused(暫停)
- exited(停止)
- dead(死亡)
PORTS: 容器的埠資訊和使用的連線型別(tcp\udp)。
NAMES: 自動分配的容器名稱。
檢視容器內標準輸出
docker logs 容器ID/容器Name
停止容器
docker stop 容器ID/容器NAME
2. 容器使用
客戶端/命令檢視
docker ps --help
:檢視ps命令的幫助資訊
容器使用
a. 獲取映象
docker pull ubuntu
b. 啟動容器(互動命令列進入)
docker run -it ubuntu /bin/bash
引數說明:
- -i: 互動式操作。
- -t: 終端。
- ubuntu: ubuntu 映象。
- /bin/bash:放在映象名後的是命令,這裡我們希望有個互動式 Shell,因此用的是 /bin/bash。
要退出終端,直接輸入 exit:
啟動已停止的容器
docker start 容器ID/容器NAME
後臺執行
docker run -itd --name 容器名稱 映象名稱 /bin/bash
docker run -itd --name ubuntu-test ubuntu /bin/bash
停止一個容器
docker stop 容器ID/容器Name
重啟
docker restart 容器ID/容器Name
進入容器
在使用 -d 引數時,容器啟動後會進入後臺。此時想要進入容器
docker exec -it 容器ID/容器Name /bin/bash
c. 匯出/入容器
-
匯出
docker export 容器ID > 匯出檔名稱
-
匯入(容器匯入成映象)
cat ubuntu.zip | docker import - test/ubuntu:v1
d. 刪除容器
docker rm -f 容器ID/容器NAME
docker container prune
刪除所有終止狀態的容器
e. 執行一個WEB應用
-
docker pull training/webapp
# 拉取映象 -
# 執行容器 docker run -d -P training/webapp python app.py
引數說明:
- -d:讓容器在後臺執行。
- -P:將容器內部使用的網路埠隨機對映到我們使用的主機上。
檢視WEB應用
docker ps
Docker 開放了 5000 埠(預設 Python Flask 埠)對映到主機埠 32769 上。
指定埠對映
docker run -d -p 5000:5000 training/webapp python app.py
: 容器埠5000 對映到主機埠5000上
- docker port 容器ID:快捷檢視容器埠
檢視WEB應用日誌
docker logs -f 容器ID/容器NAME
docker top 容器ID/容器Name
檢視容器內部執行的程序
檢查WEB應用程式
使用 docker inspect 來檢視 Docker 的底層資訊。它會返回一個 JSON 檔案記錄著 Docker 容器的配置和狀態資訊。
docker inspect 容器ID/容器NAme
停止WEB應用容器
docker start 容器名稱/容器ID
重啟WEB應用容器
docker start 容器名稱/容器ID
docker ps -l
查詢最後一次建立的容器
移除WEB應用容器
docker rm -f 容器ID/容器名稱
: 不帶-f 將只能刪除停止執行的容器
3. 映象使用
執行容器時,使用的映象如果不在本地中存在,docker會自動從映象倉庫(docker hub)拉取
列出映象列表
docker images
各個選項說明:
- REPOSITORY:表示映象的倉庫源
- TAG:映象的標籤
- IMAGE ID:映象ID
- CREATED:映象建立時間
- SIZE:映象大小
同一倉庫源可以有多個TAG,表示不同倉庫源的版本
指定TAG(版本)
docker run -t -i ubuntu:15.10 /bin/bash
;如果你不指定一個映象的版本標籤,例如你只使用 ubuntu,docker 將預設使用 ubuntu:latest 映象。引數說明:
- -i: 互動式操作。
- -t: 終端。
- ubuntu:15.10: 這是指用 ubuntu 15.10 版本映象為基礎來啟動容器。
- /bin/bash:放在映象名後的是命令,這裡我們希望有個互動式 Shell,因此用的是 /bin/bash。
獲取一個新的映象
docker pull 映象名稱:tag名稱(可選)
查詢映象
docker search httpd
NAME: 映象倉庫源的名稱
DESCRIPTION: 映象的描述
OFFICIAL: 是否 docker 官方釋出
stars: 類似 Github 裡面的 star,表示點贊、喜歡的意思。
AUTOMATED: 自動構建。
刪除映象
docker rmi 映象名稱/映象ID
更新映象
建立映象的第一種方式,需要使用映象來建立一個容器
docker run -t -i ubuntu:15.10 /bin/bash
apt-get update
更改docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
將更改後的容器打成映象
各個引數說明:
- -m: 提交的描述資訊
- -a: 指定映象作者
- e218edb10161:容器 ID
- runoob/ubuntu:v2: 指定要建立的目標映象名
第二種方式:構建映象''我們使用命令 docker build , 從零開始來建立一個新的映象。為此,我們需要建立一個 Dockerfile 檔案,其中包含一組指令來告訴 Docker 如何構建我們的映象。
-
建立一個Dockfile
# 指定使用那個映象源,這裡表示指定centos6.7版本 FROM centos:6.7 MAINTAINER Fisher "[email protected]" # RUN 在映象內執行的命令 RUN /bin/echo 'root:123456' | chpasswd RUN useradd runoob RUN /bin/echo 'runoob:123456' | chpasswd RUN /bin/echo -e "LANG=\"en_US.UTF-8"">/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D
-
構建
docker build -t runoob/centos:6.7
- -t :指定要建立的目標映象名
- . :Dockerfile 檔案所在目錄,可以指定Dockerfile 的絕對路徑
設定映象標籤
docker tag 容器ID 映象源名:標籤名
4. Dockerfile
Dockerfile 是一個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明
定製一個nginx映象
# 基於nginx的映象
FROM nginx
# 執行命令
RUN echo '本地構建的nginx映象'> /usr/share/nginx/html/index.html
2、FROM 和 RUN 指令的作用
FROM:定製的映象都是基於 FROM 的映象,這裡的 nginx 就是定製需要的基礎映象。後續的操作都是基於 nginx。
RUN:用於執行後面跟著的命令列命令。有以下倆種格式:
shell 格式:
RUN <命令列命令>
# <命令列命令> 等同於,在終端操作的 shell 命令。
exec 格式:
RUN ["可執行檔案", "引數1", "引數2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offline
注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成映象膨脹過大。例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
# 以上執行會建立 3 層映象。可簡化為以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
開始構建映象
docker build -t nginx:v3 .
, .表示執行當前目錄下Dockerfile
上下文路徑
上一節中,有提到指令最後一個 . 是上下文路徑,那麼什麼是上下文路徑呢?
$ docker build -t nginx:v3 .
上下文路徑,是指 docker 在構建映象,有時候想要使用到本機的檔案(比如複製),docker build 命令得知這個路徑後,會將路徑下的所有內容打包。
解析:由於 docker 的執行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的檔案。這就需要把我們本機的指定目錄下的檔案一起打包提供給 docker 引擎使用。
如果未說明最後一個引數,那麼預設上下文路徑就是 Dockerfile 所在的位置。
注意:上下文路徑下不要放無用的檔案,因為會一起打包傳送給 docker 引擎,如果檔案過多會造成過程緩慢。
指令詳解
- COPY 從上下文目錄中複製檔案/目錄到容器
COPY [--chown=<user>:<group>] <源路徑1>... <目標路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
COPY hom* /mydir/
COPY hom?.txt /mydir/
-
CMD: 類似於RUN指令,用於執行程式
- CMD 在docker run 時執行。
- RUN 是在 docker build。
作用:為啟動的容器指定預設要執行的程式,程式執行結束,容器也就結束。CMD 指令指定的程式可被 docker run 命令列引數中指定要執行的程式所覆蓋。
注意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最後一個生效。
格式:
CMD <shell 命令> CMD ["<可執行檔案或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 該寫法是為 ENTRYPOINT 指令指定的程式提供預設引數
EXPOSE
僅僅只是宣告埠。
作用:
- 幫助映象使用者理解這個映象服務的守護埠,以方便配置對映。
- 在執行時使用隨機埠對映時,也就是 docker run -P 時,會自動隨機對映 EXPOSE 的埠。
格式:
EXPOSE <埠1> [<埠2>...]
WORKDIR
指定工作目錄。用 WORKDIR 指定的工作目錄,會在構建映象的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前建立好的)。
docker build 構建映象過程中的,每一個 RUN 命令都是新建的一層。只有通過 WORKDIR 建立的目錄才會一直存在。
格式:
WORKDIR <工作目錄路徑>