小白學Docker之基礎篇


系列文章:

PS: 以下是個人作為新手小白學習docker的筆記總結

1. docker是什么

百科上的解釋是這樣的:

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

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

docker安裝

win10 環境(其他環境自行搜索安裝):

首先 啟動 Microsoft Hyper-V

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

hyper

然后重啟電腦

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

我們下載穩定版,安裝文件保存位置可以根據自己喜好選擇

docker-download

下載完成后的安裝文件:

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

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM