1. 程式人生 > >Docker構建工具使用超詳細全面教程

Docker構建工具使用超詳細全面教程

Docker 是一個開源的應用容器引擎,基於 Go 語言] 並遵從Apache2.0協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。

Docker有免費的CE社群版和收費的EE企業版,本文安裝的是CE版本。

1.Docker安裝

1.1 檢查

如果CentOS版本是7以上並且為64位,那是完全沒用問題的。

1.2 安裝

安裝一些必要系統工具:

sudo yum install -y yum-utils device-mapper-persistent-data
lvm2

新增軟體源資訊:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新 yum 快取:

sudo yum makecache fast

安裝 Docker-ce:

sudo yum -y install docker-ce

啟動 Docker 後臺服務

sudo systemctl start docker

測試執行 hello-world

docker run hello-world

由於本地沒有hello-world這個映象,所以會下載一個hello-world的映象,並在容器內執行。

1.3 映象加速

例如在使用Maven時我們一般會配置阿里雲國內映象加速,在使用Docker時也是如此。我使用的是網易的映象地址:http://hub-mirror.c.163.com

新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。

請在該配置檔案中加入(沒有該檔案的話,請先建一個):

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

1.4 解除安裝Docker

執行以下命令來刪除 Docker CE:

$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker

2.實戰Nginx

2.1 查詢Docker Hub上的 nginx 映象
docker search nginx

2.2 拉取官方映象
docker pull nginx
2.3 拉取成功檢視本地映象
docker images nginx

2.4 啟動Nginx伺服器
docker run -p 8080:80 -d nginx
  • -p 8080:80:將本機8080埠對映到Nginx容器的80埠
  • -d:後臺啟動
2.5 檢視Docker當前執行
docker ps

2.6 訪問測試

2.7 拷貝本地檔案到容器內

把當前目錄下的index.html檔案拷貝到容器內,替換Nginx的預設首頁。

docker cp index.html dbfc48660aeb://usr/share/nginx/html

dbfc48660aeb是容器內Nginx執行的>

再次訪問瀏覽器,可以看到首頁已經更換為我們自定義的檔案內容。

2.8 停止Docker容器
docker stop >

重新整理瀏覽器,訪問提示無法連線。

2.9 儲存容器內更改

再次執行Nginx容器,訪問首頁,發現更改的首頁又復原了。如圖:

這是因為在更改後沒有提交儲存導致的。也就是需要下面這句命令:

docker commit -m 'fun' aaef9a68525a nginx-fun
  • -a ' author':作者名
  • -m 'fun':是說明文字;
  • aaef9a68525a:容器>
  • nginx-fun:新生成的image映象名稱;

然後檢視現有映象:

發現新生成了一個nginx-fun映象。

2.10 刪除容器

