Docker入門筆記

步入社會的第一個項目部署的時候就用到了docker,之前從未接觸過docker,從零開始學習。嫌看視頻慢,本着理論與實戰相結合的遵旨,看着Docker中文文檔直接上手使用。


1、Docker概述

Docker是一款針對程序開發人員和系統管理員來開發、部署、運行應用的一款虛擬化平臺。Docker 可以讓你像使用集裝箱一樣快速的組合成應用,並且可以像運輸標準集裝箱一樣,儘可能的屏蔽代碼層面的差異。Docker 會儘可能的縮短從代碼測試到產品部署的時間。

1.1 什麼是docker

Docker是基於Go語言實現的雲開源項目,誕生於2013年初,最初的發起者是dotCloud公司。Docker的主要目標是“Build,Ship and Run Any App,Anywhere"等生命週期的管理,達到應用組件級別的”一次封裝,到處運行“。

Docker引擎的基礎是Linux容器(Linux Containers,LXC)技術。目前LXC已被集成到主流的Linux內核中,成爲Linux系統輕量級容器技術的事實標準。

容器技術準確的描述是:容器有效的將由單個操作系統管理的資源劃分到孤立的組中,以便更好的在孤立的組之間平衡有衝突的資源使用需求。與虛擬化相比,這樣即不需要指令級模擬,也不需要即時編譯。

1.2 爲什麼使用docker

Docker在開發和運維過程中,有如下幾個方面的優勢:

A. 更快速的交換和部署。

開發人員可以使用鏡像來快速構建一套標準的開發環境;開發、測試、運維人員可以直接使用相同環境來部署代碼。Docker可以快速創建、刪除容器,實現快速迭代,節約大量開發、測試、部署時間。

B. 更高效的資源利用。

Docker是內核級的虛擬化,啓動更快,消耗資源更小。

C. 更輕鬆的遷移和擴展。

Docker容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云等。

D. 更簡單的更新管理 。

Docker所有修改都以增量的方式進行分發和更新,從而更容易的實現自動化。

1.3 docker與虛擬機的比較

特性 容器 虛擬機

啓動速度

秒級

分鐘級

硬盤使用

一般MB

一般GB

性能

接近原生

弱於

系統支持量

單機支持上千容器

一般幾十個

隔離性

安全隔離

完全隔離

2、Docker核心概念及安裝

docker鏡像:類似於虛擬機鏡像,可以將它理解爲一個面向Docker引擎的只讀模板,包含了文件系統。

docker容器:容器是從鏡像創建的應用運行實例,可以將其啓動、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。

形象的比喻解釋這兩個概念,就像是模型與產品。當一個鏡像建好以後就不再改變,根據這一個鏡像可以啓動好多容器。把鏡像就比作那模型,把容器就比作產品。也好比類與對象的關係,一個類可以構建出多個對象。

Docker倉庫:類似於代碼倉庫,是Docker集中存放鏡像文件的場所。註冊服務器是存放倉庫的地方,其中放着多個倉庫。每個倉庫集中存放一類鏡像,通過不同的標籤(tag)來進行區分。

docker的安裝

Docker 的安裝和使用有一些前提條件,主要體現在體系架構和內核的支持上。對於體系架構,除了 Docker 一開始就支持的 X86-64 ,其他體系架構的支持則一直在不斷地完善和推進中。

Docker 分爲 CE 和 EE 兩大版本。 CE 即社區版(免費,支持週期 7 個月), EE 即企業版,強調安全,付費使用,支持週期 24 個月。

我的安裝環境:linux centos7 64位

首先卸載掉舊版docker

[root@slave1 ~]# sudo yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-selinux \
>                   docker-engine-selinux \
>                   docker-engine

安裝docker(以下是安裝命令及安裝日誌輸出)

[root@slave1 ~]# sudo yum install docker
已加載插件:fastestmirror
base                                                                                                                                                  | 3.6 kB  00:00:00     
extras                                                                                                                                                | 3.4 kB  00:00:00     
updates                                                                                                                                               | 3.4 kB  00:00:00     
(1/4): extras/7/x86_64/primary_db                                                                                                                     | 205 kB  00:00:01     
(2/4): base/7/x86_64/group_gz                                                                                                                         | 166 kB  00:00:01     
(3/4): updates/7/x86_64/primary_db                                                                                                                    | 6.5 MB  00:00:17     
(4/4): base/7/x86_64/primary_db                                                                                                                       | 6.0 MB  00:00:31     
Determining fastest mirrors
 * base: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
