docker 入門下篇

上篇在這裏 docker 入門上篇html

本文主要記錄:前端

  • 建立 docker 鏡像
  • docker-compose 的使用

建立鏡像

咱們開始使用的鏡像都是別人製做好的,這些鏡像能夠用來建立多個不一樣的實例容器,可是不能夠修改鏡像自己,因此當咱們想去定製本身的鏡像時,須要本身建立一個新的鏡像。建立鏡像的方式有兩種。node

使用容器製做鏡像

前面說到鏡像自己是不能夠修改的,因此沒辦法直接在鏡像上作定製,可是容器是能夠修改的,咱們能夠在容器上作一些本身須要的定製,而後再將容器反轉爲鏡像,這種操做是能夠的,用一張圖表示:mysql

要注意的是,容器反轉成的鏡像並非覆蓋源鏡像,而是建立了一個新的鏡像(不要被圖誤導)。nginx

來查看下當前本地的鏡像:git

如今咱們就來定製一個 centos 的鏡像,首先建立一個新容器:github

docker run -it --name=aa centos /bin/bash
複製代碼

建立完成進入容器,咱們要拿這個容器生成一個鏡像,爲了與源鏡像區分開,因此咱們來作一點定製,只是簡單示範下,好比發現容器裏默認沒有 vim 工具,因此使用 yum install vim 來安裝一下 vimredis

安裝完 vim 也至關於作了一個小定製,如今就將容器轉換爲鏡像,使用命令:sql

docker commit 容器ID 鏡像名稱:版本號
複製代碼

操做以下:mongodb

如圖,拿到容器的 id 後便可建立新的鏡像。有個小細節就是當咱們使用容器 id 時,能夠不用輸入完整的 id,只要前幾位就好了。如今咱們建立好了新的鏡像 my_centos,爲了驗證可用性,咱們用它來建立一個新的容器:

docker run -it --name=bb my_centos:1.0 /bin/bash
複製代碼

建立完成後使用 docker ps 來驗證:

能夠看到 bb 容器已經存在,並且先前的 aa 容器已經不在了,這說明當容器轉換爲鏡像後,容器自己將刪除。

另外,還記得咱們以前在 aa 容器上作的定製嘛,咱們安裝了 vim 工具,如今咱們在 bb 容器上使用 vim 命令後,發現是有這個工具的。

這說明定製生效。習慣用一張圖來表示流程:

以上就是使用容器建立鏡像的過程。

使用 Dockerfile 建立鏡像

建立鏡像最經常使用的方式就是使用 Dockerfile。Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。它的格式是這樣的:

FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20191001"

CMD ["/bin/bash"]
複製代碼

這是 centos 鏡像的 Dockerfile 文件,它有 4 條指令,關鍵詞分別是:FROMADDLABELCMD,每一條指令構建一層,每條指令後的內容就是描述該層應當如何構建。

Dockerfile 文件的指令有不少,推薦看菜鳥教程的文檔,我主要來介紹一下使用 Dockerfile 的過程。

使用 Dockerfile 建立 centos 鏡像

接下來咱們使用 Dockerfile 方式來定製一個本身的 centos 鏡像。

建立一個新目錄,並在目錄中新建 Dockerfile 文件:

// 目錄名和文件名都隨意

mkdir docker-files
cd docker-files
touch centos_dockerfile
複製代碼

centos_dockerfile 中輸入如下內容並保存:

FROM centos:7
MAINTAINER aaa
RUN yum install -y vim
WORKDIR /root
CMD /bin/bash
複製代碼

來逐行解釋一下這個 Dockerfile 文件:

  • FROM centos:7:表示基礎鏡像使用 centos:7 這個版本。若是本地已有這個鏡像就直接使用,若是沒有會先下載到本地;
  • MAINTAINER aaa:做者名;
  • RUN yum install -y vim:運行安裝 vim 的命令,加上 -y 參數是由於安裝vim過程當中會有確認步驟;
  • WORKDIR /root:設置工做目錄,建立出來的容器進入時,默認所在的目錄;
  • CMD /bin/bash:啓動容器時默認執行的命令。

用到的指令雖然很少,但已經夠咱們建立一個新的鏡像了,在 docker-files 目錄中執行命令:

docker build -f ./centos_dockerfile -t centos_with_vim:1 .
複製代碼

注意命令最後還有一個 .,它是上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(好比複製),docker build 命令得知這個路徑後,會將路徑下的全部內容打包。使用 . 就是將當前路徑指定爲上下文路徑,通常不要放無用的東西在上下文路徑中。

-f 參數後面接的是 Dockerfile 文件,-t 參數後面接的是要建立的鏡像的名稱或加上版本。

執行命令時:

能夠看到會根據 Dockerfile 文件中的指令而一層層地去構建鏡像,完成後使用 docker images 能夠查看構建出來的鏡像:

如今來使用這個新鏡像去建立容器:

docker run -it --name=cc centos_with_vim:1 /bin/bash
複製代碼

建立完成進入容器後,首先驗證了工做目錄確實是 /root,而後 vim 工具也是存在的,這些都是咱們在 Dockerfile 中配置好的,爲了對比,能夠直接建立一個基於 centos:7 源鏡像的容器:

