Docker使用手冊

weixin_33968104發表於2017-12-13

學習途徑

  • docker官網教程(學習一樣新東西最快的方法是去看官方文件,講解的清楚,教程簡單,但是包括的面十分的廣,只記錄自己覺得有用的命令,詳細請去官網檢視Docker start)
  • 在docker的學習過程中我也其中也發現一篇很好的教程,簡潔明瞭,我也在這裡學到了很多,也摘錄總結在了這裡,推薦大家去Docker--從入門到實踐進行學習。也可以fork那個專案下來進行貢獻。如果網速有問題可以docker一個,直接本地訪問(教程提供的方法,我只是搬運一下)
$ docker pull dockerpracticecn/docker_practice

$ docker run -it --rm -p 4000:80 dockerpracticecn/docker_practice

訪問127.0.0.1:4000即可

手冊內容

Docker的安裝(老規矩)

普通安裝方式

sudo apt-get update

sudo apt-get install docker.io


但是上面的下載的版本會比較低,所以建議用下面這種方式

sudo apt-get install curl
curl -sSL https://get.docker.com/ | sh

下載完畢啟動Docker的守護程式

sudo service docker start

檢查Docker是否安裝成功(這是執行了一個容器,後面會有解釋)

sduo docker run hello-world

如果最終提示Hello from Docker! 如圖所示則表明docker安裝成功


3413627-09b427da2cc99cd6.png
安裝成功提示

Docker試水(初級篇)

10分鐘小任務認識Docker
  • 檢視版本號

docker version

3413627-02579717c1571795.png
版本號
  • 查詢映象 (映象的全稱是 <username>/<repository>)

docker search tutorial

或者可以嘗試

docker search ubuntu

  • 下載映象

docker pull learn/tutorial

  • 用docker run來建立和執行docker容器(docker可以建立容器並在容器中執行指定的命令)

docker run learn/tutorial echo "hello world"

  • 檢視所有容器(加上 -l 可以檢視最新建立的容器)

docker ps

  • 執行並修改容器(給原容器安裝ping)

docker run learn/tutorial apt-get install -y ping

  • 通過docker ps -l找出安裝過ping包的容器的ID號(-l 是last,找出最新建立的容器)

docker ps -l

3413627-60f557445ab73a25.png
檢視容器
  • 將安裝過ping包的容器提交為新的映象,這時會返回一個新的ID便是新生成的映象的ID(意思是把容器打包成映象,因為平時都是把映象開啟變成容器,這裡相當於我們對容器進行了修改,想讓更多的人來用,所以我們把我們修改後的容器變成了映象。映象易於傳播,但是容器不行,)

docker commit {containId} {new image name}
docker commit 09c2e9353f01 yugougou/ping

  • 基於新的映象建立容器並在容器中執行 ping www.google.com這條指令(新映象要使用全名 yugougou/ping)

docker run yugougou/ping ping www.google.com

  • 查詢容器資訊

docker ps 查詢所有執行的容器

docker inspect a102 檢視單個容器的資訊(根據docker ps列出的容器名,選取前三四個字元即可)

  • 新映象上傳倉庫

docker images 查詢本機的映象列表

查詢結果中有yugoguou/image這個映象


3413627-d027fb14bb26e377.png
查詢結果

所以把映象推送到Docker官倉(這裡有個許可權的要求,要求你要在docker hub上有註冊過 並輸入使用者名稱密碼才可以進行上傳)

docker push yugougou/ping

Docker試水 中級篇

建立映象

首先說明一下 docker中有幾個比較重要的概念,『映象』,『映象標籤』,『容器』,『映象倉庫』,『映象倉庫源』。我簡單說下自己的理解。

映象就是一個模子,我們可以通過這個模子(映象)來建立成品(容器),相同的模子(映象)建立的成品(容器)都是一樣的,而且不同的模子(映象)都是有編號(映象標籤)的。我們可以把我們的模子(映象)放存放到倉庫(映象倉庫)中,這樣其他人也可以用。而且呢,倉庫(映象倉庫)一般都是放在一個大的廠子(映象倉庫源)裡來管理的,以此保證我們的模子(映象)不會因為太多而管理混亂。
所以總結一下就是:我們可以在這個工廠(映象倉庫源)的倉庫(映象倉庫)中根據標籤(映象標籤)拿到我們需要的模子(映象),來製作生成我們的成品(容器)。
比如我在生成好自己的映象並且想要push到映象倉庫的時候,就可以通過地址來看清這幾者的關係


docker push index.alauda.cn/alaudaorg/zpyuregis:syncimagealauda


index.docker.io       /yugougou/get-started1    :zpyutestsync
  
 REGISTORY             REPOSITORY                TAG

index.docker.io對應映象源
/yugougou/get-started1 對應映象倉庫
:zpyutestsync 對應映象標籤

