docker安装与学习
安裝Docker
系統環境:macOS Catalina 10.15.7
通過brew安裝docker
brew install --cask --appdir=/Applications docker直接brew install docker裝上的好像不是,好像是當成了formula了。如下圖
brew cask install docker直接提示命令不對,好像brew cask的安裝不是這個命令格式(brew cask install xxx)了
安裝好后運行上圖中的命令:
docker run -d -p 80:80 docker/getting-started
學習Docker
下面對下面這個命令進行解析:
docker run ubuntu:15.10 /bin/echo "Hello world"-
docker:?Docker 的二進制執行文件。
-
run:?與前面的 docker 組合來運行一個容器。
-
ubuntu:15.10?指定要運行的鏡像,Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫?Docker Hub?下載公共鏡像。
-
/bin/echo "Hello world":?在啟動的容器里執行的命令
以上命令完整的意思可以解釋為:Docker 以 ubuntu15.10 鏡像創建一個新容器,然后在容器里執行 bin/echo "Hello world",然后輸出結果。
教學操作:
命令行運行:
docker run -d -p 80:80 docker/getting-started然后?
本地發現沒有這個image,就去download了。
可以使用 docker images查看所有鏡像
發現已經下載好了docker/getting-started
然后創建一個項目,我這里是用官網的app示例。(應該是一個node.js項目)
項目中本身是沒有Dockerfile的,然后我這邊是想創建一個,部署好這個項目的新image。于是要新建Dockerfile文件
然后使用docker build命令
docker build -t getting-started .?該命令使用Dockerfile來構建新的容器映像。
如果只是創建了Dockerfile但是沒有編輯的話,運行命令之后會報錯:
編輯好Dockerfile之后運行,結果如下:
該過程下載了許多“layers”。這是因為我們指示構建者要從node:12-alpine鏡像開始。但是,由于我們的計算機上沒有該image,因此需要下載該image。
下載映像后,我們將其復制到應用程序中并用于yarn安裝應用程序的依賴項。該CMD指令指定從該映像啟動容器時要運行的默認命令。 最后,該-t參數是為了標記了該image。可以簡單地將其視為最終image易于理解的名稱(不知道image是不是也有個image id?反正container是有id的)。由于我們將圖像命名為getting-started,因此在運行容器時可以引用該image。最后的' . '是docker build命令告訴Docker,Dockerfile的所在目錄。
Dockerfile不是配置文件,他就是一個執行順序,使用docker build的時候,會一行一行的執行Dockerfile的,這一點從上圖紫色字的過程也可以看出來。
使用命令:
bytedance$ docker run -dp 3000:3000 getting-started我們以-d“分離”模式(在后臺)基于getting-started運行新容器(注意不是docker/getting-started),并在主機的端口3000和容器的端口3000之間創建一個映射。如果沒有端口映射,我們將無法訪問application。
這行命令返回新建的container的id。
映射之后我們就可以輸入http://localhost:3000,來訪問當前application了。
docker ps可以得到當前容器。
此時的docker是長這個樣子的:
??
分別進入這兩個容器可以發現
docker run是創建一個新容器并啟動
docker run背后的工作:
Docker在后臺運行的標準操作包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載啟動;
利用鏡像創建并啟動一個容器;
分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀寫層;
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去;
從地址池配置一個ip地址給容器;
執行用戶指定的啟動命令;
執行完畢后容器被終止。
?
看下面這個例子:
其中,-i選項告訴Docker保持標準輸入輸出流對容器開放,-t選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上。
將啟動命令設置為“啟動一直運行的子進程”,也就是 /bin/bash
執行完這條命令后,創建并啟動容器之后,執行/bin/bash,會啟動一個子進程,此時父進程(也就是容器的主進程sh)會進入sleep狀態,由于sleep狀態不是終止狀態,所以容器會繼續運行。
為什么在容器中輸入exit或者執行ctrl D后,容器將會終止呢,這是因為exit會退出(結束)當前進程,也就是/bin/bash,由于子進程結束,sh主進程恢復到運行態,然而由于沒有命令需要繼續執行,所以sh主進程結,因此容器終止。
另外一點:
啟動容器之后,我們進入容器內部并在終端進行與容器交互。我們可以根據左側的命令提示符判斷自己是否在容器內部。例如上面的例子,當左側的命令提示符為root@localhost或者電腦主機名(見下圖的補充)時,表示我們在容器外部,而命令提示符為:root@3918f5e29f5b/時,表示我們在容器內部,且容器的ID是3918f5e29f5b。我們可以通過exit退出當前的容器。
?
使用docker start命令,使用容器名或者容器id啟動一個已經終止的容器。
使用docker stop命令,用來終止一個正在運行的容器。
查看容器信息
Docker中有這樣一條命令docker ps,可以查看容器的信息,包括容器ID,基礎鏡像,啟動命令,創建時間,當前狀態,端口號,容器名字。
如果執行docker ps,將會顯示所有運行中的容器。
如果docker ps –a命令,可以查看Docker環境中所有的容器,包括已經停止的容器。
其他內容:
后續我們又用brew來配了一下docker內部命令的自動補全:
注意因為我們的brew是裝在當前用戶下的而不是root下的,所以導致當時bash_completion.d也建在了usr/local下?(我也不確定是不是這個原因,但確實下面這個命令不能用)
不能用下面這個命令:(因為沒有這個目錄/etc/bash_completion.d/)
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose運行會報錯:
而應該用下面這種命令:
sudo curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose -o /usr/local/etc/bash_completion.d/docker-compose就可以成功了
其實也就是可執行文件的目錄讓他在/usr/local/etc下
/usr/local/etc/bash_completion.d/
進入bash_completion目錄看一下:
這應該是brew搞的吧?每一個從brew中下載后的,他都會加到這里面來?不然怎么沒有git命令。
但是docker,brew,ssh啥的都在里面。這其中的每一個應該都是一個.sh文件?(要知道每一個.sh文件,在終端直接輸入他的路徑,都是可以直接運行的,比如
當然,.sh文件中第一行要加上
#!/bin/bash)
參考鏈接:
https://blog.csdn.net/wenyichuan/article/details/106944276
總結
以上是生活随笔為你收集整理的docker安装与学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python学习】 简单语法与常见错误
- 下一篇: 华为nova 10真机上手图曝光:后摄神