Docker從門外到入門使用


取材

第一本Docker書。原作者:James Turnbull

 

安裝

這里只說明Windows環境的安裝(Windows7以上)

使用Docker Toolbox工具即可:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/?spm=5176.8351553.0.0.58a71991lwK6LZ

然后點擊下一步安裝完畢,

出現三個圖標,ToolBox是Docker組件的集合,包括了一個極小的虛擬機,在Windows下安裝了一個支持命令行的工具。

而其中的Docker Quickstart Terminal,提供了一個命令行操作的平台,Kitematic (Alpha)提供了一個GUI客戶端的平台。

 

 需要注意的是:使用-v的docker run命令在Windows下無法工作,因為無法掛載本地目錄。

 另外:

docker-machine stop default 停止運行中的虛擬機
docker-machine rm default 刪除默認的虛擬機

 

Docker組件說明

1.Docker客戶端和服務端

Docker客戶端位於外界,各個客戶端通過Docker守護進程作為中介,連接到Docker容器中。Docker容器和Docker守護進程,屬於Docker主機中的內容。

 

 

2.Docker鏡像

打開Docker Quickstart Terminal輸入命令:docker images,即可查看本地的鏡像。鏡像是存儲在本地的一個位置的(在/var/lib/docker中)

docker images

用戶基於鏡像,創建容器。

在Docker里,root文件系統永遠只讀狀態,並會通過root文件系統價值更多的只讀文件系統。這樣的文件系統稱為鏡像。

容器將鏡像的層層堆疊和覆蓋,形成新的鏡像,下面的鏡像稱為父鏡像,最底層為基礎鏡像。在最上層是一個可讀寫的文件系統,用於Docker程序在該讀寫層執行。

這種堆疊稱為寫時復制,因此說,當在最上層進行修改后,覆蓋了原有的一部分,又可以構成新的鏡像,然后發布(快速構建)。

 

3.Registry

Registry保存用戶的鏡像,下載,上傳鏡像。Docker公司是Docker Hub上存儲了不少官方和私人的鏡像。如MySQL數據庫的鏡像。用戶也可以自己架設Registry,Registry也有共有和私有之分。

4.Docker容器

使用鏡像創建容器container。我覺得是鏡像的實例化。使用命令:docker run -i -t ubuntu /bin/bash之類的命令可以根據鏡像創建容器,鏡像不存在則自動下載鏡像

位置在(/var/lib/docker/containers)。在Toolbox中查看需要使用:docker-machine ssh進入到虛擬機中才可以查看。如圖,有時候需要sudo,或者切換到管理員才能進入目錄下:

第二種圖為容器的ID號碼

 

 

 

 

更改鏡像源

有時候,一個良好的下載速度是必要的。和其它人一樣,這里提供一個更改下載鏡像源的方案。

使用阿里雲加速,也許可以打開參閱:https://cr.console.aliyun.com/cn-shenzhen/instances/mirrors

注冊賬號,找到容器鏡像服務,打開,找到自己專屬的地址,對應系統,然后輸入到控制台中即可。可以用docker info 查看鏡像源是否更改。

 

 

 

查看docker信息

在終端輸入docker info,可以查看到當前容器數量,鏡像數量,還有更改的鏡像源等

 

 

 

運行第一個容器

運行如下代碼,-i保證容器中的STDIN開啟,-t創建偽tty終端,這樣可以交互。該代碼使用的鏡像為Ubuntu,當該鏡像不存在則會自動pull然后下載,保存到本地。該鏡像是一個基礎鏡像。

創建的容器,是一個剪裁的Ubuntu系統,有自己的網絡和IP地址,和宿主機通信的網絡接口。

docker run -i -t ubuntu /bin/bash

運行該行會進入到容器中,並自動為該容器創建一個名字和一個ID。

名字可以在run的時候指定,指定的方式為:

docker run --name my_container -i -t ubuntu /bin/bash

 

輸入后直接進入該容器中,輸入hostname可以查看到ID。

通過

apt update
apt install net-tools

 

命令安裝完ifconfig的程序時候,可以通過ifconfig -a查看到該容器的IP地址。

 

 

 可以通過以下代碼在容器中,查看進程,安裝vim等

ps aux
apt install vim

 

 

輸入exit退出容器,或者ctrl+d退出。退出容器,/bin/bash命令結束,容器停止。

通過以下代碼查看創建的容器詳細信息,包括ID,名字。在引用的時候,可以使用ID,也可以使用名字引用。

docker ps -a

 

啟動,創建,和附着容器

如下命令即可啟動:(對應到上圖中ID的第一個,也可以使用NAMES的值代替ID,這里ID沒有寫全了,不過能用)

docker start 6d47

使用如下代碼查看STATUS,可以看到啟動了:

docker ps -a

 

 容器創建使用docker create命令,創建卻不運行它。

雖然容器啟動了,可是沒有進到容器中,不能進行交互式會話。

使用如下命令,附着到正在運行的容器,進行會話。

docker attach 6d47

這樣就又回到交互式環境中了:

 

 

創建和使用守護式容器

守護式容器沒有交互式會話,長期運行在后台,提供服務即可。使用的命令還是run命令。

運行如下命令,即可創建一個守護式容器。

docker run --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

運行完以后,通過docker ps -a可以查看狀態,它在后台運行。會在每秒中輸出一個hello world。

因為使用了-d參數,所以才能夠放到后台運行。