說明咱們使用 Dockerfile 方式建立特定鏡像成功。

使用 Dockerfile 建立 koa 項目鏡像

拿個咱們前端熟悉的東西來試試 Dockerfile,來建立一個 koa 項目的鏡像。

首先咱們要有一個koa項目,這個就作一個簡單的demo就行了,好比個人:

app.js 內容:

const Koa = require('koa')
const app = new Koa()

app.use(async ctx => {
    ctx.body = 'hello Docker!'
})

app.listen(3000)
複製代碼

package.json 內容:

{
  "name": "koa-demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "koa": "^2.11.0"
  }
}
複製代碼

Dockerfile 就是以前說的配置文件,直接命名爲 Dockerfile 時,就不須要加 -f 參數指定,它的內容是:

# 基礎鏡像指定爲 node 鏡像
FROM node:latest
# 指定做者信息,以前用的是 MAINTAINER,但推薦用 LABEL,格式 LABEL <key>=<value> ...
LABEL maintainer="pingzi"
# 移動當前目錄下面的文件到app目錄下
ADD . /app/
# 容器工做目錄爲 /app
WORKDIR /app
# 安裝依賴
RUN npm install
# 暴露3000端口
EXPOSE 3000
# 執行 npm start
CMD ["npm", "start"]
複製代碼

還有一個 .dockerignore 文件,它的做用跟 .gitignore 相似,指定的內容就不會被打包到鏡像中,這裏在網上找的一分內容:

# Logs
logs
*.log
npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history
.idea
.node_modules
node_modules
.vscode
複製代碼

好了齊活,如今來建立鏡像,還記得建立鏡像的命令嗎?在當前目錄下執行:

docker build -t koa_image .
複製代碼

有了鏡像後,能夠建立容器啦,執行:

docker run -d --name=koa_demo -p 9000:3000 koa_image
複製代碼

不出意外的話,此時在瀏覽器中就能夠訪問到啦~

到這,Dockerfile 的一些基本概念已經說完了,說的比較淺顯,還需多實踐啊~

docker-compose

docker-compose 是編排容器的工具,做用是可使用一條命令來定義和運行多容器。

咱們知道每當開啓一個容器服務時,都須要執行 docker run 命令,這在服務少的時候是徹底可行的,可是當一個業務須要不少的容器服務時,好比同時須要使用 node鏡像,mysql鏡像,nginx鏡像和redis鏡像等,此時你就得敲各個容器的啓動參數,環境變量,容器命名等等一系列的操做,至關繁瑣。而 docker-compose 的出現,就是解決了這一痛點,它經過一個配置文件來管理多個Docker容器,只需一個命令既可啓動多容器服務。

安裝 docker-compose

Linux 上安裝:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
複製代碼

添加可執行權限

sudo chmod +x /usr/local/bin/docker-compose
複製代碼

檢查版本

docker-compose --version
複製代碼

另外,在 Mac 或者 Windows 上安裝docekr客戶端的,是默認包含Compose的,因此不須要單獨安裝。

簡單試用 docker-compose

docker-compose 是經過配置文件來啓動服務的,咱們須要編寫 docker-compose.yml 文件,這裏我寫了一個簡單的例子:

version: '3'
services:
  mongo:
    image: mongo
    restart: always
    container_name: 'mongo-test'
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - 27018:27017
    volumes:
      - /composetest/mongodb:/data/db
  redis:
    image: redis
    container_name: 'redis-test'
    ports:
      - 6380:6379
複製代碼

建立一個新目錄 /composetest(目錄名字隨意),而後在目錄中建立 docker-compose.yml 文件,文件中輸入上面內容,保存,注意縮進。

如今來看下這個文件描述了什麼:

  • version:指定本 yml 依從的 compose 哪一個版本制定的,這裏是版本 3;
  • services:指定多容器服務,這裏指定了兩個容器服務,分別是 mongoredis,注意這只是名字;
  • image:指定容器運行的鏡像,不指定版本時默認最新版;
  • restart:重啓容器,有4種狀況
    • "no":是默認的重啓策略,在任何狀況下都不會重啓容器
    • always:容器老是從新啓動
    • on-failure:在容器非正常退出時(退出狀態非0),纔會重啓容器
    • unless-stopped:在容器退出時老是重啓容器,可是不考慮在Docker守護進程啓動時就已經中止了的容器;
  • container_name:指定自定義容器的名稱,而不是隨機生成的名稱;
  • environment:添加環境變量;
  • ports:端口映射,宿主機端口 : 容器端口;
  • volumes:數據卷掛載,宿主機目錄 : 容器目錄

總的來講,此描述文件定義了兩個容器服務,一個是mongodb數據庫的,一個是redis的,分別對應services下的mongoredis,如今來運行這個文件,在這個文件所在的目錄下運行:

docker-compose up
複製代碼

此時兩個容器就被建立好了。能夠看到有了 Compose 配置文件後,只須要一個命令便可建立並啓動全部服務,極大簡化了操做。在實際工做中,當須要多個容器相互配合來完成某項任務的時候,就應該考慮使用 docker-compose 了。

結尾

關於 docker的實踐,仍是很欠缺,我還學的動🤣,就這樣吧~

相關文章
相關標籤/搜索