只要一小時,零基礎入門Docker
Docker是什么?
Docker是一個虛擬環境容器,可以將你的開發環境、代碼、配置文件等一并打包到這個容器中,并發布和應用到任意平臺中。比如,你在本地用Python開發網站后臺,開發測試完成后,就可以將Python3及其依賴包、Flask及其各種插件、Mysql、Nginx等打包到一個容器中,然后部署到任意你想部署到的環境。
Docker的三個概念
- 鏡像(Image):類似于虛擬機中的鏡像,是一個包含有文件系統的面向Docker引擎的只讀模板。任何應用程序運行都需要環境,而鏡像就是用來提供這種運行環境的。例如一個Ubuntu鏡像就是一個包含Ubuntu操作系統環境的模板,同理在該鏡像上裝上Apache軟件,就可以稱為Apache鏡像。
- 容器(Container):類似于一個輕量級的沙盒,可以將其看作一個極簡的Linux系統環境(包括root權限、進程空間、用戶空間和網絡空間等),以及運行在其中的應用程序。Docker引擎利用容器來運行、隔離各個應用。容器是鏡像創建的應用實例,可以創建、啟動、停止、刪除容器,各個容器之間是是相互隔離的,互不影響。注意:鏡像本身是只讀的,容器從鏡像啟動時,Docker在鏡像的上層創建一個可寫層,鏡像本身不變。
- 倉庫(Repository):類似于代碼倉庫,這里是鏡像倉庫,是Docker用來集中存放鏡像文件的地方。注意與注冊服務器(Registry)的區別:注冊服務器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放鏡像的地方,一般每個倉庫存放一類鏡像,每個鏡像利用tag進行區分,比如Ubuntu倉庫存放有多個版本(12.04、14.04等)的Ubuntu鏡像。
Docker的安裝和卸載
Docker可以安裝在Windows、Linux、Mac等各個平臺上。安裝完成之后,可以查看Docker的版本信息:
# docker version Client: Version: 1.12.3 API version: 1.24 Go version: go1.6.3 Git commit: 6b644ec Built: OS/Arch: linux/amd64 Server: Version: 1.12.3 API version: 1.24 Go version: go1.6.3 Git commit: 6b644ec Built: OS/Arch: linux/amd64
查看Docker的幫助信息:# docker --help。各種命令的用法也不再贅述,后邊用到哪些命令時會作出一定的解釋。
Docker中關于鏡像的基本操作
安裝完Docker引擎之后,就可以對鏡像進行基本的操作了。
我們從官方注冊服務器的倉庫中pull下CentOS的鏡像,前邊說過,每個倉庫會有多個鏡像,用tag標示,如果不加tag,默認使用latest鏡像:
[root@xxx ~]# docker search centos # 查看centos鏡像是否存在 [root@xxx ~]# docker pull centos # 利用pull命令獲取鏡像 Using default tag: latest latest: Pulling from library/centos 08d48e6f1cff: Pull complete Digest: sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c Status: Downloaded newer image for centos:latest [root@xxx ~]# docker images # 查看當前系統中的images信息 REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 0584b3d2cf6d 9 days ago 196.5 MB
以上是下載一個已有鏡像,此外有兩種方法可以幫助你新建自有鏡像。
(1)利用鏡像啟動一個容器后進行修改 ==> 利用commit提交更新后的副本
[root@xxx ~]# docker run -it centos:latest /bin/bash # 啟動一個容器 [root@72f1a8a0e394 /]# # 這里命令行形式變了,表示已經進入了一個新環境 [root@72f1a8a0e394 /]# git --version # 此時的容器中沒有git bash: git: command not found [root@72f1a8a0e394 /]# yum install git # 利用yum安裝git ...... [root@72f1a8a0e394 /]# git --version # 此時的容器中已經裝有git了 git version 1.8.3.1
此時利用exit退出該容器,然后查看docker中運行的程序(容器):
[root@xxx ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 72f1a8a0e394 centos:latest "/bin/bash" 9 minutes ago Exited (0) 3 minutes ago angry_hodgkin
這里將容器轉化為一個鏡像,即執行commit操作,完成后可使用docker images查看:
[root@xxx ~]# docker commit -m "centos with git" -a "qixianhu" 72f1a8a0e394 xianhu/centos:git [root@xxx ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE xianhu/centos git 52166e4475ed 5 seconds ago 358.1 MB centos latest 0584b3d2cf6d 9 days ago 196.5 MB
其中,-m指定說明信息;-a指定用戶信息;72f1a8a0e394代表容器的id;xianhu/centos:git指定目標鏡像的用戶名、倉庫名和 tag 信息。注意這里的用戶名xianhu,后邊會用到。
此時Docker引擎中就有了我們新建的鏡像xianhu/centos:git,此鏡像和原有的CentOS鏡像區別在于多了個Git工具。此時我們利用新鏡像創建的容器,本身就自帶git了。
[root@xxx ~]# docker run -it xianhu/centos:git /bin/bash [root@520afc596c51 /]# git --version git version 1.8.3.1
利用exit退出容器。注意此時Docker引擎中就有了兩個容器,可使用docker ps -a查看。
(2)利用Dockerfile創建鏡像
Dockerfile可以理解為一種配置文件,用來告訴docker build命令應該執行哪些操作。一個簡易的Dockerfile文件如下所示:
# 說明該鏡像以哪個鏡像為基礎 FROM centos:latest # 構建者的基本信息 MAINTAINER xianhu # 在build這個鏡像時執行的操作 RUN yum update RUN yum install -y git # 拷貝本地文件到鏡像中 COPY ./* /usr/share/gitdir/
有了Dockerfile之后,就可以利用build命令構建鏡像了:
[root@xxx ~]# docker build -t="xianhu/centos:gitdir" .
其中-t用來指定新鏡像的用戶信息、tag等。最后的點表示在當前目錄尋找Dockerfile。
構建完成之后,同樣可以使用docker images命令查看:
[root@xxx ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE xianhu/centos gitdir 0749ecbca587 34 minutes ago 359.7 MB xianhu/centos git 52166e4475ed About an hour ago 358.1 MB centos latest 0584b3d2cf6d 9 days ago 196.5 MB
以上就是構建自己鏡像的兩種方法。其中也涉及到了容器的一些操作。如果想刪除容器或者鏡像,可以使用rm命令,注意:刪除鏡像前必須先刪除以此鏡像為基礎的容器。
[root@xxx ~]# docker rm container_name/container_id [root@xxx ~]# docker rmi image_name/image_id
鏡像其他操作指令:
[root@xxx ~]# docker save -o centos.tar xianhu/centos:git # 保存鏡像 [root@xxx ~]# docker load --input centos.tar # 加載鏡像
Docker中關于容器的基本操作
在前邊鏡像的章節中,我們已經看到了如何基于鏡像啟動一個容器,即docker run操作。
[root@xxx ~]# docker run -it centos:latest /bin/bash
這里-it是兩個參數:-i和-t。前者表示打開并保持stdout,后者表示分配一個終端(pseudo-tty)。除了這兩個參數之外,run命令還有很多其他參數。其中比較有用的是-d后臺運行:
[root@xxx ~]# docker run centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done" [root@xxx ~]# docker run -d centos:latest /bin/bash -c "while true; do echo hello; sleep 1; done"
這里第二條命令使用了-d參數,使這個容器處于后臺運行的狀態,不會對當前終端產生任何輸出,所有的stdout都輸出到log,可以使用docker logs container_name/container_id查看。
啟動、停止、重啟容器命令:
[root@xxx ~]# docker start container_name/container_id [root@xxx ~]# docker stop container_name/container_id [root@xxx ~]# docker restart container_name/container_id
后臺啟動一個容器后,如果想進入到這個容器,可以使用attach命令:
[root@xxx ~]# docker attach container_name/container_id
刪除容器的命令前邊已經提到過了:
[root@xxx ~]# docker rm container_name/container_id
Docker中關于倉庫的基本操作
Docker官方維護了一個DockerHub的公共倉庫,里邊包含有很多平時用的較多的鏡像。除了從上邊下載鏡像之外,我們也可以將自己自定義的鏡像發布(push)到DockerHub上。
在鏡像操作章節中,我們新建了一個xianhu/centos:git鏡像。
(1)訪問 https:// hub.docker.com/ ,如果沒有賬號,需要先注冊一個。
(2)利用命令docker login登錄DockerHub,輸入用戶名、密碼即可登錄成功:
[root@xxx ~]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: xianhu Password: Login Succeeded
(3)將本地的鏡像推送到DockerHub上,這里的xianhu要和登錄時的username一致:
[root@xxx ~]# docker push xianhu/centos:git # 成功推送 [root@xxx ~]# docker push xxx/centos:git # 失敗 The push refers to a repository [docker.io/xxx/centos] unauthorized: authentication required
(4)以后別人就可以從你的倉庫中下載合適的鏡像了。
[root@xxx ~]# docker pull xianhu/centos:git
對應于鏡像的兩種創建方法,鏡像的更新也有兩種:
- 創建容器之后做更改,之后commit生成鏡像,然后push到倉庫中。
- 更新Dockerfile。在工作時一般建議這種方式,更簡潔明了。
這里再一次回顧一下三個重要的概念:鏡像、容器、倉庫:
從倉庫(一般為DockerHub)下載(pull)一個鏡像,Docker執行run方法得到一個容器,用戶在容器里執行各種操作。Docker執行commit方法將一個容器轉化為鏡像。Docker利用login、push等命令將本地鏡像推送(push)到倉庫。其他機器或服務器上就可以使用該鏡像去生成容器,進而運行相應的應用程序了。
利用Docker創建一個用于Flask開發的Python環境
上邊已經解釋和練習了Docker的基本操作命令,下邊以實例的形式完整走一遍流程。
我們創建一個用于Flask開發的Python環境,包含Git、Python3、Flask以及其他依賴包等。
完整命令如下:
[root@xxx ~]# docker pull centos [root@xxx ~]# docker run -it centos:latest /bin/bash # 此時進入容器,安裝Python3、Git、Flask及其依賴包等,安裝完成后exit退出 [root@xxx ~]# docker commit -m "Flask" -a "xianhu" container_id xianhu/flask:v1 [root@xxx ~]# docker push xianhu/flask:v1
Docker的功能和特性還有很多,各種運行命令、參數等也都有待學習和練習,比如如何管理數據、如何管理網絡、如何互相配合工作、如何編寫更專業的Dockerfile等。本文先入門為主,以后有時間再慢慢更新關于Docker的知識。
來自:https://zhuanlan.zhihu.com/p/23599229