docker學習篇(二)---- 基礎篇

引言

在以前的學習中,我知道了docker的三大組件分別是----鏡像,容器,倉庫。瞭解了這三個組件也就初步理解了docker。因此我學習了這三個組件,並記錄下來。php

 

鏡像

docker在運行一個容器時須要本地存在相對應的鏡像,執行流程大體是這樣的:mysql

  1. 準備容器
  2. 查看容器所須要的鏡像是否存在於本地
  3. 若是存在,運行容器
  4. 若是不存在,檢索遠程鏡像倉庫,找到並下載
  5. 運行容器

獲取鏡像

經過docker pull來從鏡像倉庫獲取鏡像:linux

ubuntu@VM-68-11-ubuntu:~$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
Digest: sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Status: Downloaded newer image for ubuntu:latest
 
在下載的過程當中,會出現鏡像的每一層信息。

若是官方倉庫註冊服務器下載速度太慢,咱們能夠從其餘倉庫下載,這個時候由於不是從默認的註冊倉庫下載,因此咱們須要顯式的聲明下載倉庫地址:nginx

$ sudo docker pull dl.dockerpool.com:5000/ubuntu:latest
Pulling dl.dockerpool.com:5000/ubuntu
ab8e2728644c: Pulling dependent layers
511136ea3c5a: Download complete
5f0ffaa9455e: Download complete
a300658979be: Download complete
904483ae0c30: Download complete

顯示鏡像

docker images

經過上面命令能夠查看本地已經下載的鏡像文件sql

從上面的信息中,咱們能夠得到:docker

  • 來自那個倉庫(REPOSITORY)
  • 鏡像標記(TAG)
  • ID號惟一標識(IMAGE ID)
  • 建立時間(CREATED)
  • 鏡像大小(SIZE)

TAG:用來標記來自同一倉庫的不一樣鏡像,好比 Ubuntu倉庫中中有多個鏡像,經過TAG來區分版本。若是不記得具體的版本了,默認用latest標記信息json

修改鏡像

使用下載的鏡像啓動容器bootstrap

$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#

在容器中增長json和gem應用ubuntu

root@0b2616b0e5a8:/# gem install json

結束後經過exit退出容器,如今容器中有咱們剛剛添加的應用,容器已經被咱們改變了。經過docker commit來提交更新後的副本ruby

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

 -m 來指定提交的說明信息,跟咱們使用的版本控制工具同樣;

-a 能夠指定更新的用戶信息;以後是用來建立鏡像的容器的 ID;

最後指定目標鏡像的倉庫名和 tag 信息。

建立成功後會返回這個鏡像的 ID 信息。

咱們可使用docker images查看新建立的鏡像。

Dockerfile

當在一個團隊中分享新建立的鏡像時,咱們可使用Dockerfile來解決這個團隊分享問題。

Dockerfile包含一些怎樣建立鏡像的指令。

新建一個目錄和一個Dockerfile:

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

Dockerfile的每一條指令都建立鏡像的一層:

# This is a comment
FROM ubuntu:14.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra

基本語法:

經過#來進行註釋

FROM指令告訴Docker使用哪一個鏡像來做爲基礎鏡像

接着是維護者的信息

RUN開頭的指令會在建立中運行。好比安裝一個軟件包

另外,ADD 命令是複製本地文件到鏡像;EXPOSE 命令來向外部開放端口;CMD 命令來描述容器啓動後運行的程序等。

編寫完Dockerfile後經過docker build來建立生成鏡像。

sudo docker build -t="ouruser/sinatra:v2" .

-t 標記來添加 tag,指定新的鏡像的用戶信息。注意:「.」不能刪除,它指的是Dockerfile所在路徑(當前的目錄),若是Dockerfile在其餘位置,能夠將「.」替換成一個具體的Dockerfile路徑。

build 進程在執行操做。它要作的第一件事情就是上傳這個 Dockerfile 內容,由於全部的操做都要依據Dockerfile 來進行。Docker指令被按條執行,每一步建立一個新的容器,在容器中執行指令並提交修改,當全部指令執行完成後,返回最終id。

咱們能夠經過docker tag來修改鏡像的標籤。通過docker push將建立的鏡像上傳到倉庫中進行分享。

導出和導入鏡像

將鏡像導出到本地,可使用docker save命令

$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04

可使用docker load從導出的本地文件中再導入本地的鏡像庫

$ sudo docker load --input ubuntu_14.04.tar

$ sudo docker load < ubuntu_14.04.tar

刪除本地的鏡像

使用docker rmi命令刪除本地的鏡像

注意:

  • docker rm命令是用來刪除容器的,兩個刪除命令的操做對象是不一樣的。
  • 在刪除一個鏡像時首先要刪除依賴於這個鏡像的全部容器,不然可能會出現錯誤。

 

 

容器

容器是獨立運行的一套或者一組應用以及他們的運行態環境。虛擬機能夠理解爲模擬運行的一整套操做系統(提供運行態環境和其餘系統環境)和運行在上面的應用。因此容器相較於虛擬機來講,顯得很是輕量級,啓動速度也是以秒級計算的。

啓動

容器啓動有兩種形式:

  • 一種是基於鏡像建立一個新的容器並啓動
  • 另外一種是將在終止狀態的容器從新啓動

啓動容器命令用docker run來實現,以下面的例子:

