步入社會的第一個項目部署的時候就用到了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
,指令包括 FROM
、MAINTAINER
、RUN
等。
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入門到此結束,希望同學們多多指正。