Docker 是一個開源的容器引擎,而一個容器其實是一個虛擬化的獨立的環境,因此開發者可以將應用程式打包到這樣的一個docker 容器中,然後發佈到任何可以運行docker 容器的機器中,實現一次打包多處部署,解決了因為環境問題而導致的部署難題。
與 容器 對應的一個概念就是 鏡像,鏡像可以看做我們平時裝系統的鏡像,裡面就是一個運作環境。當然我比較喜歡將鏡像比喻為一個我們物件導向程式設計中的 類,而一個容器就是一個類別的 實例,因此可以根據一個鏡像,創建出很多個容器。每一個容器都是具體的,我們可以在容器上面做出更改,然後再把這個容器打包成一個新的鏡像,以便以後可以根據改動後的鏡像創建出新的容器。而容器本身可以簡單理解為是一個虛擬獨立的運作環境,我們要做的是在中這個環境中打包我們的應用,以便於再次部署。
Gentoo
# emerge --ask docker
CentOS
# yum install docker-ce
Ubuntu
# apt-get install docker-ce
Arch
# pacman -S docker
# systemctl start 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 在 Docker Hub 中搜索镜像 start 启动一个或多个已经停止运行的容器 stats 显示一个容器的实时资源占用 stop 停止一个或多个正在运行的容器 tag 为镜像创建一个新的标签 top 显示一个容器内的所有进程 unpause 恢复一个或多个容器内所有被暂停的进程
在子命令中還有更多豐富的選項,可以使用 docker COMMAND --help 檢視。例如:
# docker run --help
docker 使用實戰接下來,我將利用 docker 部署一個 Nginx 伺服器,作為講解的範例。要建立一個容器,那麼我們必須先要有一個用於建立容器的鏡像。在 docker hub 中尋找 nginx 相關映像。
# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 6959 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1134 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 452 [OK] ... ...
拉取官方鏡像,其中上面的非官方鏡像是使用者根據自己的需求製作的鏡像,方便大家的使用。
# docker pull nginx Using default tag: latest latest: Pulling from 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。參數解釋:
然後我們來看一個更複雜的例子:
# 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 控制這個掛載是否可寫。
上面的命令將本機檔案中的 nginx.conf 設定檔掛載到容器,並且將要展示的靜態頁面也掛載到容器。注意:在容器執行一條指令以後,當這個指令結束執行,容器也會結束執行。
接下來讓我們來看看 docker 別的指令。
查看所有運行中的容器:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fe91b5a4cd4 nginx "nginx -g 'daemon ..." 39 minutes ago Up 39 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" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "-" 2017/10/05 07:31:11 [error] 7#7: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or 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 Up 3 seconds 0.0.0.0:8080->80/tcp my-nginx
直接殺死一個運作中的容器:
# docker kill my-nginx
重新命名容器:
# docker rename my-nginx new-nginx
刪除容器:
# docker rm new-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:80 my-nginx-image 12ba86eabdef0121d875bdb547f1101d4eb54ff7cb36e20214fb1388659af83d # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 12ba86eabdef my-nginx-image "nginx -g 'daemon ..." 7 seconds ago Up 5 seconds 0.0.0.0:8081->80/tcp test 299f4ede9e79 nginx "nginx -g 'daemon ..." 11 minutes ago Up 11 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快速入門五分鐘的詳細內容。更多資訊請關注PHP中文網其他相關文章!