上篇在這裏 docker 入門上篇html
本文主要記錄:前端
咱們開始使用的鏡像都是別人製做好的,這些鏡像能夠用來建立多個不一樣的實例容器,可是不能夠修改鏡像自己,因此當咱們想去定製本身的鏡像時,須要本身建立一個新的鏡像。建立鏡像的方式有兩種。node
前面說到鏡像自己是不能夠修改的,因此沒辦法直接在鏡像上作定製,可是容器是能夠修改的,咱們能夠在容器上作一些本身須要的定製,而後再將容器反轉爲鏡像,這種操做是能夠的,用一張圖表示:mysql
要注意的是,容器反轉成的鏡像並非覆蓋源鏡像,而是建立了一個新的鏡像(不要被圖誤導)。nginx
來查看下當前本地的鏡像:git
如今咱們就來定製一個 centos 的鏡像,首先建立一個新容器:github
docker run -it --name=aa centos /bin/bash
複製代碼
建立完成進入容器,咱們要拿這個容器生成一個鏡像,爲了與源鏡像區分開,因此咱們來作一點定製,只是簡單示範下,好比發現容器裏默認沒有 vim
工具,因此使用 yum install vim
來安裝一下 vim
:redis
安裝完 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 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。它的格式是這樣的:
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 條指令,關鍵詞分別是:FROM
、ADD
、LABEL
和 CMD
,每一條指令構建一層,每條指令後的內容就是描述該層應當如何構建。
Dockerfile 文件的指令有不少,推薦看菜鳥教程的文檔,我主要來介紹一下使用 Dockerfile 的過程。
接下來咱們使用 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 項目的鏡像。
首先咱們要有一個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 run
命令,這在服務少的時候是徹底可行的,可是當一個業務須要不少的容器服務時,好比同時須要使用 node鏡像,mysql鏡像,nginx鏡像和redis鏡像等,此時你就得敲各個容器的啓動參數,環境變量,容器命名等等一系列的操做,至關繁瑣。而 docker-compose 的出現,就是解決了這一痛點,它經過一個配置文件來管理多個Docker容器,只需一個命令既可啓動多容器服務。
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.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
:指定多容器服務,這裏指定了兩個容器服務,分別是 mongo
和 redis
,注意這只是名字;image
:指定容器運行的鏡像,不指定版本時默認最新版;restart
:重啓容器,有4種狀況
container_name
:指定自定義容器的名稱,而不是隨機生成的名稱;environment
:添加環境變量;ports
:端口映射,宿主機端口 : 容器端口;volumes
:數據卷掛載,宿主機目錄 : 容器目錄總的來講,此描述文件定義了兩個容器服務,一個是mongodb
數據庫的,一個是redis
的,分別對應services下的mongo
和 redis
,如今來運行這個文件,在這個文件所在的目錄下運行:
docker-compose up
複製代碼
此時兩個容器就被建立好了。能夠看到有了 Compose 配置文件後,只須要一個命令便可建立並啓動全部服務,極大簡化了操做。在實際工做中,當須要多個容器相互配合來完成某項任務的時候,就應該考慮使用 docker-compose 了。
關於 docker的實踐,仍是很欠缺,我還學的動🤣,就這樣吧~