Docker 初見
一、概念
1.1、Docker 存在的意義?
Docker 的存在是為了解決開發到部署中間存在的各種困難,例如,由於環境不一致,運維拿去還要進行很多相關環境的配置、安裝,且環境裝好後不一定還能進行成功的部署,工作中帶來了很大的麻煩。Docker 就可以完美的解決這一問題;
Docker 可以實現,進行一次構建就可以到處運行的理念(將我們所用到的所有環境,包括各種配置、應用環境等),可以類比為 Java 的可跨平台性,可以比作一個簡易版的 Linux 環境;
1.2、組成
1.2.1、Docker 架構圖
1.2.2、各個模塊概念
Docker 利用容器(Container)獨立的運行一個或者一組應用,容器是用來鏡像創建實例運行的地方;
它可以啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台;就相當於一個簡易版的 Linux 環境,包括各種配置等;
Client
Client 就是一個可以操作 Docker 的客戶端,可以運行各種操作 Docker 的命令。當一個容器運行一個服務時,當我們需要的時候,我們就通過 Docker 客戶端創建一個對應的運行實例,也就是容器;
Images
Images 稱為鏡像,我們把應用程序和配置依賴打包成一個可以交付的運行環境,這個打包好的運行環境就是 Images 鏡像文件,我們可以通過該鏡像文件創建 docker 容器實例;Images 可以看做是容器的模板,同一個 Images 可以同時創建多個實例;
Registry
倉儲,就是存放我們鏡像的地方,我們可以把鏡像發佈到倉儲中,在需要的時候拉下來創建實例即可;
1.3、Docker 下載安裝
基於 Centos 7 下安裝 Docker;
安裝
1.3.1、卸載舊版本 Docker
如果安裝過舊版本的 Docker 需要先卸載舊版本的 Docker;
yum remove docker docker-common docker-selinux docker-engine
1.3.2、安裝所需要的依賴
yum-utils、 device-mapper-persistent-data、 lvm2
yum install yum-utils device-mapper-persistent-data lvm2
1.3.3、添加 yum 源
我們這裡直接添加為阿里雲的源,國外的源太慢了;
yum-config-manager --add-repo //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.3.4、查看版本
查看 yum 軟件倉庫中的所有版本的 docker 軟件;
yum list docker-ce --showduplicates | sort -r
1.3.5、安裝
yum install -y docker-ce
選擇版本安裝:
yum install docker-ce-17.12.0.ce
1.3.6、設置開機啟動,並開啟服務
systemctl enable docker
systemctl start docker
1.3.7、檢查版本
docker version
到這裡就算是安裝成功了;
1.3.8、配置阿里雲鏡像加速
進入到阿里雲獲取指定的自己的加速地址(自己去申請);
在 Linux 相應的位置上創建配置文件(如果沒有的話)
vim /etc/docker/daemon.json
寫入 json 文件中對應的信息
{
"registry-mirrors": ["//0****7a.mirror.aliyuncs.com"]
}
重啟服務
systemctl daemon-reload
systemctl restart docker
1.4、Docker 的 Hello World
docker run hello-world
Docker 首先會在本地找 hello-world 的鏡像,在找不到的時候,就會去 DockerHub 找,找到了就會自動下載到本地的庫里,我們這裡配置了阿里雲的 DockerHub 的鏡像加速器;
二、常用命令
我們在系統里可以嘗試使用 docker –help 來查看更多的命令或者指南;
docker [OPTIONS] COMMAND
docker --help
2.1、搜索鏡像
docker search xxx
可以加上 -f [條件] 選項進行篩選
docker search -f stars=30 tomcat
2.2、拉取\下載鏡像
拉取\下載鏡像到本地倉庫
docker pull tomcat
上述命令的默認是 docker pull tomcat:latest
2.3、查詢本地倉庫中的鏡像
查詢本地倉庫中的鏡像的 docker 鏡像
docker images
僅僅顯示鏡像 id
docker images -q
2.4、鏡像刪除命令
docker rmi -f [鏡像名]....
組合命令
docker rmi -f $(docker images -q)
2.5、運行命令
docker run [OPTIONS] IMAGE
這裡以 Centos 為例做筆記
docker run -it centos
--name "容器新名字"為容器指定一個名字
-d 後台運行容器,並返回容器 id,也即啟動守護式容器
-i 以交互模式運行容器,通常以 -t 同時使用
-t 為容器重新分配一個偽輸入終端,通常與 -i 同時使用
-P(大寫) 隨機端口映射
-p(小寫) 指定端口映射一般有以下四種形式
ip:hostport:containerPort
ip:containerPort
containerPort
2.5.1、大小寫 -p 的端口映射用法
在後面的筆記寫!
[小寫看這裡](###用參數小 p 運行)
[大寫看這裡](###大 P 隨機分配映射端口)
2.6、查看 docker 中運行的容器
docker ps -[選項]
選項
-a 列出當前所有正在運行的容器和歷史運行過的
-l 列出最近創建的容器
-n 顯示最近n個創建的容器
-q 靜默模式,只顯示容器編號
--no-trunc 不截斷輸出
查看所有容器的另一種辦法,雖然上邊的更好用,但是寫都寫了
docker container ps -a
2.7、退出容器
# 直接關閉容器並退出
exit
# 退出但不關閉
ctrl + p + q
看下面 [退出但不關閉,如何重新進入?](###2.13.2、直接進入到 Centos);
2.8、強制停止容器
docker kill container-id或容器名
2.9、啟動或者重啟容器
docker start container-id或者names
docker restart container-id或者names
2.10、刪除容器
docker rm container-id
2.11、啟動守護進程
以守護進程啟動,默認在自動啟動之後進行」自殺「
docker run -d 容器名或者容器id
2.12、查看容器日誌
docker logs [參數] 容器id或容器名
-f 跟隨最新的日誌打印
-t 加入時間戳
--tail 顯示最後幾條
2.13、重新進入系統執行命令
2.13.1、直接拿到返回結果
在 docker 中的 centos_1 的容器中的 /etc 目錄下執行 ls -a 命令
docker exec -it centos_1 ls -a /etc
2.13.2、直接進入到 Centos
對應我們前面所寫的,重新進入系統
docker attach centos_1
2.13.3、從docker中拷貝文件
docker cp centos_1:/tmp/hello.txt /root
三、鏡像原理
我們通常在遠端倉庫里拉取下來的鏡像都是內置了環境的,比如說我們拉下來的 Tomcat 很大,有624 M。
其實是裏面包含了很多東西包含了能支撐 Tomcat 運行起來的一切的環境配置等,所以會很大。
3.1、用小 p 指定端口映射方式運行
-p
我們這裡拉取了一個版本號為 9.0.24 的Tomcat,並通過我們之前介紹的一種端口映射方式將其運行起來
docker pull tomcat:9.0.24
docker run -it --name tomcat01 -p 8989:8080 tamcat:9.0.24
那麼這樣一來的意思是我們通過地址 ip:8989, 就可以對 Tomcat 進行訪問了。
-p 8989:8080 的意義在於,將外部真實虛擬機的端口 8989 映射到 docker 中的端口 8080 即可。
3.2、大 P 隨機分配映射端口
docker run -it -P tomcat:9.0.24
3.3、鏡像的提交/構建
將正在運行的容器,打包成鏡像!
docker commit -a="atroot" -m="helloworld docker commit test" 6f9f849b2099 atroot/tomcat:1.0
-a 代表的是作者
-m 代表描述?
後面的 image-id 是修改後的 container-id,將其打成 images
以名為 atroot/tomcat:1.0 的形式發佈;
3.4、鏡像導出
為什麼要做導入導出?因為我們在開發過程中,我們自己打包好了的鏡像肯定會交給其他的人來運行,那麼這個時候,就會涉及到鏡像的打包、導出、導入操作;
docker save [option] 生成文件名 被導出鏡像
docker save -o my_tomcat.tar atroot/mytomcat_1:1.0
3.5、鏡像導入
docker load [option]
docker load --input my_tomcat.tar
-input , -i 導入指定的文件
四、DockerFile(重要)
4.1、Dockerfile 是什麼?
一個 Dockerfile 文件示例
#基於centos鏡像
FROM centos
#維護人的信息
MAINTAINER The CentOS Project <[email protected]>
#安裝httpd軟件包
RUN yum -y update
RUN yum -y install httpd
#開啟80端口
EXPOSE 80
#複製網站首頁文件至鏡像中web站點下
ADD index.html /var/www/html/index.html
#複製該腳本至鏡像中,並修改其權限
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#當啟動容器時執行的腳本文件
CMD ["/run.sh"]
由上面的信息我們可以知道,Dockerfile 結構大致分為四個部分:
- 基礎鏡像信息
- 維護者信息
- 鏡像操作指令
- 容器啟動時執行指令
4.2、執行 Dockerfile 的大致流程
- docker 從基礎鏡像運行一個容器
- 執行指令並對容器做出修改
- 執行類似 docker commit 的操作提交一個新的鏡像
- docker 運行上一步提交的新容器
- 執行 Dockerfile 中的下一條指令知道所有命令都執行完成
4.3、Dockerfile 的一些命令
FROM
基於哪個鏡像進行改造;
MAINTAINER
寫作者的一些信息,鏡像維護着的姓名和郵箱;
RUN
寫容器構建時需要運行的命令;
EXPOSE
寫當前容器對外暴露出的端口;
WORKDIR
指定在容器創建後,終端默認進來的工作目錄;
ENV
用來構建鏡像過程中設置環境變量;
ADD
將宿主機目錄下的文件拷貝進鏡像,且 ADD 命令會自動處理 URL 和解壓 tar 壓縮包;
COPY
類似於 ADD。拷貝文件和目錄到鏡像中;
VOLUME
容器數據卷,用於數據保存和持久化工作;
CMD
指定一個容器啟動時要運行的命令;Dockerfile 中有多個 CMD 指令,但是只會生效最後一個,CMD 會被 docker run 之後的參數替換;
ENTRYPOINT
指定一個容器啟動時要運行的命令;其目的和 CMD 一樣,都是在指定容器啟動程序及參數;他的命令是追加不是像 CMD 那樣覆蓋,docker run 之後的參數會被當做參數傳給 ENTRYPOINT,之後形成新的命令組合
ONBUILD
當構建一個被繼承的 Dockerfile 時運行的命令時,父鏡像在被子繼承後父鏡像的 ONBUILD 被觸發(觸發器觸發);
4.4、測試用 Dockerfile 定義鏡像
Base 鏡像(search),Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的;這裡我將自定義一個 Centos 鏡像,使其具備以下條件:登錄後的默認路徑、vim 編輯器、支持查看網絡配置 ifconfig;
4.1.1、添加 Dockerfile 文件
創建一個文件,並不是一定要叫 Dockerfile,但是最好叫這個!
vim Dockerfile
編輯如下內容:
# 基於centos 鏡像
FROM centos:centos7.9.2009
# 作者信息
MAINTAINER atroot<[email protected]>
# 定義變量
ENV MYPATH /usr/local
# 定義工作空間
WORKDIR $MYPATH
# 安裝所需要的軟件
RUN yum install -y vim
RUN yum install -y net-tools
# 開放端口
EXPOSE 80
# 執行命令
CMD echo $MYPATH
CMD echo "success!"
CMD /bin/bash
4.1.2、開始構建
如果 Dokcerfile1 是在當前目錄下的,那麼 -f 參數以及文件名是不用寫的;記得在結尾加一個點 . ,表示當前路徑;
docker build -f /root/mydocker/Dockerfile1 -t mycentos:7.1 .
如下為構建完成結果圖:
驗證工作目錄確實為我們設置的;
查看鏡像歷史
docker history mycentos:7.1
從下往上看!
五、容器數據卷
為了使數據持久化,所謂的數據卷。類比 Redis 的數據持久化。
解決了容器的持久化、容器間繼承和共享數據;
5.1、特點
可以實現容器到主機和主機到容器的數據共享;
5.2、數據卷
5.2.1、容器內添加
docker run -it -v /myDataVolume:/dataVolumeContainer centos:latest
創建並運行一個帶有數據卷的容器實例,這裡的 -v 就是我們這裡特殊的符號,綁定掛載一個卷。前者是宿主機的內存路徑,後者是容器內的卷路徑,可以在其中進行數據共享等操作,重啟容器不會受到影響;
5.2.2、Dokcerfile 添加容器數據卷
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished"
CMD /bin/bash
上面的文件內容就想當於以下命令;
docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash
編輯好上述的文件之後,使用 docker build 命令進行構建一個自定義的 Centos 鏡像,注意後面的一個 「 . 」代表的是當前目錄 ;
docker build -f Dockerfile -t atroot/centos .
執行結果如下
將該創建好了的簡潔的 Centos,run 起來;
docker run -it --name centos_2 atroot/centos /bin/bash
上面的兩個卷就是我們批量創建的容器卷,對應着宿主機中的如下所示位置:
宿主機上執行,查看詳細內容,在其中的 Mounts 中藏着這倆個東東;
docker inspect centos_2
/var/lib/docker/volumes/ea07fbf2ceb1f5fbd050d2441283a88eab2e1fb6d449e0ff4b4722497ed0c2d7/_data
/var/lib/docker/volumes/84b3700ab2796df11a928580bdaae8a3bed966907d7193868ed8d9761a333ea8/_data
六、容器間的傳遞、共享性
6.1、定義
這個東西,有點類似於把容器數據卷做了一個類似於「訂閱」的功能
6.2、怎麼玩
-
先啟動一個容器,並且在其 Volume 對應的文件夾中修改文件;
-
啟動另外的容器,並掛載到已經啟動了的 centos_2 上面;
docker run -it --name centos_21 --volumes-from centos_2 atroot/centos
可以掛載多個上去,實現容器間文件共享、傳遞的作用,這裡不做多餘示範;
6.3、特點
- 刪除被掛載的第一台機器的時候,其他機器任然可以互相傳遞、共享數據;
- 容器間的配置信息的傳遞,數據卷的生命周期一直持續到沒有容器為止;
七、鏡像到遠程庫的操作
7.1、創建阿里雲賬號
7.2、進入容器鏡像服務
7.3、創建好容器倉庫
創建好,大概就會顯示以下界面了,教程!
7.4、推送到遠程庫
7.4.1、登錄
我這裡創建的是杭州節點的倉庫,所以是 hangzhou,這個要看自己的配置的。
docker login --username=zheng**** registry.cn-hangzhou.aliyuncs.com
7.4.2、設置標籤版本等信息
# 鏡像版本號是定義傳到遠程庫的版本號的,不必和本地保持一致
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/******/****study:[鏡像版本號]
設置好後,如下所示:
7.4.3、推送
這裡的版本號,要和上邊改好了的保持一致!
docker push registry.cn-hangzhou.aliyuncs.com/******/******study:1.1
7.5、拉取鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/****/*****_study:[鏡像版本號]
完結!