小白學Docker之基礎篇

系列文章:html

PS: 如下是我的做爲新手小白學習docker的筆記總結linux

1. docker是什麼

百科上的解釋是這樣的:git

Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。docker

知乎上的不少理解是將其理解成集裝箱,彼此之間互相不影響,各自運行在各自的環境中。能夠看這裏的解釋:https://www.zhihu.com/question/28300645shell

docker安裝

win10 環境(其餘環境自行搜索安裝):數據庫

首先 啓動 Microsoft Hyper-V

在電腦上打開「控制面板」->「程序」-> 「啓動或關閉Windows功能」, 勾選Hyper-V選項:ubuntu

hyper

而後重啓電腦vim

官網 (https://docs.docker.com/docker-for-windows/install/#download-docker-for-windows)下載 Docker for Windows Installer

咱們下載穩定版,安裝文件保存位置能夠根據本身喜愛選擇windows

docker-download

下載完成後的安裝文件:centos

docker

安裝

雙擊安裝文件安裝,彈出:

docker-install1

勾選接受協議點擊 install ,接下來會自動進行安裝,安裝完成後:

docker-installed

完成後桌面會出現 Docker 圖標 ,而且 Docker 會自動啓動

docker-icon

如今 Docker 就已經安裝好了。

電腦 cpu 開啓虛擬化

參考電腦型號搜索 cpu 開啓虛擬化,下面是常見開啓方法,僅供參考:

https://jingyan.baidu.com/article/91f5db1b3002831c7f05e3b0.html

https://jingyan.baidu.com/article/335530daa55d7e19cb41c3c2.html

運行 Hello world

使用docker run在容器內運行 Hello world

hello-world

在最開始時,因爲本地不存在ubuntu:15.10的鏡像,Docker就會從鏡像倉庫 Docker Hub 下載這個鏡像,這裏暫時不須要管,下載完成後,就會自動執行這個echo命令。

  • ubuntu:15.10:指定要運行的鏡像

  • /bin/echo "Hello world":在啓動的容器裏執行的命令

PS: 在windows上的git Bash中,會出現以下錯誤:

$ docker run ubuntu:15.10 /bin/echo "Hello world"
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:296: starting container process caused "exec: \"D:/develop/Git/usr/bin/echo\": stat D:/develop/Git/usr/bin/echo: no such file or directory": unknown.

// 本身意會
`git Bash`並非一個終端設備,只是一個解釋Shell命令的軟件
換成windows自帶的CMD,或者PowerShell運行命令便可
參看:https://www.zhihu.com/question/21711307

與容器對話

經過如下命令在容器內打開一個僞終端,而後運行命令

docker run -i -t ubuntu:15.10 /bin/bash

container-chat

  • -t:在新容器內指定一個僞終端或終端。

  • -i:容許你對容器內的標準輸入 (STDIN) 進行交互。

使用exit或者ctrl + d來退出容器

後臺運行容器

使用docker run -d的方式來在後臺運行容器

docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
339394e15bd25bcd3791ba1ae6d3f107fa49584acc55081a45e70d9719448c8e

run-back

339394e15bd25bcd3791ba1ae6d3f107fa49584acc55081a45e70d9719448c8e

這個長字符串叫作容器ID,對每一個容器來講都是惟一的,咱們能夠經過容器ID來查看對應的容器發生了什麼。

首先,咱們須要確認容器有在運行,能夠經過 docker ps 來查看

docker ps

docker-ps

使用docker logs <container id>來查看容器內的日誌

docker logs 339394e15bd2

// or

docker logs amazing_cori

docker-logs

中止容器

使用docker stop <container id>來查看容器內的日誌

docker stop 339394e15bd2

// or

docker stop amazing_cori

docker-stop

2. docker鏡像

鏡像列表

images

  • REPOSITORY: 鏡像的倉庫源
  • TAG: 鏡像的標籤
  • IMAGE ID: 鏡像ID
  • CREATED: 鏡像建立的時間
  • SIZE: 鏡像大小

獲取一個新的鏡像

當本地機器上使用一個不存在的鏡像時,Docker就會下載這個鏡像,例如:

download

咱們也可使用docker pull命令下載

docker pull ubuntu:15.10

查找鏡像

使用docker search xxxDocker Hub中發佈的鏡像,地址是:Docker Hub,例如咱們搜索ubuntu的鏡像爲:

search

其中OFFICIAL表明的是不是官方發佈

建立鏡像

當咱們從docker中下載的鏡像不能知足咱們的要求的時候,咱們能夠對這個鏡像進行更改或者建立一個新的鏡像。

更改鏡像

update-image

拉取learn/tutorial鏡像,在此鏡像上安裝ping命令,以後使用commit進行提交

docker commit <image id> <new image name>

使用docker images查看更改以後的鏡像

after-images

刪除鏡像

1.中止全部的container,這樣纔可以刪除其中的images:

docker stop $(docker ps -a -q)

若是想要刪除全部container的話再加一個指令:

docker rm $(docker ps -a -q)

2.查看當前有些什麼images

docker images

3.刪除images,經過image的id來指定刪除誰

docker rmi <image id>

想要刪除untagged images,也就是那些id爲 的image的話能夠用

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

要刪除所有image的話

docker rmi $(docker images -q)

3. 使用Dockerfile建立一個鏡像

建立一個Dockerfile

> cd docker
> touch Dockerfile
> vim Dockerfile

docker-file

關於Dockerfile裏面的各個指令,解釋以下:

在Dockerfile中用到的命令有
FROM
    FROM指定一個基礎鏡像, 通常狀況下一個可用的 Dockerfile必定是 FROM 爲第一個指令。至於image則能夠是任何合理存在的image鏡像。
    FROM 必定是首個非註釋指令 Dockerfile.
    FROM 能夠在一個 Dockerfile 中出現屢次,以便於建立混合的images。
    若是沒有指定 tag ,latest 將會被指定爲要使用的基礎鏡像版本。
MAINTAINER
    這裏是用於指定鏡像製做者的信息
RUN
    RUN命令將在當前image中執行任意合法命令並提交執行結果。命令執行提交後,就會自動執行Dockerfile中的下一個指令。
    層級 RUN 指令和生成提交是符合Docker核心理念的作法。它容許像版本控制那樣,在任意一個點,對image 鏡像進行定製化構建。
    RUN 指令緩存不會在下個命令執行時自動失效。好比 RUN apt-get dist-upgrade -y 的緩存就可能被用於下一個指令. --no-cache 標誌能夠被用於強制取消緩存使用。
ENV
    ENV指令能夠用於爲docker容器設置環境變量
    ENV設置的環境變量,可使用 docker inspect命令來查看。同時還可使用docker run --env <key>=<value>來修改環境變量。
USER
    USER 用來切換運行屬主身份的。Docker 默認是使用 root,但若不須要,建議切換使用者身分,畢竟 root 權限太大了,使用上有安全的風險。
WORKDIR
    WORKDIR 用來切換工做目錄的。Docker 默認的工做目錄是/,只有 RUN 能執行 cd 命令切換目錄,並且還只做用在當下下的 RUN,也就是說每個 RUN 都是獨立進行的。若是想讓其餘指令在指定的目錄下執行,就得靠 WORKDIR。WORKDIR 動做的目錄改變是持久的,不用每一個指令前都使用一次 WORKDIR。
COPY
    COPY 將文件從路徑 <src> 複製添加到容器內部路徑 <dest>。
    <src> 必須是想對於源文件夾的一個文件或目錄,也能夠是一個遠程的url,<dest> 是目標容器中的絕對路徑。
    全部的新文件和文件夾都會建立UID 和 GID 。事實上若是 <src> 是一個遠程文件URL,那麼目標文件的權限將會是600。
ADD
    ADD 將文件從路徑 <src> 複製添加到容器內部路徑 <dest>。
    <src> 必須是想對於源文件夾的一個文件或目錄,也能夠是一個遠程的url。<dest> 是目標容器中的絕對路徑。
    全部的新文件和文件夾都會建立UID 和 GID。事實上若是 <src> 是一個遠程文件URL,那麼目標文件的權限將會是600。
VOLUME
    建立一個能夠從本地主機或其餘容器掛載的掛載點,通常用來存放數據庫和須要保持的數據等。
EXPOSE
    EXPOSE 指令指定在docker容許時指定的端口進行轉發。

CMD
    Dockerfile.中只能有一個CMD指令。 若是你指定了多個,那麼最後個CMD指令是生效的。
    CMD指令的主要做用是提供默認的執行容器。這些默認值能夠包括可執行文件,也能夠省略可執行文件。
    當你使用shell或exec格式時,  CMD 會自動執行這個命令。
ONBUILD
    ONBUILD 的做用就是讓指令延遲執行,延遲到下一個使用 FROM 的 Dockerfile 在創建 image 時執行,只限延遲一次。
    ONBUILD 的使用情景是在創建鏡像時取得最新的源碼 (搭配 RUN) 與限定系統框架。
ARG
    ARG是Docker1.9 版本才新加入的指令。
    ARG 定義的變量只在創建 image 時有效,創建完成後變量就失效消失
LABEL
    定義一個 image 標籤 Owner,並賦值,其值爲變量 Name 的值。(LABEL Owner=$Name )

ENTRYPOINT
    是指定 Docker image 運行成 instance (也就是 Docker container) 時,要執行的命令或者文件。

更加詳細的解釋請參看這裏:http://www.docker.org.cn/dockerppt/114.html

Dockerfile裏面的內容:

FROM docker.io/centos
MAINTAINER The CentOS Test Images - test
RUN mkdir -p /usr/app
RUN ls
RUN pwd
ENV JAVA_HOME /usr/app/jdk
ENV PATH $JAVA_HOME/bin:$PATH

在這裏只是拉取了一個centos鏡像,而後添加了JAVA的環境變量,這裏僅僅做爲測試

建立鏡像

使用docker build來生成鏡像,關於這個命令的詳細用法,可使用docker build --help

> cd docker
> docker build -t centos:test -f ./Dockerfile .
  • -t 表示給鏡像打TAG
  • -f 表示Dockerfile的地址
  • . 表示包含Dockerfile存放的目錄

過程以下:

docker-build

建立以後的鏡像:

build-images

查看Path:

path

參考文章

相關文章
相關標籤/搜索