雖然有些容器已經停止了,但是還存有資訊,可以通過docker ps -a檢視,再通過docker rm [CONTAINER >刪除。

3.Docker命令小結

命令 用途
docker pull 獲取image
docker build 建立image
docker images 列出image
docker run 執行container
docker ps 列出container
docker rm 刪除container
docker rmi 刪除image
docker cp 在host和container之間拷貝檔案
docker commit 儲存改動為新的image

4.DockerFile建立映象

建立檔案Dockerfile檔案,該檔名不可更改

vi Dockerfile

寫入文字

FROM alpine:latest
MAINTAINER smilevt
CMD echo "Hello Docker!

儲存退出

docker build命令用於使用 Dockerfile 建立映象,

docker build -t hello_docker .
  • -t : 映象的名字及標籤,通常 name:tag 或者 name
  • path : .點代表當前路徑下的所有檔案。

執行結果:

檢視是否成功建立映象並執行

5.Dockerfile安裝Nginx

再次新建資料夾並新建Dockerfile檔案,寫入以下內容;

FROM 
MAINTAINER anthor
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80

簡單說一下文字含義:從(FROM)ubuntu容器中執行(RUN)3條命令,第一條是修改archive.ubuntu.com為mirrors.ustc.edu.cn國內映象,第二、三條是安裝nginx,然後複製(COPY)index.html到容器內,提供容器進入點(ENTRYPOINT),使nginx在前臺執行,之所以使用陣列是為了隔開命令,最後暴露80埠。

接下來新建index.html檔案,執行build命令建立映象:

docker build -t hello-nginx:tag .

使用run命令啟動該hello-nginx容器:

docker run -p 8080:80 -d hello-nginx:tag

測試訪問host:8080埠如下:

可以看到,Nginx成功啟動,並輸出自定義的index.html。

6.Dockerfile命令小結

命令 用途
FROM base image
RUN 執行命令
ADD 新增檔案
COPY 拷貝檔案
CMD 執行檔案
EXPOSE 暴露埠
WORKDIR 指定路徑
MAINTAINER 維護者
ENV 設定環境
ENTRYPOINT 容器入口
USER 指定使用者
VOLUME mount point

7.映象分層

Dockerfile的每一行都會產生一個新層(新>

已經存在image裡面的層是隻讀的,一旦映象執行為容器之後,就會產生一個新層(RW讀寫),分層的好處就是多個image可以共享相同的層,減少儲存大小。

8.Volume

我們知道,Docker容器中的改動是不會被儲存的,為了能夠儲存(持久化)資料以及共享容器間的資料,Docker提出了Volume的概念。簡單來說,Volume就是目錄或者檔案,它可以繞過預設的聯合檔案系統,而以正常的檔案或者目錄的形式存在於宿主機上。 比如在使用資料庫時就可以使用Volume。

9.Volume操作

說白了,Volume只是-v引數而已。容器和宿主機目錄掛載的三種方式:

1.第一種方式

執行Nginx容器,-d:後臺執行,--name:指定名稱nginx,-v /usr/share/nginx/html:執行容器內部用來訪問網頁的地址,最後的nginx是映象名。

docker run -d --name nginx -v /usr/share/nginx/html nginx

獲取容器/映象的元資料

docker inspect nginx

可以看到宿主機目錄Source和容器內目錄Destination:

繼續檢視宿本機目錄:

注意:如果是mac,則該路徑不是mac上的實際路徑,因為mac上執行docker是還有一層虛擬層,這是docker虛擬層中的路徑,可以在docker中訪問到

2.第二種方式

在啟動Nginx容器時使用-v引數掛載本地目錄到容器目錄

docker run -p 8080:80 --name mynginx -v $PWD:/usr/share/nginx/html -d nginx

這句命令使���PWD環境變數(該變數始終指向當前目錄)將當前目錄掛載到容器/usr/share/nginx/html目錄。

我們訪問主機8080埠

報錯403,因為當前目錄啥也沒有,沒有index.html檔案。在當前目錄新建該html檔案,輸入hello,訪問網頁

3.第三種方式

使用 docker create 建立一個新的容器但不啟動它:

docker create -v $PWD/data:/var/mydata --name data_container ubuntu
  • 宿主機目錄:$PWD/data

  • docker目錄:/var/mydata

  • 容器名:data_container

  • 基礎映象:ubuntu

啟動 ubuntu 容器映象(預設ubuntu基礎映象沒有服務):

docker run -it --volumes-from data_container ubuntu /bin/bash
  • -it: 以互動模式執行容器,併為容器重新分配一個偽輸入終端
  • --volumes-from data_container:以另外一個容器掛載
  • 最後在容器內執行/bin/bash命令

進入到容器控制檯後輸入mount,檢視掛載:

我們在/var/mydata目錄下新建whatever.txt檔案後退出,進入data目錄檢視,可以看到剛剛新建的txt檔案。

10.Registry介紹

Registry 是映象倉庫,我們可以從映象倉庫中拉取一些映象到本地,也可以提交映象到倉庫。

一些術語:

ENGLISH 中文
host 宿主機
image 映象
container 容器
registry 倉庫
daemon 守護程式
client 客戶端

與registry倉庫的互動:

查詢映象

docker search whalesay

拖取映象

docker pull whalesay

推送映象

docker push myname/whalesay

國內的docker映象倉庫:

daoclou

時速雲

aliyun

11.Registry實戰

1.查詢映象

STARS可以理解為點贊數,預設是按照這個排序的。

2.拉取映象

3.檢視映象

可以看到,REPOSITORY是映象名,TAG是預設的latest,正常情況是版本號,這兩個比較重要。

CREATED是建立時間,SIZE是佔用空間的大小。

4.執行映象

5.標記映象

使用docker tag命令標記本地映象,將其歸入某一倉庫。

docker tag docker/whalesay myhaleasy:tag

6.上傳映象

可以使用docker push命令上傳本地映象到倉庫,但是需要註冊登入。

註冊登入地址:https://hub.docker.com

執行登入命令,輸入使用者名稱與密碼即可。

docker login

上傳映象前還需要在Docker官網個人中心建立該映象。

12.Compose多容器應用

Compose 是一個使用者定義和執行多個容器的 Docker 應用程式。在 Compose 中你可以使用 YAML 檔案來配置你的應用服務。然後,只需要一個簡單的命令,就可以建立並啟動你配置的所有服務。

docker-compose 安裝

1.Mac/Windows:

​ 安裝docker的時候附帶安裝了。

2.Linux:

curl https://github.com/docker/compose

Linux安裝

執行命令

curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose

該命令會下載檔案到(>)/usr/local/bin/docker-compose,在下載地址中使用$(uname -s)是獲取 unmae -s 命令的輸出加到路徑中。

下載完成後,可以設定該目錄的許可權為777,意為所有人都可以讀寫該目錄,最後使用 docker-compose --version 檢查是否安裝成功。

13.Compose搭建部落格網站

接下來我們使用docker-compose搭建一個含nginx+ghost+db的部落格網站。

1.準備

首先建立如下目錄結構:

ghost
  - ghost
    - Dockfile
    - config.js
  - nginx
      - nginx.conf
      - Dockfile
  - data
  - docker-compose.yml

每個檔案的具體內容有:

  • ghost/ghost/Dockfile

過時的配置(不使用)

FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368
CMD ["npm","start","--production"]

最新版的官方映象, 把配置檔案改到/var/lib/ghost/content/ ,然後註釋掉了 CMD["npm","start","--production"] 即可。

FROM ghost
COPY ./config.js /var/lib/ghost/content/ 
EXPOSE 2368
  • ghost/ghost/config.js
var path = require('path'),
    config;

config = {
    production: {
        url: 'http://mytestblog.com',
        mail: {},
        database: {
            client: 'mysql',
            connection: {
                host: 'db',
                user: 'ghost',
                password: 'ghost',
                database: 'ghost',
                port: '3306',
                charset: 'utf8'
            },
            debug: false
        },
        paths: {
            contentPath: path.join(process.env.GHOST_CONTENT, '/')
        },
        server: {
            host: '0.0.0.0',
            port: '2368'
        }
    }
};

module.exports = config;
  • ghost/nginx/Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
  • ghost/nginx/nginx.conf
worker_processes 4;
events {worker_connections 1024;}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://ghost-app:2368;
        }
    }
}
  • ghost/docker-compose.yml