這樣我就把自己的映象push到了dockerhub中使用者名稱為yugougou的get-started1的倉庫中,而且為了標識清楚這個映象,我給這個映象起的一個名字就是zpyutestsync.


相信通過以上的詳細介紹你應該還是沒有明白這些概念。。。。,如果真的不明白請再看一遍,如果真的還是不明白,就請動手敲一下程式碼,接下來我就教大家來建立映象,啟動一個服務,這樣應該就會更好的理解了。
現在我們知道了映象與容器的關係,知道了容器是由映象run起來的,那麼映象是怎麼來的呢,我們可不可以擁有自己的映象呢,當然可以,通過dockerfile我們就可以來搭建自己的映象了,我們先建立一下三個檔案:

Dockerfile

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

requirements.txt

Flask
Redis

app.py

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)

建立app(注意有個點)

docker build -t friendlyhello .

找到新建的映象

$ docker images

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea39

跑起來

docker run -d -p 4000:80 friendlyhello

訪問http://localhost:4000即可,這樣你就有了一個flask框架的小的web應用程式了,真是TM的吃了一鯨,對的,就是這麼快。好的這個過程我們來慢慢分解一下,當然需要你有一些python開發的基礎。
先說一下這裡我們用到的幾個檔案,Dockerfile、requirements.txt、app.py,其實裡面與映象構建相關的只有Dockerfile,另外兩個檔案只是用來讓這個demo更炫酷一些而已,其實一個Dockerfile就完全可以製作一個映象了。我們看下Dockerfile裡的內容:

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

其實我想如果你英文稍微好一些,應該大概能明白是什麼意思,FROM的作用就是說我要做的這個映象是基於哪個基礎映象的,這裡我們的映象是基於python:2.7-slim這個基礎映象的,所以我們這個映象裡生來就有python的環境啦。


3413627-0a769ecc5e2dc893.png
看 我沒騙你吧

WORKDIR是說我的工作目錄在哪裡


3413627-ad9c7a9307088610.png
image.png

ADD的作用是將現在所在目錄下的所有內容複製到當前工作目錄下(比如現在的app/)

CMD的意思是說當這個容器準備好了,就執行這個命令,也就是

python app.py

恩 有了這些基本內容你就建立了一個映象,並且已經把它run起來了,恭喜你呀


分享映象

自己好不容易建立了一個映象,想分享一下(就是為了演示昂 這種小破映象很難會有人真的去分享),腫麼辦。 好辦!這裡有個儲存映象的地方,就像github一樣,你可以在這上傳你的映象,也可以去下載別人的映象,他就是docker hub,到這裡註冊個賬號,繼續下面的步驟吧。

登入

docker login

打標籤

docker tag image username/repository:tag
舉個例子
docker tag image yugougou/get-started:part2
這裡的於狗狗是你的使用者名稱,get-started是倉庫名

公佈映象

docker push username/repository:tag
例如
docker push yugougou/get-started:part2

測試(拉一把 看看能不能跑起來)

docker run -p 4000:80 username/repository:tag
例如一個
docker run -p 4000:80 yugougou/get-started:part2

如果能成功跑起來,那就沒什麼問題了,恭喜你已經學會簡單使用Docker了。

Docker編排工具 Compose

docker對compose的定義就是一種定義和執行多容器應用的工具
(Compose is a tool for defining and running multi-container Docker applications)
說大白話就是,上面我們們做的那個破映象根本不會有人來用,因為功能單一,不對,因為基本上沒什麼功能,但是如果要是想要玩個大的,做個功能多的映象,比如我們要自己弄一個容器化的Gitlab,Gitlab肯定是要依靠資料庫的吧,而且也需要個快取redis,那是不是要一個容器一個容器的慢慢的啟動呢,感覺有點麻煩呢,而且如果是稍微大點的容器化平臺的公司,可能要管理成千上萬個容器,要是需要一個一個手動啟停的話,。。。。不敢想。於是docker給我們們一個這樣的工具,docker-compose。
大家先建立一個檔案,docker-compose.yaml,恩,這是一個yaml檔案,yaml檔案是一個這樣的檔案,這是阮一峰的教程,可以看一下。

postgresql:
  image: sameersbn/postgresql:9.4-12
  environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production

redis:
  image: sameersbn/redis:latest

gitlab:
  image: sameersbn/gitlab:8.4.4
  links:
    - redis:redisio
    - postgresql:postgresql
  ports:
    - "18008:80"
    - "18009:22"
  environment:
    - GITLAB_PORT=18008
    - GITLAB_SSH_PORT=18009
    - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphaumeric-srting

這個是gitlab的docker-compose檔案,只要一行程式碼,就能讓你擁有一個gitlab,

docker-compose up -d

這樣就會根據compose的內容去啟動容器,會先啟動postgresql,redis和gitlab,然後就可以去訪問18008這個埠了(當然這個埠你那裡可以改成你自己的埠),嗯嗯,好好玩吧

未完待續。。。

相關文章