$ sudo docker run ubuntu:16.04 /bin/echo 'Hello world'
Hello world

啓動一個bash終端,容許用戶交互:

$ sudo docker run -t -i ubuntu:16.04 /bin/bash
root@af8bae53bdd3:/#

-t 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上;-i 則讓容器的標準輸入保持打開。

當在執行docker run來建立一個容器時,docker的流程是:

  1. 檢查本地是否有指定的鏡像,若是沒有從共有倉庫下載
  2. 利用指定的基礎鏡像建立一個容器
  3. 分配一個文件系統,而且在只讀的鏡像層外面掛載一層讀寫層
  4. 從宿主主機配置的網橋接口中橋接一個虛擬接口到容器
  5. 從地址池中配置一個IP地址給容器
  6. 執行用戶指定的應用程序
  7. 關閉容器

那麼怎麼啓動一個以前已經終止的容器呢?咱們能夠利用docker start命令來將一個終止的容器從新啓動起來。

容器的核心爲所執行的應用程序,所須要的資源都是應用程序運行所必需的。在與容器交互的僞終端中咱們能夠經過ps或者top命令進行查看容器中進程的信息。

守護態運行

咱們想要讓一個容器在後臺以守護態形式運行。能夠在執行docker run命令時增長-d參數。

$ sudo docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147

以守護態運行容器後會返回容器的id,咱們能夠經過docker ps 查看容器信息。

$ sudo docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
1e5535038e28  ubuntu:14.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        insane_babbage

注意:想要查看全部沒有刪除的容器須要加上-a參數。

想要查看守護態容器在後臺輸出的信息,但是使用docker logs進行查看:

$ docker logs insane_babbage
hello world
hello world
. . .

進入容器內

當加上-d運行容器時,容器以守護態形式進行在後臺執行,但有時候咱們想要進入到容器中進行工做,應該怎麼實現呢??

1.咱們可使用docker自帶的指令docker attach

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#

可是多個窗口同時進入到一個容器中呢?這個時候全部窗口都會同步顯示,而且一個窗口若是出現堵塞,其餘窗口也會沒法運行,因此attach很是不方便。

2. nsenter命令

咱們能夠經過nsenter命令進入容器,而是用nsenter命令須要安裝nsenter工具,安裝步驟以下:

$ cd /tmp; 
$ curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; 
$ cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin

注意:nsenter工具在util-linux 包2.23版本後包含,若是你的電腦中有util-linux包,首先要看版本是否太低。Ubuntu14.04使用的是util-linux包的2.20版本。

爲了鏈接到容器,咱們須要知道容器的第一個進程的PID,經過下面方法得到:

PID=$(docker inspect --format "{{ .State.Pid }}" <container>)

經過這個PID進行鏈接容器:

nsenter --target $PID --mount --uts --ipc --net --pid

終止容器

當咱們須要中止一個正在執行的容器時,使用docker stop指令。

若是該容器中指定的應用終止時,容器也會自動終止。好比上面咱們讓容器運行一個僞終端與用戶進行交互,當經過exit退出僞終端時,這個容器也自動終止了。

若是想讓一個運行態的容器終止後從新啓動,咱們可使用docker restart指令。

導出和導入

導出

docker中想要對容器進行備份導出也是很是簡單的,能夠經過docker export

$ sudo docker export 7691a814370e > ubuntu.tar

在導出時咱們須要知道該容器的ID。

導入

可使用docker import指令將容器快照導入爲鏡像。

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0

咱們也能夠經過指定URL得到目錄路徑來進行導入:

$sudo docker import http://example.com/exampleimage.tgz example/imagerepo

load和import的區別

docker load是用來導入鏡像存儲文件到本地鏡像庫;docker import是導入一個容器快照到本地鏡像庫。區別在於容器快照文件將會丟棄全部歷史記錄和元數據信息(即容器當時的快照狀態),而鏡像文件將保存完整記錄,體積更大。

刪除容器

當咱們想要刪除一個容器時,可使用docker rm指令來刪除一個終止狀態的容器。若是咱們想要刪除一個正在運行的狀態,能夠加上-f參數。

 

 

倉庫

倉庫就是存放鏡像的地方。

目前 Docker 官方維護了一個公共倉庫 Docker Hub (https://hub.docker.com/) ,其中已經包括了超過 15000 的鏡像。大部分需求,均可以經過在 Docker Hub 中直接下載鏡像來實現。

登陸

經過docker login指令來輸入用戶名,密碼和郵箱後完成註冊和登陸。用戶的認證信息保存在本地的.dockercfg。

檢索

咱們想要查找官方倉庫中有哪些咱們須要的鏡像,能夠經過docker search指令實現,並經過docker pull下載到本地鏡像倉庫中。

ubuntu@VM-68-11-ubuntu:~$ docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   8174                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                            Ubuntu with openssh-server and NoVNC            208                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   167                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   125                                     [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   94                                      [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   87                  [OK]                
neurodebian                                               NeuroDebian provides neuroscience research s…   52                  [OK]                
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          43                                      [OK]
ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   39                  [OK]                
nuagebec/ubuntu                                           Simple always updated Ubuntu docker images w23                                      [OK]
tutum/ubuntu                                              Simple Ubuntu docker images with SSH access     18                                      
i386/ubuntu                                               Ubuntu is a Debian-based Linux operating sys…   13      

 

 

以上~~

相關文章
相關標籤/搜索