version: '2'

networks:
  ghost:
services:
  ghost-app:
    build: ghost
    networks:
      - ghost
    depends_on:
      - db
    ports:
      - "2368:2368"

  nginx:
    build: nginx
    networks:
      - ghost
    depends_on:
      - ghost-app
    ports:
      - "80:80"

  db:
    image: "mysql:5.7.15"
    networks:
      - ghost
    environment:
      MYSQL_ROOT_PASSWORD: mysqlroot
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghost
    volumes:
      - $PWD/data:/var/lib/mysql
    ports:
      - "3306:3306"

此處資料庫相關的配置要和config.js中的配置(user、password)保持一致。

一旦我們為一個服務指定了一個名字(db),它就可以被其它服務所解析。

nginx 中proxy_pass 設定成 http://ghost-app:2368 也是因為在docker-compose.yml 指定了服務是ghost-app。

2.啟動

將所有容器啟動,並以daemon的方式後臺執行。第一次不需要build,因為會自動建立映象。

docke-compose up -d

3.檢視應用

docker-compose ps

因為檔案內容輸入有誤,導致啟動未成功,修改檔案後還需要停止、刪除掉容器再重新構建才行。

4.停止(+)

停止所有容器

docker-compose stop

5.刪除(+)

刪除時需要輸入y手動確認

docker-compose rm

6.構建(+)

非首次執行就需要手動建立映象了

docker-compose build

最後,在ghost目錄下再次啟動!

7.測試

訪問域名進入搭建的部落格網站,可以註冊賬號釋出部落格。

`

關於ghost的使用這裡不做過多介紹。

14.docker-compose.yml常用命令

命令 用途
build 本地建立映象
command 覆蓋預設命令
depends_on 連線容器
ports 暴露埠
volumes
image pull映象
up 啟動服務
stop 停止服務
rm 刪除服務中的各個容器
logs 觀察各個容器的日誌
ps 列出服務相關的容器

6.Docker資源連結

Docker官方英文資源

docker官網:http://www.docker.com

Docker中文資源

Docker中文網站:https://www.docker-cn.com/

Docker安裝手冊:https://docs.docker-cn.com/engine/installation/

Docker 國內映象

網易加速器:http://hub-mirror.c.163.com

官方中國加速器:https://registry.docker-cn.com

ustc的映象:https://docker.mirrors.ustc.edu.cn

daocloud:https://www.daocloud.io/mirror#accelerator-doc(註冊後使用