正在解決依賴關係
--> 正在檢查事務
---> 軟件包 docker.x86_64.2.1.13.1-96.gitb2f74b2.el7.centos 將被 安裝
--> 正在處理依賴關係 docker-common = 2:1.13.1-96.gitb2f74b2.el7.centos,它被軟件包 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 需要
--> 正在處理依賴關係 docker-client = 2:1.13.1-96.gitb2f74b2.el7.centos,它被軟件包 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 需要
--> 正在處理依賴關係 subscription-manager-rhsm-certificates,它被軟件包 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 需要
--> 正在檢查事務
....
.....
......
已安裝:
  docker.x86_64 2:1.13.1-96.gitb2f74b2.el7.centos                                                                                                                            

作爲依賴被安裝:
  PyYAML.x86_64 0:3.10-11.el7                                                      atomic-registries.x86_64 1:1.22.1-26.gitb507039.el7.centos                                
  audit-libs-python.x86_64 0:2.8.4-4.el7                                           checkpolicy.x86_64 0:2.5-8.el7                                                            
  container-selinux.noarch 2:2.99-1.el7_6                                          container-storage-setup.noarch 0:0.11.0-2.git5eaf76c.el7                                  
  containers-common.x86_64 1:0.1.35-2.git404c5bd.el7.centos                        docker-client.x86_64 2:1.13.1-96.gitb2f74b2.el7.centos                                    
  docker-common.x86_64 2:1.13.1-96.gitb2f74b2.el7.centos                           libcgroup.x86_64 0:0.41-20.el7                                                            
  libsemanage-python.x86_64 0:2.5-14.el7                                           libyaml.x86_64 0:0.1.4-11.el7_0                                                           
  oci-register-machine.x86_64 1:0-6.git2b44233.el7                                 oci-systemd-hook.x86_64 1:0.2.0-1.git05e6923.el7_6                                        
  oci-umount.x86_64 2:2.3.4-2.git87f9237.el7                                       policycoreutils-python.x86_64 0:2.5-29.el7_6.1                                            
  python-IPy.noarch 0:0.75-6.el7                                                   python-backports.x86_64 0:1.0-8.el7                                                       
  python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7                       python-ipaddress.noarch 0:1.0.16-2.el7                                                    
  python-pytoml.noarch 0:0.1.14-1.git7dea353.el7                                   python-setuptools.noarch 0:0.9.8-7.el7                                                    
  setools-libs.x86_64 0:3.3.8-4.el7                                                subscription-manager-rhsm-certificates.x86_64 0:1.21.10-3.el7.centos                      
  yajl.x86_64 0:2.0.4-4.el7                                                       

作爲依賴被升級:
  audit.x86_64 0:2.8.4-4.el7                  audit-libs.x86_64 0:2.8.4-4.el7                      libselinux.x86_64 0:2.5-14.1.el7 libselinux-python.x86_64 0:2.5-14.1.el7
  libselinux-utils.x86_64 0:2.5-14.1.el7      libsemanage.x86_64 0:2.5-14.el7                      libsepol.x86_64 0:2.5-10.el7     policycoreutils.x86_64 0:2.5-29.el7_6.1
  selinux-policy.noarch 0:3.13.1-229.el7_6.12 selinux-policy-targeted.noarch 0:3.13.1-229.el7_6.12

完畢!

安裝完畢後驗證!

[root@slave1 ~]# docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: 

3、使用筆記

3.1 首先啓動Docker-CE

[root@slave1 ~]# sudo systemctl enable docker
[root@slave1 ~]# sudo systemctl start docker

使用docker啓動第一個容器Hello World,這是一個默認的docker倉庫中已有鏡像,我們直接使用該鏡像啓動一個容器。

