1. 程式人生 > >Docker:實戰操作--安裝與基礎操作

Docker:實戰操作--安裝與基礎操作


Docker出現已經有很長的時間了,期間版本也進行了很多的變化,不同的版本一些命令的差異,功能差異在開始之前我們需要額外注意Docker的版本號.
由於CentOS 6.X系統版本問題只能執行Docker 1.7,CentOS7以及以上的版本支援更高Docker版本.
讀者可以採取升級系統版本的方式安裝更高版本的Docker,但是這樣做的話具有較高的風險,確保機器已經備份.
所以Docker系列文章採取Docker的版本為1.7.雖然比較老缺失了一些新的特性,但是總體而言基本滿足了一些業務場景的需要.

Docker 安裝

升級核心

使用uname -sr

檢視自己的核心版本,如果低於Docker指定版本3.10,那麼需要升級.
請閱覽Linux 核心升級步驟文章.

源安裝

確保我們安裝了epel源與elrepo源

(ELRepo)[https://elrepo.org/tiki/tiki-index.php]

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm

(EPEL)[https://fedoraproject.org/wiki/EPEL]

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

安裝docker

sudo yum -y install docker-io

執行測試

sudo docker run hello-world

....

Hello from Docker!
This message shows that your installation appears to be working correctly.

..

當看到上述輸出說明我們可以正常執行.

我們可以通過如下命令檢查相關的container與images.

執行docker命令時,docker 後面可以跟隨一個containerID或者是Container的名稱

docker ps -all #預設只是展示執行的container,展示全部需要加入-all引數
docker images #展示已經下載的映象
docker restart #重啟一個映象名稱

Docker容器操作

定義Dockerfile

Dockerfile 定義了容器中的配置,例如,埠對映關係,磁碟驅動等等.

先從一個官方的示例開始:

首先需要準備三個檔案:
1.app.py 實際提供服務python程式碼檔案

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

2.Dockerfile 定義一個安裝的配置檔案

# 選取官方Python映象作為父映象
FROM python:2.7-slim

# 設定工作目錄
WORKDIR /app

# 複製當前目錄的內容到/app目錄
ADD . /app

#執行安裝requirements中的Python所需的依賴檔案
RUN pip install --trusted-host pypi.python.org -r requirements.txt

#暴露80埠
EXPOSE 80

#定義環境變數
ENV NAME World

# 當容器啟動時執行如下命令
CMD ["python", "app.py"]

3.requirements.txt 指定app.py所需的依賴包

Flask
Redis

構建APP

構建映象,-t打tag, -f指定Dockerfile,最後指定構建的路徑

sudo docker build -t pt -f ./Dockerfile .

sudo docker images #顯示所有的構建映象

執行APP

-p暴露埠宿主機4000的埠對應容器80的埠

sudo docker run -p 4000:80 pt

 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

10.0.128.3 - - [27/Jun/2018 09:05:04] "GET / HTTP/1.1" 200 -
10.0.128.3 - - [27/Jun/2018 09:05:05] "GET /favicon.ico HTTP/1.1" 404 -

為映象打標記

推薦為映象tag的格式:

sudo docker tag image username/repository:tag

所以我們需要為映象打入tag

sudo docker tag pt coderliu/test:test

推送映象

我們可以推送映象到Registry,Registry就是一組倉庫的集合,一個倉庫(repository)就是一組映象(image)的集合.
Docker官方提供了DockerHub用於儲存我們的倉庫,與GitHub類似,但是DockerHub不儲存程式碼.

在推送映象之前我們需要確保登入了DockerHub的賬戶.使用如下命令進行登入.

sudo docker login

推送映象至DockerHub.

sudo docker push coderliu/test:test

執行run命令,docker會自動拉取映象.

docker run -p 4000:80  coderliu/test:test

容器資料管理

Data Volume

  • Volume在容器初始化的時候被建立
  • Volume可以被多個容器重用和共享
  • Volume獨立存在,當容器被刪除以後Volume還是會被儲存

定位容器當中的Volume

sudo docker inspect 

"Volumes": {
    "/webapp": "/var/lib/docker/volumes/fac362...80535"
},
"VolumesRW": {
    "/webapp": true
}

掛載宿主機的目錄到容器

將當前的目錄的test目錄掛載到容器中/test目錄.如果掛載目錄中的內容發生變化我們可以在相應的掛載容器內檢測變化.

sudo docker run -v ./test:/test ubuntu 

除此之外我們可以單獨建一個Volume容器,然後其他容器可以引用依賴的Volume.

sudo docker create -v /test --name u1  ubuntu

sudo docker run --vloume-from u1  --name u2 ubuntu #u2實際引用是u1的volume

sudo docker run --vloume-from u2  --name u3 ubuntu # u3實際引用是u1的volume

通過上述內容我們可以實現容器內容的遷移或者備份.

Docker網路管理

建立一個容器並對映埠到宿主機

當執行容器的時候-P可以指定埠的對映規則,-P HOST_PORT:CONTAINER_PORT.預設對映到隨機的短暫埠範圍.

sudo docker run -d -P pt python app.py

容器之間的連線

容器之間通訊依賴容器的名稱, 所有要在建立容器間通訊時要使用--name指定容器的名稱.

首先建立一個名為pt的容器

sudo docker run -d --name pt pt python app.py

然後使用–link連線第一個名為pt的容器, --link <name or id>:alias alias是連線的名稱

sudo docker run -t -i --rm --link pt  --name web training/webapp /bin/bash

這樣web容器就可以和pt容器在不暴露任何埠的情況下進行通訊.
這時env會發生改變,會多出如下的配置:

PT_NAME=/web/pt
PT_PORT_80_TCP=tcp://172.17.0.13:80
PT_PORT_80_TCP_PORT=80
PT_PORT_80_TCP_ADDR=172.17.0.13
PT_PORT=tcp://172.17.0.13:80

這些配置主要是用於容器當中的應用去獲取這些配置資訊,但需要注意當源容器(pt)重啟後這些變數不會自動更新.
/etc/hosts檔案也會發生改變,主要是路由的相關設定.

$ cat /etc/hosts
...
172.17.0.28 pt 99df4bcd9072

我們會看到容器的名稱以及容器ID對映到了真實的IP,這裡如果設定了alisa也會對映到對應的IP.
與環境變數不同的是當源容器重啟後host會自動進行更新.

2
2

1

2

2

2