Docker基礎
Docker基礎
一、基礎概念
官方
Docker 三要素
鏡像(image)
? 就是一個只讀的模版,鏡像可以用來創建Dcoker容器,一個鏡像可以創建很多個容器
容器(container)
- 獨立運行的一個或一組應用.容器是用鏡像創建的運行實例
- 他可以被啟動、開始、停止、刪除、每個容器都是相互隔離的、保證安全的平臺.
- 可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序.容器的定義和鏡像幾乎一摸一樣,也是一堆層的統一視角,唯一區別在于容器的最上面那一層是可讀可寫的.
倉庫(Repository)
- 是集中存放鏡像文件的場所
- 倉庫(Repository)和倉庫注冊服務器(Registry)是有區別的.倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含來多個鏡像文件.每個鏡像又不同的標簽(tag)
- 倉庫分為公開庫(public)和私有倉庫(private)兩種形式
- 最大的公開倉庫是 docker hub(https://hub.docker.com)
- 存放來數量龐大的鏡像僅供用戶下載.國內的公開倉庫包括阿里云,網易云等
Docker與虛擬機(VM)
| docker容器 | 虛擬機 | |
|---|---|---|
| 操作系統 | 與宿主機共享os | 宿主機os上運行虛擬機 |
| 存儲大小 | 鏡像小,便于存儲與傳輸 | 鏡像龐大(vmdk,vdi等) |
| 運行性能 | 幾乎無額外性能損耗 | 操作系統額外的CPU,內存消耗大 |
| 移植性 | 輕便,靈活,試應與Linux | 笨重,與虛擬化技術耦合度高 |
| 硬件親和性 | 面向軟件開發者 | 面向硬件運維者 |
| 部署速度 | 快速,秒級 | 較慢,10s以上 |
二、Docker 常用命令
顯示 Docker 版本信息
docker version
顯示 Docker 系統信息,包括鏡像和容器數
docker info
幫助
docker --help
鏡像命令
docker images 鏡像
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8 02d718ca90fd 9 months ago 530MB
tomcat latest 891fcd9c5b3a 9 months ago 647MB
tomcat latest 891fcd9c5b3a 9 months ago 647MB
nginx latest f35646e83998 9 months ago 133MB
mysql 5.7 42cdba9f1b08 9 months ago 448MB
centos latest 0d120b6ccaa8 11 months ago 215MB
java 8 d23bdf5b1b1b 4 years ago 643MB
maluuba/tomcat7-java8 latest 98a0fcf6d133 4 years ago 662MB
- REPOSITORY 表示鏡像的倉庫源
- TAG 鏡像標簽
- IMAGE ID 鏡像ID
- CRAEATE ID 鏡像創建時間
- SIZE: 鏡像大小
- 同一個倉庫源可以又多個TAG,代表這個倉庫源的不同個版本,我們使用REPOSITORY:TAG來定義不同的鏡像,如果你不指定一個鏡像的版本標簽,例如你只使用 ubuntu,docker將默認使用 ubuntu:latest 鏡像
- options說明:
- -a:列出本地所有的鏡像(含中間映像層)
- -q:只顯示鏡像ID
- --digests:顯示鏡像的摘要信息
- --no-trunc:顯示完整的鏡像信息
docker search 查詢
- docker [options] 鏡像名字
- options :
- --no-trunc 顯示完整的鏡像描述
- -s: 列出收藏數不小于指定值的鏡像
- --automated: 只列出automated build的類型的鏡像:
[root@centos-linux ~]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 2851 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 83 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 55 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 36 [OK]
kubeguide/tomcat-app Tomcat image for Chapter 1 29
consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 17 [OK]
cloudesire/tomcat Tomcat server, 6/7/8 15 [OK]
aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 13 [OK]
arm32v7/tomcat Apache Tomcat is an open source implementati… 10
rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 6 [OK]
maluuba/tomcat7-java8 Tomcat7 with java8. 6
unidata/tomcat-docker Security-hardened Tomcat Docker container. 4 [OK]
amd64/tomcat Apache Tomcat is an open source implementati… 2
arm64v8/tomcat Apache Tomcat is an open source implementati… 2
jelastic/tomcat An image of the Tomcat Java application serv… 2
99taxis/tomcat7 Tomcat7 1 [OK]
oobsri/tomcat8 Testing CI Jobs with different names. 1
camptocamp/tomcat-logback Docker image for tomcat with logback integra… 1 [OK]
chenyufeng/tomcat-centos tomcat基于centos6的鏡像 1 [OK]
ppc64le/tomcat Apache Tomcat is an open source implementati… 1
cfje/tomcat-resource Tomcat Concourse Resource 1
softwareplant/tomcat Tomcat images for jira-cloud testing 0 [OK]
picoded/tomcat7 tomcat7 with jre8 and MANAGER_USER / MANAGER… 0 [OK]
secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0 [OK]
s390x/tomcat Apache Tomcat is an open source implementati… 0
docker pull 拉取鏡像
docker pull tomcat
[root@localhost docker]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
627b765e08d1: Pull complete
c040670e5e55: Pull complete
073a180f4992: Pull complete
bf76209566d0: Pull complete
f10db7ba7580: Pull complete
5b2f970878fa: Pull complete
ed434bfebf18: Pull complete
f6c437110aa9: Pull complete
a772951f83db: Pull complete
752225c3768e: Pull complete
Digest: sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost docker]#
docker rmi 刪除鏡像
- 刪除一個 docker rmi -f 鏡像ID
- 刪除多個 docker rmi -f 鏡像1:TAG 鏡像名2:TAG
- 刪除全部 docker rmi -f $(docker images -qa)
- docker rmi -f hello-world
[root@localhost docker]# docker rmi -f tomcat
Untagged: tomcat:latest
Untagged: tomcat@sha256:6e40250d8fac4eca05c2067cb81f79427e4ddbaf4e78d5ecd21c35e8c5f2bfcf
Deleted: sha256:46cfbf1293b176161813fa05bb8f7e82df1ec7def5c226c48bc48a60ed305ac7
Deleted: sha256:6748c687a38bae8ee5179c1b7c3fc05347dab445a5322f30e62c80348997d99c
Deleted: sha256:4e78f4eefb564a3492c5840bfcf17a0bed07fda1e59127c66058dd7553ed7f9b
Deleted: sha256:99b6cc44dbf7b0b4809ede178ae7fb27fef1401c8b2415be0dc18b6153ff233f
Deleted: sha256:046e7218b905a3de840f00a2aa7081fc53ace4ffba9661d471d59bfdcfa5b4c1
Deleted: sha256:3095bb61fd62bf2c2fd6849289c6043e8866bf104ca0959be3fc3da5bab0be1e
Deleted: sha256:f33d6ed931ff64c63168af00c7544d148d01fda66831246572ff2bfcacbcf2d6
Deleted: sha256:017b9704876de2443b332b1dfec580d365184b514eb0af43f1d59637e77af9bb
Deleted: sha256:98fc59c935e697d6375f05f4fa29d0e1ef7e8ece61aed109056926983ada0ef4
Deleted: sha256:c21ff68b02e7caf277f5d356e8b323a95e8d3969dd1ab0d9f60e7c8b4a01c874
Deleted: sha256:afa3e488a0ee76983343f8aa759e4b7b898db65b715eb90abc81c181388374e3
[root@localhost docker]#
容器命令
docker run -it 新建并啟動容器
- docker run -it
- options
- --name 容器新名字 為容器指定一個名稱
- -d 后臺運行容器 并返回容器ID 也即啟動守護式容器
- -i 以交互式模式運行容器,通常與-t同時使用:
- -t: 為容器重新分配一個偽輸入終端,通常與 -i同時使用:
- -P:隨機端口映射:
- -p:指定端口映射,有以下四種格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- contaninerPor
后臺啟動 tomcat8 容器 內部端口8080 外部端口9990
root@localhost docker]# docker run -id -p 9990:8080 tomcat:8
9d340293e2c2a51098ec5ddc02c6438f582e01388d373b509a82bc4d402accb0
非后臺啟動 tomcat8 容器 內部端口8080 外部端口9990
[root@localhost docker]# docker run -it -p 9990:8080 tomcat:8
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-8
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
02-Aug-2021 07:08:48.309 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/8.5.69
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Jun 30 2021 18:00:00 UTC
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.69.0
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 3.10.0-1127.19.1.el7.x86_64
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/local/openjdk-8/jre
02-Aug-2021 07:08:48.311 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_302-b08
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/tomcat
02-Aug-2021 07:08:48.312 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/tomcat
注意:直接退出 Ctrl+ c 進程結束。 Ctrl+ P+ Q 進程后臺運行,退出命令行。
docker ps 進程
- docker ps 進程
- options
- -a 列出當前所有正在運行的容器+歷史上運行過的
- -i 顯示最近創建的容器
- -n 顯示最近N個創建的容器 docker ps -n 2
- -q 靜默模式,只顯示容器編號
- --no-trunc 不截斷輸出.
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d340293e2c2 tomcat:8 "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:9990->8080/tcp sad_kepler
docker exec 在運行的容器中執行命令
- docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
- OPTIONS說明:
- -d :分離模式: 在后臺運行
- -i :即使沒有附加也保持STDIN 打開
- -t :分配一個偽終端
[root@localhost docker]# docker exec -it determined_feistel /bin/sh
# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
# pwd
/usr/local/tomcat
docker attach :連接到正在運行中的容器。
- docker attach [OPTIONS] CONTAINER
[root@localhost docker]# docker attach quirky_turing
docker inspect 查看容器內部細節
[root@localhost docker]# docker inspect 9d340293e2c2
[
{
"Id": "9d340293e2c2a51098ec5ddc02c6438f582e01388d373b509a82bc4d402accb0",
"Created": "2021-08-02T06:55:06.74894522Z",
"Path": "catalina.sh",
"Args": [
"run"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 112128,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-08-02T06:55:07.22290482Z",
"FinishedAt": "0001-01-01T00:00:00Z"
…………省略
docker restart 重啟
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dff9971e52c7 tomcat:8 "catalina.sh run" 9 minutes ago Up 9 minutes 0.0.0.0:9990->8080/tcp loving_haslett
[root@localhost docker]# docker restart dff9971e52c7
dff9971e52c7
[root@localhost docker]#
docker stop 停止
[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7
docker kill 強制停止
[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7
docker start 啟動
[root@localhost docker]# docker stop dff9971e52c7
dff9971e52c7
docker rm 刪除
[root@localhost docker]# docker rm dff9971e52c7
dff9971e52c7
docker rm -f 強制刪除
[root@localhost docker]# docker rm -f dff9971e52c7
dff9971e52c7
docker rm -f $(docker ps -a -q) 刪除多個容器
[root@localhost docker]# docker rm -f $(docker ps -a -q)
54f5b6f8e1fc
1bbf08d5704c
9d340293e2c2
d9454af4daee
f77680c0be59
fa682e10ef7d
ecd5673894d5
f7d1d0f35211
docker ps -a -q | xargs docker rm 刪除多個容器
[root@localhost docker]# docker ps -a -q | xargs docker rm
d6435b9cc59c

三、UnionFS(聯合文件系統):
Union 文件系統(UnionFS)是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬機文件系統下
官網文檔
四、Docker鏡像加載原理
? docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是弓I導加載kernel, Linux剛啟動時會加載bootfs文件系統,在 Docker鏡像的最底層是bootfsc這一層與我們典型的Linux/Unix系統是一樣的,包含boot加我器和內核。當boot加我完成之后整個內核 就都在內存中了,此時內存的使用權己由bootfs轉交給內核,此時系統也會卸我bootfs。
rootfs (root file system),在bootfs之包含的就是典型Linux系統中的/dev, /proc, /bin, /etc等標準目錄和文件° rootfs就是各種不同的操作系統發行版,比如Ubuntu, Centos等等。
五、Docker 分層鏡像
? 最大的一個好處就是-共享資源
比如:有多個鏡像都從相同的base鏡像構建而來,name宿主機只需要在磁盤上保存一份base鏡像,同時內存中也只需加載一份base鏡像,就可以為所有容器服務了,而且鏡像的每一層都可以被共享。
六、Docker 特點
? Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被陳作為"容器層",容器層之下的都叫“鏡像層”。
七、Docker 容器數據卷
概念:
? 將運用與運行的環境大包形成的容器運行,運行可以伴隨著容器,但那會使我們對數據的要求希望是持久化的容器之間希望有可能共享數據
Docker容器產生的數據,如果不通過docker commit 生成新的鏡像,數據不會做為鏡像的一部分保存下來,那么當容器刪除后,數據自然也就沒有了
為來能保存數據在docker 中我們使用卷
能干嘛:
容器的持久化
容器間繼承+共享數據
特點:
- 數據卷可以在容器之間共享數據
- 卷中更改可以直接生效
- 數據卷中的更改不會包含在鏡像的更新中
- 數據卷的生命周期一直持續到沒有容器使用為止
命令
docker run -it 鏡像ID
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
docker run -it -v /myDataVolume:/dataVolumeContainer
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
docker run -it -v /myDataVolume:/dataVolumeContainer:ro 只讀
容器內添加
- 直接命令添加
- Dockerfile添加
Dockerfile體系機構
- FROM:
- 基礎鏡像,當前新鏡像是基于哪個鏡像的
- MAINTAINER
- 鏡像維護者的姓名和郵箱
- RUN
- 容器構建時需要運行的命令
- WORKDIR
- 指定在創建容器后,終端默認登錄進來工作目錄,一個落腳點
- ENV
- 用來構建鏡像過程中設置環境變量
- ADD
- 將宿主機目錄下的文件拷貝進鏡像且 ADD 命令會自動處理URL和解壓tar壓縮包
- COPY
- 類型ADD,拷貝文件和目錄到鏡像中,將從構建上下文目錄中<源路徑>的文件/目錄復制到新的一層的鏡像內的<目標路徑>位置
- VOLUME
- 容器數據卷,用戶數據保存和持久化工作
- CMD
- 指定一個容器啟動時要運行的命令
- Dockerfile 中可以有多個 CMD 命令,但只有最后一個生效,CMD 會被 docker run 之后的參數替換
- ENTRYPOINT
- 指定一個容器啟動時需要運行的命令
- ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程序及參數
- ONBUILD
- 當構建一個被繼承的 Dockerfile 時運行命令,父鏡像在被子鏡像繼承后父鏡像的 onbuild 會被觸發
Dockerfile 文件
# test
FROM centos
VOLUME ["/www/docker/data","/www/docker/data"]
CMD echo "finished,-----success1"
CMD /bin/bash
打包鏡像
- docker build -t ming/centos .
- Docker 掛載主機目錄Docker訪問出現cannot open directory .:Permission denied
- 解決辦法:在掛載目錄后多加一個--privileged=true參數即可
- DockerFile添加的數據卷需要執行 docker inspect ID 容器細節中查看 宿主機數據卷目錄
- docker build -f /www/docker/DockerFile -t ming/centos .(在當前目錄下 無需指定 Dockerfile 路徑)
[root@localhost docker]# docker build -t ming/centos .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["/www/docker/data","/www/docker/data"]
---> Running in 13d0ab91d6c7
Removing intermediate container 13d0ab91d6c7
---> 129928688111
Step 3/4 : CMD echo "finished,-----success1"
---> Running in 33f38d495fc5
Removing intermediate container 33f38d495fc5
---> 3f3a98d9b049
Step 4/4 : CMD /bin/bash
---> Running in d24c5daed8a7
Removing intermediate container d24c5daed8a7
---> 0a6187601a12
Successfully built 0a6187601a12
Successfully tagged ming/centos:latest
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ming/centos latest 0a6187601a12 27 seconds ago 209MB
centos latest 300e315adb2f 7 months ago 209MB
啟動容器 www 目錄 Dockerfile 中掛載的路徑
[root@localhost docker]# docker run -it ming/centos
[root@5e7234752a54 /]# docker ps
bash: docker: command not found
[root@5e7234752a54 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var www
[root@5e7234752a54 /]# cd www/
[root@5e7234752a54 www]# pwd
八、Docker常用安裝
總體步驟
- 搜索鏡像
- 拉取鏡像
- 查看鏡像
- 啟動鏡像
- 停止鏡像
- 移除鏡像
九、常見問題
一、鏡像文件無法刪除
進入如下目錄,找到對應的鏡像 ID 進行刪除即可。
cd /var/lib/docker/image/overlay2/imagedb/content/sha256
二、Docker容器端口映射后突然無法連接
1、關閉防火墻服務
systemctl stop firewalld.service
2、防火墻端口放行
firewall-cmd --add-port=5000/tcp --permanent
firewall-cmd --reload
3、沒有啟用IP_FORWARD, 0就是未啟用
[root@localhost docker]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
解決辦法一條命令
echo 'net.ipv4.ip_forward = 1' >> /usr/lib/sysctl.d/50-default.conf
重新加載配置
sysctl -p /usr/lib/sysctl.d/50-default.conf
三、Docker 掛載主機目錄Docker訪問出現cannot open directory .:Permission denied
在掛載目錄后多加一個--privileged=true參數即可

浙公網安備 33010602011771號