Docker 初見

目錄

一、概念

1.1、Docker 存在的意義?

Docker 的存在是為了解決開發到部署中間存在的各種困難,例如,由於環境不一致,運維拿去還要進行很多相關環境的配置、安裝,且環境裝好後不一定還能進行成功的部署,工作中帶來了很大的麻煩。Docker 就可以完美的解決這一問題;

Docker 可以實現,進行一次構建就可以到處運行的理念(將我們所用到的所有環境,包括各種配置、應用環境等),可以類比為 Java 的可跨平台性,可以比作一個簡易版的 Linux 環境;

1.2、組成

1.2.1、Docker 架構圖

image-20211213201637469

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

image-20211213211305483

到這裡就算是安裝成功了;

1.3.8、配置阿里雲鏡像加速

進入到阿里雲獲取指定的自己的加速地址(自己去申請);

image-20211225161145667

在 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

image-20211216211551870

可以加上 -f [條件] 選項進行篩選

docker  search -f stars=30  tomcat

2.2、拉取\下載鏡像

拉取\下載鏡像到本地倉庫

docker pull tomcat

上述命令的默認是 docker pull tomcat:latest

2.3、查詢本地倉庫中的鏡像

查詢本地倉庫中的鏡像的 docker 鏡像

docker images

image-20211217203405842

僅僅顯示鏡像 id

docker images -q

image-20211217203421828

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

image-20211218211501716

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。

image-20211218201026398

其實是裏面包含了很多東西包含了能支撐 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

image-20211218201725563

那麼這樣一來的意思是我們通過地址 ip:8989, 就可以對 Tomcat 進行訪問了。

-p 8989:8080 的意義在於,將外部真實虛擬機的端口 8989 映射到 docker 中的端口 8080 即可。

3.2、大 P 隨機分配映射端口

docker run -it -P tomcat:9.0.24

image-20211218203852418

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 的形式發佈;

image-20211218211117957

3.4、鏡像導出

為什麼要做導入導出?因為我們在開發過程中,我們自己打包好了的鏡像肯定會交給其他的人來運行,那麼這個時候,就會涉及到鏡像的打包、導出、導入操作;

docker save [option] 生成文件名 被導出鏡像
docker save -o my_tomcat.tar atroot/mytomcat_1:1.0

image-20211225130937626

3.5、鏡像導入

docker load [option] 
docker load --input my_tomcat.tar

-input , -i 導入指定的文件

image-20211225131951979


四、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 結構大致分為四個部分:

  1. 基礎鏡像信息
  2. 維護者信息
  3. 鏡像操作指令
  4. 容器啟動時執行指令

4.2、執行 Dockerfile 的大致流程

  1. docker 從基礎鏡像運行一個容器
  2. 執行指令並對容器做出修改
  3. 執行類似 docker commit 的操作提交一個新的鏡像
  4. docker 運行上一步提交的新容器
  5. 執行 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 .

如下為構建完成結果圖:
image-20211224165731394

image-20211224170219495

驗證工作目錄確實為我們設置的;

image-20211224170422401

查看鏡像歷史
docker history mycentos:7.1

從下往上看!

image-20211224171636578

五、容器數據卷

為了使數據持久化,所謂的數據卷。類比 Redis 的數據持久化。

解決了容器的持久化、容器間繼承和共享數據;

5.1、特點

image-20211218213302899

可以實現容器到主機和主機到容器的數據共享;

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

image-20211222204054976

編輯好上述的文件之後,使用 docker build 命令進行構建一個自定義的 Centos 鏡像,注意後面的一個 「 . 」代表的是當前目錄 ;

docker build -f Dockerfile -t atroot/centos .

執行結果如下

image-20211222204118995

image-20211222204205874

將該創建好了的簡潔的 Centos,run 起來;

docker run -it --name centos_2 atroot/centos /bin/bash

image-20211222205327561

上面的兩個卷就是我們批量創建的容器卷,對應着宿主機中的如下所示位置:

宿主機上執行,查看詳細內容,在其中的 Mounts 中藏着這倆個東東;

docker inspect centos_2

image-20211222205851860

/var/lib/docker/volumes/ea07fbf2ceb1f5fbd050d2441283a88eab2e1fb6d449e0ff4b4722497ed0c2d7/_data
/var/lib/docker/volumes/84b3700ab2796df11a928580bdaae8a3bed966907d7193868ed8d9761a333ea8/_data

六、容器間的傳遞、共享性

6.1、定義

這個東西,有點類似於把容器數據卷做了一個類似於「訂閱」的功能

6.2、怎麼玩

  1. 先啟動一個容器,並且在其 Volume 對應的文件夾中修改文件;

  2. 啟動另外的容器,並掛載到已經啟動了的 centos_2 上面;

docker run -it --name centos_21 --volumes-from centos_2 atroot/centos

image-20211222212715273

可以掛載多個上去,實現容器間文件共享、傳遞的作用,這裡不做多餘示範;

6.3、特點

  • 刪除被掛載的第一台機器的時候,其他機器任然可以互相傳遞、共享數據;
  • 容器間的配置信息的傳遞,數據卷的生命周期一直持續到沒有容器為止

七、鏡像到遠程庫的操作

7.1、創建阿里雲賬號

7.2、進入容器鏡像服務

7.3、創建好容器倉庫

創建好,大概就會顯示以下界面了,教程!

image-20211225165454544

7.4、推送到遠程庫

7.4.1、登錄

我這裡創建的是杭州節點的倉庫,所以是 hangzhou,這個要看自己的配置的。

docker login --username=zheng**** registry.cn-hangzhou.aliyuncs.com

image-20211225165858437

7.4.2、設置標籤版本等信息

#  鏡像版本號是定義傳到遠程庫的版本號的,不必和本地保持一致
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/******/****study:[鏡像版本號]

設置好後,如下所示:

image-20211225171113779

7.4.3、推送

這裡的版本號,要和上邊改好了的保持一致!

docker push registry.cn-hangzhou.aliyuncs.com/******/******study:1.1

image-20211225171611427

7.5、拉取鏡像

docker pull registry.cn-hangzhou.aliyuncs.com/****/*****_study:[鏡像版本號]

image-20211225172416487

完結!