docker基础篇——万字解读小鲸鱼
????????
目錄
前言? ? ? ??
為什么會出現docker?
背景
docker理念
容器和虛擬機比較
容器發展簡史
?容器虛擬化技術
Why Docker
docker的基本組成
??鏡像(image)
容器(container)
倉庫(repository)
總結
第一個docker鏡像——hello-world
run干了什么
docker為什么比虛擬機快
幫助啟動類命令
幫助命令
鏡像命令
docker images 查看所有本地主機上的鏡像
docker search 搜索鏡像
docker pull 下載鏡像
查看鏡像/容器/數據卷所占的空間
刪除鏡像
容器命令
新建容器并啟動
列出運行中的程序
退出容器
刪除容器
啟動和停止容器操作
后臺啟動容器
前臺啟動和后臺啟動區別
Detached (-d)
Foregroud(不寫-d)
其他常用命令(重點)
查看日志
查看容器中的進程信息
查看鏡像的元數據
進入當前正在運行的容器
方式一
方式二
attach與exec對比:
從容器拷貝文件到主機上
?導入和導出容器
Docker鏡像
鏡像是什么?
鏡像是分層的
???UnionFS(聯合文件系統)
Docker鏡像加載原理
為什么 Docker 鏡像要采用這種分層結構呢?
??重點理解
Docker容器數據卷
數據卷是什么?
數據卷能干什么?
?容器和宿主機之間數據共享
查看數據卷是否掛載成功?
??讀寫規則限制說明
卷的繼承和共享
?容器1完成和宿主機的映射?
容器2繼承容器1的卷規則
繼承舉例
思考
總結一波當前學的命令:
練習:下載nginx
端口暴露
查找ngnix的位置 whereis
作業: docker來裝一個tomcat
???????
前言?
?????????大家好,我是躺平哥,這是我的docker學習筆記基礎篇,用來記錄自己的學歷歷程,我感覺學習docker主要是多敲多練多看。我也是個小白,如果有寫的不好的地方也請大家多多指點!? ? ?
為什么會出現docker?
背景
在公司開發過程中,開發需要清楚的告訴運維部署團隊,用的全部配置文件+所有軟件環境。不過,即便如此,仍然常常發生部署失敗的狀況。
于是——
docker誕生了
Docker的出現使得Docker得以打破過去「程序即應用」的觀念。
透過鏡像(images)將作業系統核心除外,運作應用程式所需要的系統環境,由下而上打包,達到應用程式跨平臺間的無縫接軌運作。
大白話來講:就是我把環境連帶程序都給你一塊打包起來了!
docker理念
Docker是基于Go語言實現的云開源項目。
只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。
?????一句話:
???解決了運行環境和配置問題的軟件容器, 方便做持續集成并有助于整體發布的容器虛擬化技術。
在了解docker之前我們先聊聊虛擬機,虛擬機也是一個偉大的發明!
容器和虛擬機比較
容器發展簡史
傳統虛擬機的缺點
- 資源占用多,因為它要模擬出一整套操作系統
- 冗余步驟多,虛擬機創建出一個操作系統往往要有很多步驟
- 啟動慢,往往好幾分鐘。
?容器虛擬化技術
由于前面虛擬機存在某些缺點,Linux發展出了另一種虛擬化技術:
Linux容器(Linux Containers,縮寫為 LXC)
Linux 容器不是模擬一個完整的操作系統而是對進程進行隔離。
有了容器,就可以將軟件運行所需的所有資源打包到一個隔離的容器中。
容器與虛擬機不同,不需要捆綁一整套操作系統,只需要軟件工作所需的庫資源和設置。
*容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。
例如下圖:
那話又說回來了——
Why Docker
●更輕量: 基于容器的虛擬化,僅包含業務運行所需的runtime環境,CentOS/Ubuntu基礎鏡像僅170M;宿主機可部署100~ 1000個容器
●更高效:無操作系統虛擬化開銷
●計算:輕量,無極外開銷
#存儲:系統盤aufs/dmloverlayts; 數據盤volume
●網絡:宿主機網絡,NS隔離
.更敏捷、更靈活:
●分層的存儲和包管理,devops理念
●支持多種網絡配置
docker的基本組成
下面的圖可以很清楚的看出docker各個組成之間的轉換關系,以及對應命令:
??鏡像(image)
Docker 鏡像(Image)就是一個只讀的模板。鏡像可以用來創建 Docker 容器,一個鏡像可以建很多容器。
它也相當于是一個root文件系統。比如官方鏡像 centos:7 就包含了完整的一套 centos:7 最小系統的 root 文件系統。
相當于容器的“源代碼”,docker鏡像文件類似于Java的類模板,而docker容器實例類似于java中new出來的實例對象。
容器(container)
下面我們從以下兩個角度來介紹容器?:
1 從面向對象角度
????????Docker 利用容器(Container)獨立運行的一個或一組應用,應用程序或服務運行在容器里面,容器就類似于一個虛擬化的運行環境,容器是用鏡像創建的運行實例。就像是Java中的類和實例對象一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器為鏡像提供了一個標準的和隔離的運行環境,它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺
2 從鏡像容器角度
可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
倉庫(repository)
倉庫(Repository)是集中存放鏡像文件的場所。
最大的公開倉庫是 DockerHub(Docker Hub)
tar與dockerfile以后會說
總結
鏡像文件
- image 文件生成的容器實例,本身也是一個文件,稱為鏡像文件。
容器實例
- ?一個容器運行一種服務,當我們需要的時候,就可以通過docker客戶端創建一個對應的運行實例,也就是我們的容器
倉庫
- 就是放一堆鏡像的地方,我們可以把鏡像發布到倉庫中,需要的時候再從倉庫中拉下來就可以了。
第一個docker鏡像——hello-world
run干了什么
docker為什么比虛擬機快
(1)docker有著比虛擬機更少的抽象層:
(2)docker利用的是linux的內核,而不需要加載操作系統OS內核
幫助啟動類命令
- 啟動docker : systemctl start docker
- 停止docker : systemctl stop docker
- 重啟docker : systemctl restart docker
- 查看docker狀態: systemctl status docker
- 開機啟動 : systemctl enable docker
- 查看docker概要信息: docker info
- 查看docker 總體幫助文檔: docker --help
- 查看docker命令幫助文檔: docker 具體命令 --help
幫助命令
docker version //顯示docker 的版本信息
docker info //顯示docker 的系統信息 包括鏡像和容器數量
docker 命令 -- help
鏡像命令
docker images 查看所有本地主機上的鏡像
REPOSITORY 倉庫的鏡像
TAG 鏡像的標簽,也就是鏡像版本號,不寫默認最新版
IMAGE ID 鏡像的id
CREATE 鏡像的創建時間
SIZE 鏡像的大小
可選項
- -a --all 列出所有鏡像
- -q --quiet 只列出鏡像的id
docker search 搜索鏡像
可選項,通過搜索來過濾
[root@ecs-287241 ~]# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13384 [OK]
mariadb MariaDB Server is a high performing open sou… 5109 [OK]
[root@ecs-287241 ~]#
篩選starts大于3000的
docker pull 下載鏡像
下載鏡像 docker pull 鏡像名 [: tag版本]
- docker pull mysql
- 如果不寫tag,默認就是latest
- 分層下載,這是docker images 的核心,聯合文件信息
查看鏡像/容器/數據卷所占的空間
docker system df
刪除鏡像
docker rmi id
[root@ecs-287241 ~]# docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
[root@ecs-287241 ~]# docker images
?面試題:談談docker虛懸鏡像是什么?
·????????是什么
·????????倉庫名、標簽都是<none>的鏡像,俗稱虛懸鏡像dangling image
·????????長什么樣
·????????后續Dockerfile章節再介紹
容器命令
說明:我們有了鏡像才可以創建容器,linux,下載一個centos來學習
docker pull centos (centos小型的服務器)
新建容器并啟動
docker run [可選參數] image
#參數說明(最常用參數)
--name="Name" 容器名字 tomcat1 tomcat2 用來區分容器
-d 后臺方式運行
-i:以交互模式運行容器,通常與 -t 同時使用;
-t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
也即啟動交互式容器(前臺有偽終端,等待交互),就是等待你輸入命令!
-it 使用交互方式運行,進入容器查看內容
為什么要寫 -it?
不寫-it你會發現是這樣的
我們想要一個終端進行交互!輸入命令,所以必須寫!
后面往往還要寫上/bin/bash:?是指此腳本使用/bin/bash來解釋執行。/bin/bash:放在鏡像名后的shell命令,這里我們希望有個交互式 Shell,因此用的是 /bin/bash。
#使用鏡像centos:latest以交互模式啟動一個容器,在容器內執行/bin/bash命令。
docker run -it centos /bin/bash
或者
docker run -it centos bash 也可以!即使你沒寫/bin/bash 他也會默認在你后面帶一個shell腳本
-p 指定容器的端口 -p 8080:8080
-p IP:主機端口:容器端口
-p 主機端口:容器端口 (常用)
-p 容器端口
-P: 隨機端口映射,大寫P
-p: 指定端口映射,小寫p
一般我們用小p
如下圖:
左邊是宿主機暴露的端口,右邊是docker訪問redis暴露的端口
啟動 并進入容器
[root@ecs-287241 ~]# docker run -it centos /bin/bash
查看容器內的centos,基礎鏡像都是不完善的
[root@882655ac322c /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
從容器中退到主機
exit
列出運行中的程序
docker ps 命令
-a 當前正在運行,帶出歷史運行過的容器。
-l:顯示最近創建的容器。
-n=? 最近創建的容器。
-q 靜默模式,只顯示容器的編號。
退出容器
exit 直接容器停止并退出
ctrl +p +q 容器不停止退出
刪除容器
docker rm 容器id 刪除指定的容器,不能刪除正在運行的容器,如果要強制刪除 rm -f
可以先docker stop 停止容器 再docker rm
docker rm -f $(docker ps -aq) 刪除所有的容器
docker ps -a -qlxargs docker rm
啟動和停止容器操作
docker satrt 容器id 啟動容器
docker restart 容器id 重啟容器
docker stop 容器id 停止當前正在運行的容器
docker kill 容器id 強制停止當前容器
后臺啟動容器
- 命令 docker run -d 鏡像名!
- docker run -d centos
- 問題docker ps,發現了 centos停止了
- docker run 之后一定要docker ps查看容器是否運行!
- 常見的坑,docker 容器使用后臺運行,就必須要有一個前臺進程,docker發現沒有應用,就會自動停止 。
- ngnix ,容器啟動后,發現自己沒有提供服務,就會立即停止,就是沒有程序了
- Nginx?(engine x) 是一個高性能的HTTP和反向代理web服務器
前臺啟動和后臺啟動區別
- 前臺交互式啟動
- ?????docker run -it redis:6.0.8
- ?? ??后臺守護式啟動
- ??????docker run -d redis:6.0.8
Detached (-d)
如果在docker run后面追加-d=true或者-d,那么容器將會運行在后臺模式。此時所有I/O數據只能通過網絡資源或者共享卷組來進行交互。因為容器不再監聽你執行docker run的這個終端命令行窗口。但你可以通過執行docker attach來重新附著到該容器的會話中。需要注意的是,容器運行在后臺模式下,是不能使用--rm選項的。
Foregroud(不寫-d)
在前臺模式下(不指定-d參數即可),Docker會在容器中啟動進程,同時將當前的命令行窗口附著到容器的標準輸入、標準輸出和標準錯誤中。也就是說容器中所有的輸出都可以在當前窗口中看到。甚至它都可以虛擬出一個TTY窗口,來執行信號中斷。
我們要在在容器中干活!
以redis容器為例,在里面干活
兩個開發方式對比,想必你更能體會到容器的威力!
其他常用命令(重點)
查看日志
查看容器日志:docker logs 容器ID
docker logs -f -t --tail 容器,沒有日志
顯示日志
-tf 顯示日志
--tail number 顯示日志條數
查看容器中的進程信息
查看容器內運行的進程
命令: docker top 容器id
查看鏡像的元數據
命令:
?查看容器內部細節
docker inspect 容器 id
進入當前正在運行的容器
我們通常容器都是使用后臺放式運行的,需要進入容器,修改一些配置
方式一
#命令
docker exec -it 容器id bashShell
[root@ecs-287241 /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e5cf171dca0 centos "/bin/bash" 10 minutes ago Up 10 minutes serene_goodall [root@ecs-287241 /]# docker exec -it 6e5cf171dca0 /bin/bash [root@6e5cf171dca0 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@6e5cf171dca0 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 13:42 pts/0 00:00:00 /bin/bash root 15 0 0 13:54 pts/1 00:00:00 /bin/bash root 30 15 0 13:55 pts/1 00:00:00 ps -ef [root@6e5cf171dca0 /]#
方式二
docker attach 容器id
進入后會發現正在執行當前代碼!
attach與exec對比:
????attach 直接進入容器啟動命令的終端,不會啟動新的進程 用exit退出,會導致容器的停止。
????exec 是在容器中打開新的終端,并且可以啟動新的進程 用exit退出,不會導致容器的停止。
docker exec 進入容器后開啟一個新的終端,可以在里面操作(常用)
docker attach 進入容器正在執行的終端,不會啟動新的進程
從容器拷貝文件到主機上
為了防止別人或者自己誤刪!所以要做備份
docker cp 容器id :容器內路徑 目的主機路徑
[root@ecs-287241 home]# docker cp 6e5cf171dca0:/home/test.java /home [root@ecs-287241 home]# ls one1 test1 test.java wei wei.java www [root@ecs-287241 home]#
拷貝是一個手動過程,未來我們使用 -v卷的技術,可以實現,自動同步
即容器內的home目錄和主機內的home目錄連通,打通
?導入和導出容器
比拷貝docker cp 更加強大,這是拷貝整個容器!
·????????export 導出容器的內容留作為一個tar歸檔文件[對應import命令]
·????????docker export 容器ID > 文件名.tar
·????????import 從tar包中的內容創建一個新的文件系統再導入為鏡像[對應export]
·????????cat 文件名.tar | docker import - 鏡像用戶/鏡像名:鏡像版本號
刪除之后,利用import將abcd.tar變成一個鏡像,然后在通過run運行成為一個容器。
下面我們來深入探究一下docker運行原理!
Docker鏡像
鏡像是什么?
鏡像
是一種輕量級、可執行的獨立軟件包,它包含運行某個軟件所需的所有內容,我們把應用程序和配置依賴打包好形成一個可交付的運行環境(包括代碼、運行時需要的庫、環境變量和配置文件等),這個打包好的運行環境就是image鏡像文件。
只有通過這個鏡像文件才能生成Docker容器實例!
鏡像是分層的
以我們的pull為例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載
一層一層的下載! 因此鏡像是分層的。
???UnionFS(聯合文件系統)
UnionFS(聯合文件系統):
Union文件系統(UnionFS)是一種分層、輕量級并且高性能的文件系統,它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下。
Union文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含所有底層的文件和目錄。
Docker鏡像加載原理
Docker鏡像加載原理:
???docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導加載kernel, Linux剛啟動時會加載bootfs文件系統,在Docker鏡像的最底層是引導文件系統bootfs。
這一層與我們典型的Linux/Unix系統是一樣的,包含boot加載器和內核。
當boot加載完成之后整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs就是各種不同的操作系統發行版,比如Ubuntu,Centos等等。?
說白了我們只要bootfs和rootfs!
平時我們安裝進虛擬機的CentOS都是好幾個G,為什么docker這里才200M??
對于一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因為底層直接用宿主機的linux內核(Host的kernel),自己只需要提供 rootfs 就行了。
由此可見對于不同的linux發行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發行版可以公用bootfs。
就像這樣:
那么話說回來了——
為什么 Docker 鏡像要采用這種分層結構呢?
其實就是像樂高積木一樣,想用哪塊拿來組裝就行了!
鏡像分層最大的一個好處就是共享資源,方便復制遷移,就是為了復用。
比如說有多個鏡像都從相同的 base 鏡像構建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;
同時內存中也只需加載一份 base 鏡像,就可以為所有容器服務了。而且鏡像的每一層都可以被共享。?
一句話來講分層的意義:
加載簡單,資源復用
??重點理解
·????????Docker鏡像層都是只讀的,容器層是可寫的當容器啟動時,一個新的可寫層被加載到鏡像的頂部。 這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
所有對容器的改動——無論添加、刪除、還是修改文件都只會發生在容器層中。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
Docker容器數據卷
?????坑:容器卷記得加入
??????--privileged=true
???why??
?Docker掛載主機目錄訪問如果出現cannotopen directory .: Permission denied
解決辦法:在掛載目錄后多加一個--privileged=true參數即可
如果是CentOS7安全模塊會比之前系統版本加強,不安全的會先禁止,所以目錄掛載的情況被默認為不安全的行為,
在SELinux里面掛載目錄被禁止掉了額,如果要開啟,我們一般使用--privileged=true命令,擴大容器的權限解決掛載目錄沒有權限的問題,也即使用該參數,container內的root擁有真正的root權限,否則,container內的root只是外部的一個普通用戶權限。一個容器就相當于是一個小的linux內核。
數據卷是什么?
卷就是目錄或文件,存在于一個或多個容器中,由docker掛載到容器,但不屬于聯合文件系統,因此能夠繞過Union File System提供一些用于持續存儲或共享數據的特性:
卷的設計目的就是數據的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷。
·????????一句話:有點類似我們Redis里面的rdb和aof文件
·????????將docker容器內的數據保存進宿主機的磁盤中
·????????運行一個帶有容器卷存儲功能的容器實例
·?????????docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄????? 鏡像名
映射我們用“ :”,即冒號表示。
數據卷能干什么?
將運用與運行的環境打包鏡像,run后形成容器實例運行 ,但是我們對數據的要求希望是久化的。?
Docker容器產生的數據,如果不備份,那么當容器實例刪除后,容器內的數據自然也就沒了。
為了能保存數據在docker中我們使用卷。?
特點:
1:數據卷可在容器之間共享或重用數據。
2:卷中的更改可以直接實時生效,爽。
3:數據卷中的更改不會包含在鏡像的更新中。
4:數據卷的生命周期一直持續到沒有容器使用它為止。
?容器和宿主機之間數據共享
docker:
host宿主機
查看數據卷是否掛載成功?
docker inspect 容器ID
1? docker修改,主機同步獲得?
2 主機修改,docker同步獲得
3 docker容器stop,主機修改,docker容器重啟數據依舊同步。
因此即使是docker容器停止了也能夠同步數據
??讀寫規則限制說明
只限制容器,沒有限制主機
?rw = read + write
·?????????docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄:rw????? 鏡像名
·????????默認同上案例,默認就是rw
·????????只讀
·????????容器實例內部被限制,只能讀取不能寫
?/容器目錄:ro鏡像名??????????????就能完成功能,此時容器自己只能讀取不能寫??
ro = read only?
此時如果宿主機寫入內容,可以同步給容器內,容器可以讀取到。
docker run -it --privileged=true -v /宿主機絕對路徑目錄:/容器內目錄:ro????? 鏡像名
操作一下:
容器
宿主機
卷的繼承和共享
?容器1完成和宿主機的映射?
docker run -it? --privileged=true -v /mydocker/u:/tmp --name u1ubuntu
容器2繼承容器1的卷規則
·????????docker run -it? --privileged=true --volumes-from 父類? --name u2 ubuntu
繼承舉例
u3繼承u1
思考
u1stop掉了,u3和宿主機之間同步數據,u1start之后會同步數據嗎?
會的!
總結一波當前學的命令:
1.容器上拷貝到linux上?cp
2.講一個image啟動成一個container容器?run
3.運行了容器怎么停止?kill/stop
4.怎么啟動容器?start 怎么暫停?pause
5.logs:查看日志 inspect是干什么的?查看源數據
6.attach 進入已經啟動的重端,而exec是啟動一個新的終端
7.^p^q是以運行的方式退出
8.port 控制端口
9.ps可以看到當前所有的進程信息
10,top查看進程信息
port # 查看映射端口對應的容器內部源端口
pause # 暫停容器
ps # 獵戶容器列表
pull # 從docker鏡像源服務器拉取指定鏡像或者庫鏡像
push # 推送指定鏡像或者庫鏡像至docker源服務器
restart # 重啟運行的容器
rm # 移除一個或多個容器
rmi # 移除一個或多個鏡像 (無容器使用該鏡像才可刪除,否則需要刪除相關容器才可繼續或 -f 強制刪除)
run # 創建一個新的容器并運行一個命令
save # 保存一個鏡像為一個 tar 包【對應 load】
search # 在 docker hub 中搜索鏡像
start # 啟動容器
stop # 停止容器
tag # 給源中鏡像打標簽
top # 查看容器中運行的進程信息
unpause # 取消暫停容器
version # 查看 docker版本號
wait # 截取容器停止時的退出狀態值
練習:下載nginx
端口暴露
[root@ecs-287241 home]# docker run -d --name ngimx01 -p 3344:80 nginx 303bb4275798c811290a237bde71456194ed41fe82fdc9b03fb72df87edb6fbc [root@ecs-287241 home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 303bb4275798 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp ngimx01 [root@ecs-287241 home]# curl localhost:3344 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> [root@ecs-287241 home]#
查找ngnix的位置 whereis
root@303bb4275798:/# whereis ngnix
ngnix:地址
root@303bb4275798:/#
思考問題:我們每次改動nginx配置文件.都需要進入容器內部?
十分的麻煩,我要是可以在容器外部提供一個映射路徑 ,達到在容器修改文件名,容器內部就可以自動修改? -v 數據卷
作業: docker來裝一個tomcat
#官方的使用
docker run -it --rm tomcat:9.0
#我們之前的啟動都是后臺,停止了容器之后,容器還是可以查到
docker run -it --rm. 一般用來測試,用完就刪除
?感謝大家觀看!
總結
以上是生活随笔為你收集整理的docker基础篇——万字解读小鲸鱼的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度输入法皮肤工具提示 CSS,百度手机
- 下一篇: 快播(QvodPlayer)最新版 v5