[root@slave1 ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
Trying to pull repository docker.io/library/hello-world ... 
latest: Pulling from docker.io/library/hello-world
1b930d010525: Pull complete 
Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Status: Downloaded newer image for docker.io/hello-world:latest

Hello from Docker!

[root@slave1 ~]# docker run hello-world

執行該條命令,首先會在本地找有沒有hello-world鏡像,如果沒有的話就去docker倉庫去下載,默認的docker倉庫在國外,爲了加快下載速度可以修改爲國內的鏡像倉庫,修改文件/etc/docker/daemon.json。

在該文件中添加"registry-mirrors": ["https://registry.docker-cn.com"]。

[root@slave1 ~]# vi /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}

3.2 常用docker命令

  • 查看本地已有的鏡像
[root@slave1 ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              fce289e99eb9        6 months ago        1.84 kB
  • 查看所有容器
[root@slave1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
43e769a7273f        hello-world         "/hello"            11 minutes ago      Exited (0) 11 minutes ago                       hardcore_noether
  • 查看正在運行的容器
[root@slave1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  • 刪除容器
[root@slave1 ~]# docker rm 43e769a7273f
43e769a7273f
  • 刪除鏡像
[root@slave1 ~]# docker rmi fce289e99eb9
Untagged: docker.io/hello-world:latest
Untagged: docker.io/hello-world@sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3

   ##注意:在刪除鏡像前需要先刪掉使用該鏡像啓動的容器,否則報錯。

[root@slave1 ~]# docker rmi fce289e99eb9
Error response from daemon: conflict: unable to delete fce289e99eb9 (must be forced) - image is being used by stopped container 619c2a70aeb3

3.3 使用dockerfile創建自定義鏡像

Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋行。

一般的,Dockerfile 分爲四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時執行指令。例如:

#基於centos建鏡像
FROM centos:7
MAINTAINER Docker liuww <[email protected]>

#安裝jdk
COPY ./jdk1.8.0_171 /apps/jdk1.8.0_171

#安裝Tomcat
COPY ./apache-tomcat-8.5.42 /apps/apache-tomcat-8.5.42

#配置環境變量
ENV JAVA_HOME /apps/jdk1.8.0_171/
ENV JRE_HOME /apps/jdk1.8.0_171/jre/
ENV CLASS_PATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

EXPOSE 8080

#容器啓動後執行的命令
CMD ["/apps/apache-tomcat-8.5.42/bin/catalina.sh", "run"]

常用指令

指令的一般格式爲 INSTRUCTION arguments,指令包括 FROMMAINTAINERRUN 等。

FROM

格式爲 FROM <image>FROM <image>:<tag>

第一條指令必須爲 FROM 指令。並且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個 FROM 指令(每個鏡像一次)。

MAINTAINER

格式爲 MAINTAINER <name>,指定維護者信息。

RUN

格式爲 RUN <command> 或 RUN ["executable", "param1", "param2"]

前者將在 shell 終端中運行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]

每條 RUN 指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可以使用 \ 來換行。

CMD

支持三種格式

  • CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
  • CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
  • CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;

指定啓動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。

如果用戶啓動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。

EXPOSE

格式爲 EXPOSE <port> [<port>...]

告訴 Docker 服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時需要通過 -P,Docker 主機會自動分配一個端口轉發到指定的端口。

ENV

格式爲 ENV <key> <value>。 指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持。

例如

#配置環境變量
ENV JAVA_HOME /apps/jdk1.8.0_171/
ENV JRE_HOME /apps/jdk1.8.0_171/jre/
ENV CLASS_PATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

ADD

格式爲 ADD <src> <dest>

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

COPY

格式爲 COPY <src> <dest>

複製本地主機的 <src>(爲 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>

當使用本地目錄爲源目錄時,推薦使用 COPY

ENTRYPOINT

兩種格式:

  • ENTRYPOINT ["executable", "param1", "param2"]
  • ENTRYPOINT command param1 param2(shell中執行)。

配置容器啓動後執行的命令,並且不可被 docker run 提供的參數覆蓋。

每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

Dockerfile實戰:構建Tomcat鏡像

步驟:

1.新建docker_demo文件夾,並進入。

[root@slave1 apps]# mkdir docker_demo
[root@slave1 apps]# cd do_demo/
[root@slave1 do_demo]# pwd
/apps/do_demo

2.將Tomcat和jdk安裝包複製到該目錄中。

3.在該目錄下新建Dockerfile文件,文件名首字母D必須爲大寫。

[root@slave1 docker_dome]# ll
總用量 0
drwxr-xr-x. 9 root root 220 7月  23 21:08 apache-tomcat-8.5.42
-rw-r--r--. 1 root root   0 7月  23 21:09 Dockerfile
drwxr-xr-x. 8 root root 255 7月  23 21:09 jdk1.8.0_171

4.根據上述基本結構來編輯Dockerfile文件。

#基於centos建鏡像
FROM centos:7
MAINTAINER Docker liuww <[email protected]>

#安裝jdk
COPY ./jdk1.8.0_171 /apps/jdk1.8.0_171

#安裝Tomcat
COPY ./apache-tomcat-8.5.42 /apps/apache-tomcat-8.5.42

#配置環境變量
ENV JAVA_HOME /apps/jdk1.8.0_171/
ENV JRE_HOME /apps/jdk1.8.0_171/jre/
ENV CLASS_PATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

EXPOSE 8080

#容器啓動後執行的命令
CMD ["/apps/apache-tomcat-8.5.42/bin/catalina.sh", "run"]

5.使用docker build命令來構建鏡像。

[root@slave1 docker_dome]# docker build -t="tomcat:v1" .
Sending build context to Docker daemon 403.6 MB
Step 1/9 : FROM centos:7
 ---> 9f38484d220f
Step 2/9 : MAINTAINER Docker liuww <[email protected]>
 ---> Using cache
 ---> 29064dbda2ca
Step 3/9 : COPY ./jdk1.8.0_171 /apps/jdk1.8.0_171
 ---> Using cache
 ---> 6453cfc8d0fd
Step 4/9 : COPY ./apache-tomcat-8.5.42 /apps/apache-tomcat-8.5.42
 ---> Using cache
 ---> 88ca237ba792
Step 5/9 : ENV JAVA_HOME /apps/jdk1.8.0_171/
 ---> Using cache
 ---> 2a24716882fd
Step 6/9 : ENV JRE_HOME /apps/jdk1.8.0_171/jre/
 ---> Using cache
 ---> 3e32d8e91fac
Step 7/9 : ENV CLASS_PATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
 ---> Using cache
 ---> 12b2048ee776
Step 8/9 : EXPOSE 8080
 ---> Using cache
 ---> 100a8bfad5bc
Step 9/9 : CMD /apps/apache-tomcat-8.5.42/bin/catalina.sh run
 ---> Using cache
 ---> 6d57a44ff41a
Successfully built 6d57a44ff41a

docker build後面使用-t來指定鏡像的標籤信息。-t="tomcat:v1",表示鏡像名爲tomcat,版本爲v1。

查看構建的鏡像:

[root@slave1 docker_dome]# docker images 
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
172.18.231.30/si-tech/lww-tomcat   v1                  6d57a44ff41a        28 hours ago        603 MB
tomcat                             v1                  6d57a44ff41a        28 hours ago        603 MB
paas-web                           v1                  bb1e42c79a83        35 hours ago        977 MB
docker.io/centos                   7                   9f38484d220f        4 months ago        202 MB
docker.io/hello-world              latest              fce289e99eb9        6 months ago        1.84 kB

6.使用docker run命令來啓動容器。

[root@master tomcat]# docker run -p 8080:8080 --name myTomcat tomcat:v1 
23-Jul-2019 13:28:28.397 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.42
23-Jul-2019 13:28:28.403 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jun 4 2019 20:29:04 UTC
23-Jul-2019 13:28:28.408 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.5.42.0
23-Jul-2019 13:28:28.409 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
23-Jul-2019 13:28:28.409 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-957.21.3.el7.x86_64
23-Jul-2019 13:28:28.410 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
23-Jul-2019 13:28:28.410 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /apps/jdk1.8.0_171/jre
...
.....
.......
.42/webapps/manager] has finished in [86] ms
23-Jul-2019 13:28:30.226 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
23-Jul-2019 13:28:30.287 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
23-Jul-2019 13:28:30.312 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1506 ms

訪問:

docker入門到此結束,希望同學們多多指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章