查看該容器中的輸出效果:

docker logs my_container

 

使用如下跟蹤守護式進程日志(ctrl +c退出跟蹤(容器不會停止)):

另外,-t可以增加日志的時間戳信息,如--tail 4,可以只顯示最后四條信息

docker logs -f my_container

 

 

Docker日志驅動,使用

docker run --log-driver="syslog" --name container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

創建,但是在Docker Toolbox中,需要使用:

docker-machine ssh
syslogd

 

命令進入Docker Toolbox虛擬機,然后運行syslogd,來啟動syslog守護進程

 

容器進程查看、統計信息

在終端查看守護式容器中的進程:

docker top my_container

 

 

在容器中運行進程

后台命令示例使用代碼:

docker exec -d my_container touch /etc/new_file

 

則在該容器中(-d表示后台執行),創建一個新文件

交互式命令示例使用代碼:

docker exec -t -i my_container /bin/bash

該代碼可以進去與之前創建的守護式容器進行交互(當然我之前使用了 docker exec -d my_container kill -9 xxx結束了容器中的循環echo的代碼了)。

 

 

停止、自重啟守護式容器

使用如下(發送SIGTERM信號),停止正在運行的該容器:(也可以使用docker kill 發送SIGKILL信號更快停止)

docker stop my_container

創建守護式容器中使用了:docker run --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done",這里添加--restart部分即可

docker run --restart=always --name my_container -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"

可以使用always表示是否正常退出都重啟,使用參數為on-failure:5表示失敗重啟,次數為5次。

 

查看容器詳細信息與刪除容器

查看詳細信息如下,其中第二條用於過濾信息。

docker inspect my_container
docker inspect --format='{{.State.Running}}' my_container

刪除容器使用rm命令

docker rm my_container

使用-f選項,可以刪除正在運行中的容器。

刪除所有容器的方法是:

 

docker rm `docker ps -a -q`

其中的子句列出了所有容器的id。

  

拉取、查找鏡像

拉取:

之前通過run獲取的是自動獲取,這里手動下載鏡像示例:

docker pull ubuntu:12.04

該命令會從Docker Hub上拉取鏡像

之后可以通過docker images查看本地鏡像。在拉取過程中,不指定則使用標簽為latest,這里指定了標簽為12.04.

這種標簽機制可以存活多個相同名字不同標簽的鏡像。

在run的過程中,指定基礎鏡像時候,需要加上該標簽更合適(默認latest):

docker run --name my_container -i -t ubuntu:12.04 /bin/bash

從用戶那里拉取鏡像時候,:需要包含:用戶名,倉庫名。

之前拉取只有倉庫名,是因為其為頂級倉庫,由優質廠商提供的鏡像。

查找鏡像:

使用代碼示例:

docker search puppet

 

 

會提示一些信息,排名等

然后通過以下拉取鏡像即可

docker pull xxx/xxxx

前面是用戶名,后面是倉庫名。

 

構建鏡像--commit

這里指代的是在原有鏡像的基礎上,進行修改,然后重新生成新的鏡像。

創建容器,進行修改后退出容器,提交即可:

docker run -i -t ubuntu /bin/bash

apt update
apt -y install apache2

docker commit $ID $用戶名/$倉庫名

其中,提交參數有 -a 后面添加作者,-m后面添加提交說明,倉庫名后添加    :$標簽   ,表示提交使用的標簽。

提交后成為鏡像,又可以拿來產生容器。

 

構建鏡像--build與Dockerfile

使用build和Dockerfile創建鏡像。其中Dockerfile中填寫了一些說明信息。下面構建了文件夾作為環境上下文,然后在該環境中創建文件。

mkdir static_web
cd static_web
touch Dockerfile
nano Dockerfile

文件中寫入的內容例如:

FROM ubuntu:14.04
MAINTAINER Bai "1872040489@qq.com"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi I am in your container ' > /usr/share/nginx/html/index.html
EXPOSE 80

 

這里的每一個作為一個控制說明。分別說明了基礎鏡像,作者,郵箱,運行命令和向外公布的端口。

當然其還有如CMD,ENTRYPOINT,WORKDIR等等的標記,用於構建Dockerfile。#表示注釋

其中run的命令在有時候需要寫成如下格式(exec格式的RUN指令):

RUN ["apt-get", "install","-y","nginx"]

進行保存后,在該路徑下執行命令:

docker build -t="jamtur01/static_web:v1" .

進行在該路徑下構建鏡像,每一步會形成一個新的鏡像,中途失敗,下次會沖上次失敗的地方開始(鏡像堆疊效果)。

使用docker history + 鏡像可以查看堆疊過程。

以上構建代碼指明了用戶名,倉庫名,標簽。

另外,也可以在git倉庫中構建鏡像。

 

Docker運行nginx

在構建一個nginx鏡像成功以后,通過以下命令,進行端口映射,然后創建容器:以下代碼使用了地址加隨機端口的方式,進行了映射。當然還有其它各種映射方案。

sudo docker run -d -p 127.0.0.1::80 --name static jm/static_web_1 nginx -g "daemon off;"

通過以下查看端口映射情況(都可):

docker ps -l 
docker port + ID + 被映射端口

  

上傳鏡像

使用:docker push username/image

可能需要登錄:

docker login命令即可

 

刪除鏡像

使用docker rmi +鏡像即可


免責聲明!

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



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