1. 程式人生 > >史上最全面的Docker構建工具教程

史上最全面的Docker構建工具教程

onf -name engine .json usr art 倉庫 version 地址

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

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

1.Docker安裝

1.1 檢查

Docker 要求 CentOS 系統的內核版本高於 3.10 ,可以通過 uname -r 命令查看你當前的內核版本。

技術分享圖片

如果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運行的ID,/usr/share/nginx/html是容器內Nginx的首頁默認路徑。

技術分享圖片

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

技術分享圖片

2.8 停止Docker容器
docker stop ID

技術分享圖片

刷新瀏覽器,訪問提示無法連接。

2.9 保存容器內更改

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

技術分享圖片

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

docker commit -m 'fun' aaef9a68525a nginx-fun
  • -a ‘ author‘:作者名
  • -m ‘fun‘:是說明文字;
  • aaef9a68525a:容器ID,通過ps命令獲取;
  • nginx-fun:新生成的image鏡像名稱;

然後查看現有鏡像:

技術分享圖片

發現新生成了一個nginx-fun鏡像。

2.10 刪除容器

雖然有些容器已經停止了,但是還存有信息,可以通過docker ps -a查看,再通過docker rm [CONTAINER ID]刪除。

技術分享圖片

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 ubuntu
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的每一行都會產生一個新層(新ID),比如:

技術分享圖片

已經存在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(註冊後使用)

史上最全面的Docker構建工具教程