1、docker的 安裝 :
第一種:
docker
yum -y install docker
ubuntu
systemctl start docker.service
vim
systemctl status docker
centos
第二種:安裝包安裝緩存
[root@localhost ~]# ls
bash
[root@localhost ~]# tar xzf docker.tar.gz
服務器
[root@localhost ~]# cd docker/
網絡
[root@localhost docker]# sh docker.sh
學習
[root@localhost ~]# docker --version
ui
ce表示免費版本
[root@localhost ~]# docker ps
安裝成功
2、docker鏡像
鏡像(docker image) --- Docker 運行容器以前須要本地存在鏡像,若本能地不存在,那麼 Docker 會找默認鏡像倉庫( Docker Hub 公共註冊服務器中的倉科)下載,用戶也能夠經過配置使用本身的鏡像庫
(1)下載鏡像
#docker pull NAME:TAG
下載某個被打上了某個標籤的叫 ×× 名字的鏡像
eg:
docker pull ubuntu:latest
若在下載時你未指定標籤,默認追加 latest標籤,表示庫中最新鏡像
鏡像在下載過程當中是分層的,而且在每層前會有各層的 ID號,層(Layer )是 AUFS (聯合文件系統)的重要概念,是實現增量保存與更新的基礎
實際上面的命令的原型是
#docker pull registry.hub.docker.com/centos:7
即從默認的註冊服務器下載指定的鏡像固然,以此你也能夠用這種格式到其餘倉庫下載你所須要的鏡像了!!!
(2)查看本地鏡像相關信息
[root@localhost ~]# docker images
顯示結果:
#docker tag docker.io/ubuntu:latest ubuntu:latest
a.源自哪一個倉庫
b.標籤信息 ---用於區分同一個倉庫的同名鏡像可用 docker tag倉庫名:
標籤名 新庫名:新標籤
c. 鏡像 ID
d. 建立時間
e. 鏡像大小
更名:給對應的鏡像新添加了一個名字,使用該名字調用的仍是原來的那個鏡像
[root@localhost ~]# docker tag ppc64le/busybox:latest aaabusybox:v1
刪除起的別名
[root@localhost ~]# docker rmi aaabusybox:v1
(3)搜索庫中知足需求的鏡像,以此下載符合需求的鏡像文件
#docker search 鏡像名
顯示結果:
a.哪一個庫
b.絕對路徑,庫中的帶有搜索關鍵字的鏡像
c.描述
d.官方
e.是否自動建立
(4)刪除本地鏡像
#docker rmi imageID號 # 要刪除的鏡像對應的imageID號
eg:
docker rmi ubuntu: latest
當有別名鏡像時,是同一個ID 號多個名字,刪除任一個對互相無傷害,直至刪除最後一個,鏡像被完全刪除用ID號刪除,默認會刪除同一個ID的多個鏡像,除非該鏡像建立的容器存在,那麼鏡像可以不被刪除,因此在刪除時正確順序是先刪除使用鏡像的容器,再刪除鏡像
3、docker鏡像分層 :
docker鏡像的分層結構:支持經過擴展示有鏡像,建立新的鏡像
能夠看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現有鏡像的基礎上增長一層。
分層結構的優點:
共享資源:
有多個鏡像都從相同的 base 鏡像構建而來,那麼 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內存中也只需加載一份 base 鏡像,就能夠爲全部容器服務了。並且鏡像的每一層均可以被共享,咱們將在後面更深刻地討論這個特性。
這時可能就有人會問了:若是多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,好比 /etc 下的文件,這時其餘容器的 /etc 是否也會被修改?
答案是不會!
修改會被限制在單個容器內。
這就是咱們接下來要學習的容器 Copy-on-Write 特性。
可寫的容器層:
當容器啓動時,一個新的可寫層被加載到鏡像的頂部。這一層一般被稱做「容器層」,「容器層」之下的都叫「鏡像層」。
全部對容器的改動 - 不管添加、刪除、仍是修改文件都只會發生在容器層中。
只有容器層是可寫的,容器層下面的全部鏡像層都是隻讀的。
鏡像層數量可能會不少,全部鏡像層會聯合在一塊兒組成一個統一的文件系統。若是不一樣層中有一個相同路徑的文件,好比 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加以後的文件系統。
添加文件
在容器中建立文件時,新文件被添加到容器層中。
讀取文件
在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,打開並讀入內存。
修改文件
在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,當即將其複製到容器層,而後修改之。
刪除文件
在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到後,會在容器層中記錄下此刪除操做。
只有當須要修改時才複製一份數據,這種特性被稱做 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像自己進行任何修改。
這樣就解釋了咱們前面提出的問題:容器層記錄對鏡像的修改,全部鏡像層都是隻讀的,不會被容器修改,因此鏡像能夠被多個容器共享。
4、docker鏡像建立
建立鏡像的三種方法
(1)基於修改後的容器建立:docker commit 命令
(2)基於本地模板導入
(3)基於 Dockerfile 文件建立
(1)基於修改後的容器建立
[root@localhost ~]# docker run -it mariadb:latest /bin/sh #/bin/sh是環境變量
此時容器較鏡像已經發生改變,咱們以今生成新鏡像
[root@localhost ~]# docker ps -a #查看當前環境已有的容器
[root@localhost ~]# docker commit 5ea060bff8c9 test:latest # CONTAINER ID 新鏡像名字
[root@localhost ~]# docker images
查看鏡像列表,本地多了一個建立的新鏡像
[root@localhost ~]# docker run -it --name jxtest test:latest /bin/sh #新建立的容器名爲jxtest
這個新容器有新建立的文件
[root@localhost ~]# docker ps -a
新容器建立成功
刪除容器
[root@localhost ~]# docker rm cc01fb82e45e # 要刪除容器的CONTAINER ID
將全部容器刪除
for id in `docker ps -a | grep Exited | awk '{print $1}'`;do docker rm $id;done
(2)基於模板導出和導入鏡像
導出:將鏡像保存爲本地文件,以cturra/ntp爲例
[root@localhost ~]# docker save -o ntp.tar.gz cturra/ntp:latest
[root@localhost ~]# docker rmi c35549b258c5 #刪除cturra/ntp
導入 :將壓縮包文件導入到本地鏡像列表
[root@localhost ~]# docker load -i ntp.tar.gz
鏡像導入成功。
(3)基於 Dockerfile 文件建立
dockerfile 是一個文本文件,用來配置 image,記錄了鏡像構建的全部步驟。Docker 根據 該文件生成二進制的 image 文件。如何能夠生成 image 文件?若是你要推廣本身的軟件,勢必要本身製做 image 文件。
[root@localhost ~]# mkdir test
[root@localhost ~]# cd test/
[root@localhost test]# vim dockerfile
FROM test:latest
RUN yum install lrzsz -y
[root@localhost test]# docker build -t test:latest .
build:建立鏡像
-t:爲鏡像指定名字
.:指明 build context 爲當前目錄,咱們也能夠經過 -f 參數指定 Dockerfile 的位置
從這步開始就是鏡像真正的構建過程。 首先 Docker 將 build context 中的全部文件發送給 Docker daemon。build context 爲鏡像構建提供所須要的文件或目錄。Dockerfile 中的 ADD、COPY 等命令能夠將 build context 中的文件添加到鏡像。此例中,build context 爲當前目錄 /root/docker,該目錄下的全部文件和子目錄都會被髮送給 Docker daemon。
因此,使用 build context 就得當心了,不要將多餘文件放到 build context,特別不要把 /、/usr 做爲 build context,不然構建過程會至關緩慢甚至失敗。
[root@localhost ~]# docker history IMAGE ID #鏡像的ID
Docker 會緩存已有鏡像的鏡像層,構建新鏡像時,若是某鏡像層已經存在,就直接使用,無需從新建立。在前面的 Dockerfile 中添加一點新內容,往鏡像中複製一個文件:
5、dockerfile的經常使用命令
FROM:指定 base 鏡像。
MAINTAINER:設置鏡像的做者,能夠是任意字符串。
COPY:將文件從 build context 複製到鏡像。
COPY 支持兩種形式:
COPY src dest
COPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目錄。
ADD:與 COPY 相似,從 build context 複製文件到鏡像。不一樣的是,若是 src 是歸檔文件(tar, zip, tgz, xz 等),文件會被自動解壓到 dest。
ENV:設置環境變量,環境變量可被後面的指令使用。例如:ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
EXPOSE:指定容器中的進程會監聽某個端口,Docker 能夠將該端口暴露出來。咱們會在容器網絡部分詳細討論。
VOLUME:將文件或目錄聲明爲 volume。
WORKDIR:爲後面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設置鏡像中的當前工做目錄。
RUN:在容器中運行指定的命令,RUN 指令一般用於安裝應用和軟件包。
CMD:容器啓動時運行指定的命令。
Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效。CMD 能夠被 docker run 以後的參數替換。
ENTRYPOINT:設置容器啓動時運行的命令,可以讓容器以應用程序或者服務的形式運行。
Dockerfile 中能夠有多個 ENTRYPOINT 指令,但只有最後一個生效。CMD 或 docker run 以後的參數會被當作參數傳遞給 ENTRYPOINT。
6、docker經常使用命令
(1)建立容器,create命令是建立並不啓動容器
#docker creat -it centos:7
(2)查看全部狀態的容器
#docker ps -a 查看全部容器
#docker ps 查看全部已經開啓的容器
(3)啓動中止的容器
#docker start ID
(4)運行一個容器
#docker run -it docker.io/centos:7 /bin/bash
建立並運行一個容器 ,此時你會直接被切換到容器中
#ctrl+d//exit退出,而且容器也退出
#ctrl+p+q退出容器,而且保持容器up的狀態
-t 分配一個僞終端
-i 讓容器的標準輸入持續打開
用/bin/bash環境顯示
(5)之後臺守護進程(Daemonized)形態運行 用-d參數實現
#docker run -dti docker.io/centos:7
#docker ps -a
(6)終止容器
#docker stop NAME/ID #docker kill NAME/ID
#docker ps -a
(7)重啓容器
#docker restart NAME/ID
#docker ps -a
須要注意,非持久後臺守護狀態的虛擬機,在重啓後當你查看時仍是關閉狀態
(8)刪除容器
語法: docker rm 參數 NAME NAME …
#docker -rm -f NAME/ID
-f 強制刪除處於運行中的容器
-l 刪除連接,保留容器
-v 刪除掛載的數據卷
(9)進入容器
docker attach 和 docker exec 兩種方式:
docker attach直接進入容器 啓動命令的終端,不會啓動新的進程
#docker run -d centos /bin/bash -c while true; do sleep 1;echo I_am_docker;done」
#docker attach NAME/ID
docker exec則是在容器中打開新的終端,而且能夠啓動新的進程
#docker exec -it NAME/ID /bin/bash
(10)導入和導出容器
a. 導出容器:導出一個已經建立的容器到文件,無論容器是否運行
#docker ps -a
假設當前系統中有兩個處於運行和中止狀態的容器
#docker export ID > *.tar
#ls
b.將容器導入系統成爲鏡像
#cat *.tar | docker import - 鏡像名
(11)查看容器日誌
顯示容器啓動進程的控制檯輸出
#docker logs -f 容器的CONTAINER ID
(12)暫停容器
#docker pause NAME/ID
(13)取消暫停繼續運行容器
#docker unpause NAME/ID