動手學Docker-第二彈-基本操作


完整項目請查看Github:鏈接
或通過gitbook在線查看: 鏈接

Docker三大基本概念

鏡像Image

Image文件可以看作是我們要使用的運行環境的一個模版。任何兩臺電腦都安裝了Docker的話,只要你們使用的image相同,那麼加載出來的container就是相同的。Docker的Image是分層的,通過改變某層就可以形成一個新的鏡像每個鏡像可能會有很多個版本的tag。

在這裏插入圖片描述

容器Container

Docker通過Image加載出來的就是容器,其實質是一個進程,所以它可以擁有自己獨立的文件系統,網絡等等。我們可以將我們的整體開發環境打包成鏡像,在服務器上將此鏡像加載爲容器,對外界提供服務,就像剛纔的那個wordpess案例一樣。

倉庫Repository

Docker Registry

鏡像構建完成後,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。

一個 Docker Registry 中可以包含多個 倉庫Repository);每個倉庫可以包含多個 標籤Tag);每個標籤對應一個鏡像。

通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標籤,將以 latest 作爲默認標籤。

Ubuntu 鏡像 爲例,ubuntu 是倉庫的名字,其內包含有不同的版本標籤,如,16.04, 18.04。我們可以通過 ubuntu:16.04,或者 ubuntu:18.04 來具體指定所需哪個版本的鏡像。如果忽略了標籤,比如 ubuntu,那將視爲 ubuntu:latest

倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用戶環境下的用戶名,後者則往往是對應的軟件名。但這並非絕對,取決於所使用的具體 Docker Registry 的軟件或服務。

Docker Registry 公開服務

Docker Registry 公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。

最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。除此以外,還有 CoreOSQuay.io,CoreOS 相關的鏡像存儲在這裏;Google 的 Google Container RegistryKubernetes 的鏡像使用的就是這個服務。

由於某些原因,在國內訪問這些服務可能會比較慢。國內的一些雲服務商提供了針對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱爲加速器。常見的有 阿里雲加速器DaoCloud 加速器 等。使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從 Docker Hub 下載速度會提高很多。在 安裝 Docker 一節中有詳細的配置方法。

國內也有一些雲服務商提供類似於 Docker Hub 的公開服務。比如 網易雲鏡像服務DaoCloud 鏡像市場阿里雲鏡像庫 等。

私有 Docker Registry

除了使用公開服務外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做爲私有 Registry 服務。在 私有倉庫 一節中,會有進一步的搭建私有 Registry 服務的講解。

開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些高級功能。

除了官方的 Docker Registry 外,還有第三方軟件實現了 Docker Registry API,甚至提供了用戶界面以及一些高級功能。比如,HarborSonatype Nexus


在這裏插入圖片描述

關於以上概念更多內容請看:基本概念

鏡像與容器操作

若使用Linux操作Docker時,發現Docker沒有啓動們可以使用命令

sudo service docker start

來啓動Docker服務。

查看本地已經存在的image

docker image ls
#或者docker images

因爲Docker的架構與虛擬機不同,所以Docker可以在不同的Image之間共享層,這樣可以儘可能的少佔用存儲空間。

如何獲取image

  • 通過docker pull從遠程倉庫拉取鏡像
  • 通過Dockerfile構建鏡像

1.使用docker pull方式例如我們想獲取redis的鏡像,我們可以通過命令

docker pull redis

我們在拉取鏡像時也可以指定版本號,否則默認是拉取最新的latest鏡像。

docker pull redis:alpine3.11

通過docker images再顯示拉取下來的鏡像

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-u86g7gkd-1584957348579)(./images/docker_pull.png)]

2.使用Dockerfile方式

我們這裏使用c語言編寫一個hello world程序,之後將該程序打包到Docker image中。

首先創建單獨的文件夾存放與Dockerfile相關的文件,創建hello.c文件,並將其編譯爲可執行文件hello

#include<stdio.h>

int main(){
    printf("Hello World\n");
}

使用命令進行編譯。在centos上通過命令安裝編譯環境:

sudo yum install gcc
sudo yum install glibc-static

將文件編譯爲可執行文件

gcc -static ello.c -o hello

創建並編輯Dockerfile內容(此處的文件並不規範,僅作爲快速上手使用)

FROM scratch
ADD hello /
CMD ["/hello"]

現在我們來看一下目錄下的所有文件

在這裏插入圖片描述

