2021-05-12 14:32:11
Docker 快速入門
1 Docker 是什麼?
Docker 是一個開源的容器引擎,而一個容器其實是一個虛擬化的獨立的環境,因此開發者可以將應用打包到這樣的一個 docker 容器中,然後發佈到任何可以執行 docker 容器的機器中,實現一次打包多處部署,解決了因為環境問題而導致的部署難題。
1.1 容器是什麼?
與 容器 對應的一個概念就是 映象,映象可以看做我們平時裝系統的映象,裡面就是一個執行環境。當然我比較喜歡將映象比作一個我們物件導向程式設計中的 類,而一個容器就是一個類的 範例,因此可以根據一個映象,建立出很多個容器。每一個容器都是具體的,我們可以在容器上面做出更改,然後再把這個容器打包成一個新的映象,從而以後可以根據改動後的映象建立出新的容器。而容器本身可以簡單理解為是一個虛擬獨立的執行環境,我們要做的是中這個環境中打包我們的應用,以便於再次部署。
2 安裝 Docker
Gentoo
# emerge --ask docker
#yum install docker-ce
#apt-get install docker-ce
Arch
# pacman -S docker
2.1 啟動 docker 守護行程
#systemctl start docker
3 docker 命令介紹
# docker --help
管理命令:
container 管理容器
image 管理映象
network 管理網路
命令:
attach 介入到一個正在執行的容器
build 根據Dockerfile構建一個映象
commit 根據容器的更改建立一個新的映象
cp在本地檔案系統與容器中複製檔案/資料夾
create 建立一個新容器
exec在容器中執行一條命令
images 列出映象
kill殺死一個或多個正在執行的容器
logs 取得容器的紀錄檔
pause 暫停一個或多個容器的所有進程
ps列出所有容器
pull 拉取一個映象或倉庫到 registry
push 推播一個映象或倉庫到 registry
rename重新命名一個容器
restart 重新啟動一個或多個容器
rm刪除一個或多個容器
rmi 刪除一個或多個映象
run 在一個新的容器中執行一條命令
search 在DockerHub中搜尋映象
start 啟動一個或多個已經停止執行的容器
stats 顯示一個容器的實時資源佔用
stop 停止一個或多個正在執行的容器
tag 為映象建立一個新的標籤
top顯示一個容器內的所有進程
unpause 恢復一個或多個容器內所有被暫停的進程
在子命令中還有更多豐富的選項,可以使用 docker COMMAND --help
檢視。例如:
# docker run --help
4 docker 使用實戰
接下來,我將利用 docker 部署一個 Nginx 伺服器,作為講解的例子。 要建立一個容器,那麼我們必須先要有一個用於建立容器的映象。 在 docker hub 中查詢 nginx 相關映象。
# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx.6959[OK]
jwilder/nginx-proxy AutomatedNginx reverse proxy for docker c...1134[OK]
richarvey/nginx-php-fpm Container running Nginx+ PHP-FPM capable ...452[OK]
...
...
拉取官方映象,其中上面的非官方映象是使用者們根據自己的需要製作的映象,方便大家的使用。
# docker pull nginx
Usingdefault tag: latest
latest:Pullingfrom library/nginx
afeb2bfd31c0:Pull complete
7ff5d10493db:Downloading[===============>]6.651 MB/21.87 MB
d2562f1ae1d0:Download complete
在這裡順便說一下,docker 映象是分層儲存的,所以上面的 nginx 映象有 3 層,另外每根據新的容器製作一個新的映象以後會給這個映象加上一層。
接下來直接利用這個映象啟動一個新的容器:
# docker run --name my-nginx -d -p 8080:80 nginx
此時中瀏覽器中輸入:http://localhost:8080/ 即可存取 nginx。 引數解釋:
--name
為容器取一個名字-p
引數語法為-p host port:container port
;-p 8080:80
將主機上的8080埠系結到容器上的80埠,因此在主機中存取8080埠時其實就是存取 nginx 容器的80埠-d
後台執行容器
然後我們來看一個更複雜的例子:
# docker run --name my-nginx
-v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro
-v /some/html:/usr/share/nginx/html:ro
-p 8080:80
-d nginx
這個例子多了一個引數 -v
,這個引數的作用是把原生的檔案或者資料夾掛載到容器中,其中最後面的 ro
或者 rw
控制這個掛載是否可寫。
-v
引數語法為-v host dir:container dir[:ro|rw]
上面的命令將本地檔案中的 nginx.conf
組態檔掛載到容器,並且將要展示的靜態頁面也掛載到容器。 注意:在容器執行一條命令以後,當這個命令結束執行,容器也會結束執行。
接下來讓我們看看 docker 別的命令。
檢視所有執行中的容器:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fe91b5a4cd4 nginx "nginx -g 'daemon ..."39 minutes ago Up39 minutes 0.0.0.0:8080->80/tcp my-nginx
# docker ps-a ### 列出包括未執行的容器
檢視容器執行紀錄檔:
# docker logs my-nginx
172.17.0.1--[05/Oct/2017:07:31:11+0000]"GET / HTTP/1.1"200612"-""Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0""-"
2017/10/0507:31:11[error]7#7:*1 open()"/usr/share/nginx/html/favicon.ico" failed (2:No such fileor directory), client:172.17.0.1, server: localhost, request:"GET /favicon.ico HTTP/1.1", host:"localhost:8080"
重新啟動容器:
# docker restart my-nginx
my-nginx
停止執行一個容器:
# docker stop my-nginx
my-nginx
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
啟動一個已經存在的容器:
# docker start my-nginx
my-nginx
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fe91b5a4cd4 nginx "nginx -g 'daemon ..."50 minutes ago Up3 seconds 0.0.0.0:8080->80/tcp my-nginx
直接殺死一個執行中的容器:
# docker killmy-nginx
重新命名容器:
# docker renamemy-nginx new-nginx
刪除容器:
# docker rmnew-nginx
檢視本機所有映象:
# docker imags
使用已經存在的容器建立一個映象:
# docker commit -m "nothing changed"my-nginx my-nginx-image
sha256:f02483cdb842a0dc1730fe2c653603fa3271e71c31dbb442caccd7ad64860350
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx-image latest f02483cdb842 6 seconds ago 108 MB
nginx latest da5939581ac8 3 weeks ago 108 MB
使用我們自己建立的映象建立容器:
# docker run --name test-d -p 8081:80my-nginx-image
12ba86eabdef0121d875bdb547f1101d4eb54ff7cb36e20214fb1388659af83d
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12ba86eabdefmy-nginx-image "nginx -g 'daemon ..."7 seconds ago Up5 seconds 0.0.0.0:8081->80/tcp test
299f4ede9e79 nginx "nginx -g 'daemon ..."11 minutes ago Up11 minutes 0.0.0.0:8080->80/tcp my-nginx
如果我們使用的容器的啟動命令是一個 shell ,那麼我們可以使用 attach
命令來介入這個容器,就跟我們使用 ssh
連線一台伺服器差不多。
# docker attach some-container
在建立一個容器時直接啟動一個可互動式的 shell, 並且退出後自動刪除容器:
# docker run -it --rm centos
總結
本文介紹了 docker 的簡單用法,同時也給出了一個實際的例子用來展示 docker 命令的各種操作。作為一個快速入門的文章,本文寫的相對有點簡單,很多概念上的東西還需要求檢視別的資料理解,但是看完本文應該就具備使用 docker 的基本能力了。此外,後續的文章應該會寫一點 Dockerfile
與 docker-compose
相關的內容。
更多Docker相關教學見以下內容:
Docker安裝應用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 16.04 伺服器上設定使用 Docker http://www.linuxidc.com/Linux/2017-06/145176.htm
Ubuntu 15.04下安裝Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
Docker 安裝範例 http://www.linuxidc.com/Linux/2017-04/142666.htm
Docker 建立基礎映象 http://www.linuxidc.com/Linux/2017-05/144112.htm
在 Ubuntu 15.04 上如何安裝Docker及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm
Ubuntu 16.04上Docker使用手記 http://www.linuxidc.com/Linux/2016-12/138490.htm
使用Docker分分鐘啟動常用應用 http://www.linuxidc.com/Linux/2017-04/142649.htm
Ubuntu 16.04下Docker修改組態檔不生效解決辦法 http://www.linuxidc.com/Linux/2017-05/143862.htm
相關文章