根據此Dockerfile創建鏡像

docker build -t su/hello-world .

其中-t之後代表我們要生成鏡像的標記,最後有一個.不要忘記,代表當前文件夾下。

我們再使用docker images便可以查看到我們剛纔創建的image。

在這裏插入圖片描述

關於更多Dockerfile語法規則請查看:Dockerfile 指令詳解

刪除image

使用如下命令刪除redis拉取的redis鏡像,命令中的redis也可以修改爲redis對應的Image ID。

docker image rm redis
#或者docker rmi redis

發佈image

爲了將我們自己創建的image發佈,我們需要在Docker Hub上註冊賬號,並且在生成鏡像時,-t後面要接Docker Hub用戶名/鏡像名稱。我們已經生成了一個新的hello world鏡像。

在這裏插入圖片描述

首先通過docker login命令登陸。

在這裏插入圖片描述

推送自己的鏡像到Docker Hub上

docker push superssssss/hello-world:latest

注意你在使用過程中需要將superssssss修改爲自己的賬戶名,:後面接的是鏡像版本。

在這裏插入圖片描述

我們就可以在Docker Hub上查看到剛纔push上去的鏡像了。
關於Docker Hub與Github連接並自動構建鏡像,請查看完整版:Github

在這裏插入圖片描述

生成container並進入container

我們先加載一下剛纔我們自己創建的image,通過一下命令運行

docker run su/hello-world

我們可以看到輸出結果

在這裏插入圖片描述

剛纔使用docker run命令就是將我們創建的hello-world鏡像加載成容器運行。

我們通過此命令可以查看到container的運行情況

docker container ls -a
#或者docker	ps -a

因爲通過此方式創建的容器運行完會直接退出,所以需要加上-a參數。

在這裏插入圖片描述


我們在來看一個centos的案例。

docker run -d centos /bin/bash

我們本地雖然沒有centos的鏡像,但是如果我們直接run的話,docker會自動從網上將centos的鏡像拉取下來,並加載成容器,其中的-d參數會使當前的容器轉爲後臺執行,我們可以使用命令來查看一下容器狀態。

在這裏插入圖片描述

STATUS一欄可以查看容器的狀態,現在centos這個鏡像是UP狀態。然後再通過docker exec命令進入容器

docker exec -it b6a /bin/bash

其中-it參數可以使終端以交互式的運行,並執行/bin/bash命令,b6a就可以代表這個centos容器對應的CONTAINER ID。

在這裏插入圖片描述

進入容器之後我們就可以配置我們需要的環境或者安裝需要的服務。

在終端中輸入exit退出容器。

停止和重啓container

對於現在運行的container我們可以使其停止運行或者將已經停止的container重新啓動

docker container stop b6a
docker container start b6a

刪除container

對於我們已經不再需要的容器,我們可以將其刪除。

docker container rm b6a
#或者docker rm b6a

在這裏插入圖片描述

flask案例實戰

本案例我們使用python的flask框架搭建一個簡易的可訪問的網站。

首先編寫python程序,文件名爲app.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return "hello docker\n"
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)

之後編寫Dockerfile文件

FROM python:2.7
LABEL maintainer="123<[email protected]>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python", "app.py"]

這個Dockerfile包含更多的內容,我們這個Dockerfile是以python:2.7爲基礎鏡像,其中maintainer爲此Dockerfile文件的維護人員,方便其他使用者聯繫。接下來的RUN命令安裝了flask框架,COPY命令將文件夾下的app.py拷貝到鏡像文件下的/app/目錄下,並通過WORKDIR命令將當前的工作目錄設置爲/app,並將鏡像的5000端口EXPOSE開放出去提供訪問,最後的CMD命令執行這個app.py文件。我們來看一下現在文件夾下存在哪些內容

在這裏插入圖片描述
然後構建一下鏡像,需要一段時間。

docker build -t superssssss/flask-hello .

接下來我們將鏡像加載爲容器運行

docker run -d -p 5000:5000 superssssss/flask-hello

-p參數將容器的5000端口映射到電腦的5000端口,這樣通過電腦的ip地址:5000就可以訪問這個容器提供的服務了。

在這裏插入圖片描述

Docker練習場

學習完以上內容,大家可以參加一下阿里天池的Docker練習場比賽,更進一步熟悉Docker操作。

我的提交在:tianchi_submit


歡迎大家關注我們的公衆號:知識沉澱部落。
知識沉澱部落

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章