0. 前言
docker是什么?
docker是用GO語言開發(fā)的應(yīng)用容器引擎,基于容器化,沙箱機(jī)制的應(yīng)用部署技術(shù)??蛇m用于自動(dòng)化測(cè)試、打包,持續(xù)集成和發(fā)布應(yīng)用程序等場景。
值得注意的是,docker現(xiàn)已改名為moby。
docker基于容器化,沙箱機(jī)制,可使你用較少的命令和腳本快速部署應(yīng)用。一次構(gòu)建,多處移植使用。再配合shell等腳本語言,可實(shí)現(xiàn)腳本化一鍵部署。
另外,docker大部分的工作都是依賴命令來執(zhí)行的,簡單易上手。
如火如荼的docker,現(xiàn)已被很多大公司所采用。同時(shí)docker也成為了實(shí)現(xiàn)serverless(無服務(wù)器架構(gòu))服務(wù)的基礎(chǔ)架構(gòu)。包括阿里云,亞馬遜在內(nèi)的云計(jì)算服務(wù)商都采用了docker來打造serverless服務(wù)平臺(tái)。
如此同時(shí),基于docker的微服務(wù)架構(gòu)也如火如荼地出現(xiàn)。
由此可見,docker容器技術(shù)的重要性非同一般。
一,docker的運(yùn)作
docker是沙箱機(jī)制,容器化部署技術(shù),它主要作用在于通過運(yùn)行容器來實(shí)現(xiàn)應(yīng)用部署,而容器基于鏡像運(yùn)行。
簡單地說,就是將你的項(xiàng)目和依賴包(基礎(chǔ)鏡像)打成一個(gè)帶有啟動(dòng)指令的項(xiàng)目鏡像,然后在服務(wù)器創(chuàng)建一個(gè)容器,讓鏡像在容器內(nèi)運(yùn)行,從而實(shí)現(xiàn)項(xiàng)目的部署。
服務(wù)器就是容器的宿主機(jī),docker容器與宿主機(jī)之間是相互隔離的。
它不僅僅可以部署項(xiàng)目,還可以用于數(shù)據(jù)庫搭建,nginx服務(wù)搭建,nodejs、php等編程語言環(huán)境搭建。
二,docker的三個(gè)概念
要學(xué)習(xí)docker,首先要理解它的三個(gè)概念:鏡像(Image)、容器(Container)、倉庫(Repository)。同時(shí)你還需要知道它們之間的相互關(guān)系。
為了方便理解,下面用通俗的話來描述它們。
- 鏡像
docker鏡像是使用Dockerfile腳本,將你的應(yīng)用以及應(yīng)用的依賴包構(gòu)建而成的一個(gè)應(yīng)用包,它通常帶有該應(yīng)用的啟動(dòng)命令。而這些命令會(huì)在容器啟動(dòng)時(shí)被執(zhí)行,也就是說你的應(yīng)用在啟動(dòng)容器時(shí)被啟動(dòng)。
鏡像的創(chuàng)建,需要通過配置Dockerfile腳本,然后執(zhí)行docker build
命令來創(chuàng)建。
舉個(gè)例子:
docker build -t mydocker/node-server:v1 .
簡單解釋下:
后面的 “.” 表示當(dāng)前目錄下。
當(dāng)執(zhí)行docker build命令時(shí),docker會(huì)尋找當(dāng)前目錄下的Dockerfile文件,
并根據(jù)Dockerfile腳本文件里的指令創(chuàng)建docker鏡像
關(guān)于鏡像的知識(shí)后面會(huì)做詳細(xì)講解。
容器
容器是使用docker run --name 容器名 鏡像
命令創(chuàng)建的,獨(dú)立于宿主機(jī)(服務(wù)器)的沙箱,也可以理解為一個(gè)帶有特殊結(jié)構(gòu)的盒子,它在創(chuàng)建時(shí)會(huì)自動(dòng)執(zhí)行鏡像自帶的一些指令,從而實(shí)現(xiàn)該應(yīng)用的運(yùn)行。
狹隘地講,容器的主要作用就在于給鏡像提供運(yùn)行空間和環(huán)境,并執(zhí)行鏡像的指令。倉庫
顧名思義,倉庫是用來存東西的,但不是存容器,而是存儲(chǔ)docker鏡像。你可以把你的docker鏡像通過push命令推送到docker倉庫,然后就可以在任何能使用docker命令的地方通過pull命令把這個(gè)鏡像拉取下來。
三,docker鏡像,容器,倉庫三者關(guān)系
使用docker前,你必須先安裝它。
docker的使用方式主要有docker命令,Dockerfile腳本,以及shell腳本三種。
換句話說,你可以把docker當(dāng)做命令行工具來使用。
有一點(diǎn)上面已經(jīng)講解過,docker是沙箱機(jī)制,容器化部署技術(shù),它主要作用在于通過運(yùn)行容器來實(shí)現(xiàn)應(yīng)用部署,而容器則基于鏡像運(yùn)行。
因此,首先要有鏡像,有了鏡像才能基于鏡像創(chuàng)建容器,才能把鏡像存儲(chǔ)在倉庫。
于是可以這么理解,鏡像是基礎(chǔ),容器是鏡像使用者,倉庫是鏡像的管理員。容器和倉庫都是圍繞著鏡像來運(yùn)作的,是對(duì)鏡像的管理和使用。
另外,鏡像,容器,倉庫都分別有一套自己的docker命令,用于前期的構(gòu)建以及后期的維護(hù)。
四,docker基本開發(fā)流程
基本的開發(fā)流程如下:
- 1,尋找基礎(chǔ)鏡像
- 2,基于基礎(chǔ)鏡像編寫Dockerfile腳本
- 3,根據(jù)Dockerfile腳本創(chuàng)建項(xiàng)目鏡像
- 4,將創(chuàng)建的鏡像推送到docker倉庫 (根據(jù)自身需要,可做可不做)
- 5,基于項(xiàng)目鏡像創(chuàng)建并運(yùn)行docker容器 (實(shí)現(xiàn)最終部署)
這個(gè)流程通常只開發(fā)一次,后期只做簡單的維護(hù)就好。
這是個(gè)基本流程,為什么是基本呢 ? 因?yàn)槠渲袝?huì)穿插著很多細(xì)節(jié),這些細(xì)節(jié)對(duì)后期的維護(hù)極為重要,比如:
- 如何寫shell腳本來執(zhí)行docker命令?
- 如何使用shell腳本+docker命令實(shí)現(xiàn)一鍵部署?
- 如何規(guī)劃測(cè)試環(huán)境腳本?
- 如何規(guī)劃正式環(huán)境腳本
……
另外,有沒有發(fā)現(xiàn)一點(diǎn),基本上所有流程都與鏡像有關(guān)。
五, Dockerfile腳本
經(jīng)過上面的講解你應(yīng)該了解到,基本上大部分的工作都是圍繞著鏡像來做的。
所以,我們首先來學(xué)習(xí)docker鏡像。
而創(chuàng)建鏡像,首先得配置Dockerfile腳本。鏡像是基于Dockerfile腳本來構(gòu)建的。
1,基礎(chǔ)鏡像
在深入探討鏡像的創(chuàng)建、使用和管理之前,我們先來理解一個(gè)概念——基礎(chǔ)鏡像。
docker有這么一種機(jī)制,在構(gòu)建鏡像時(shí),它可以依賴一個(gè)父鏡像作為底層鏡像,與當(dāng)前正要被構(gòu)建的鏡像一起打包,從而構(gòu)建成一個(gè)全新的鏡像。而這個(gè)被用作依賴的父鏡像,就是基礎(chǔ)鏡像。
為什么有這樣的需要呢?
比如,通常我們開發(fā)一個(gè)nodejs應(yīng)用,它不是隨處可運(yùn)行的,它的運(yùn)行需要依賴操作系統(tǒng)環(huán)境和nodejs運(yùn)行環(huán)境。
因此,一個(gè)單純的node項(xiàng)目鏡像是無法運(yùn)行起來的,它需要依賴一個(gè)基礎(chǔ)鏡像,這個(gè)基礎(chǔ)鏡像就是nodejs鏡像,nodejs鏡像內(nèi)包含了操作系統(tǒng)環(huán)境和nodejs環(huán)境。這樣nodejs鏡像+node項(xiàng)目構(gòu)建出來的項(xiàng)目鏡像才能完整地運(yùn)行起來。
因此,在配置項(xiàng)目Dockerfile創(chuàng)建鏡像腳本之前,需要先確立一個(gè)基礎(chǔ)鏡像。
基礎(chǔ)鏡像是如何使用的呢?主要是通過在Dockerfile腳本中使用From命令指定依賴一個(gè)父鏡像(基礎(chǔ)鏡像)。
- 基礎(chǔ)鏡像通常不需要自己創(chuàng)建,docker官方有提供很多基礎(chǔ)鏡像供用戶使用,比如nodejs鏡像,java鏡像,mongodb鏡像,nginx鏡像等等。
- 除了官方提供的,你還可以尋找第三方源提供的基礎(chǔ)鏡像。
關(guān)于Dockerfile,下面會(huì)仔細(xì)講解。
2,Dockerfile腳本構(gòu)成
docker鏡像是通過配置Dockerfile腳本,然后執(zhí)行docker build
命令來創(chuàng)建的。
Dockerfile文件可通過nano Dockerfile
命令或touch Dockerfile
命令來創(chuàng)建。
Dockerfile腳本文件通常放在項(xiàng)目的根目錄下。也可以放在其他文件夾,但執(zhí)行docker build
時(shí)需要指定該文件路徑。
(1)Dockerfile腳本語法和結(jié)構(gòu)
Dockerfile語法由兩部分構(gòu)成,分別是 注釋 和 指令+參數(shù)
使用 “#” 可實(shí)現(xiàn)注釋。
Dockerfile腳本通常分為以下四部分:
- 基礎(chǔ)鏡像信息
- 維護(hù)者信息
- 鏡像操作指令
- 容器啟動(dòng)時(shí)執(zhí)行的指令
(2)Dockerfile腳本案例
下面直接來看個(gè)例子說明,這是我的開源博客后臺(tái)sinn-server的Dockerfile腳本。
如下:
# 基礎(chǔ)鏡像信息
From registry.cn-hangzhou.aliyuncs.com/sessionboy/node:7.5
# 維護(hù)者信息
MAINTAINER sessionboy <postmaster@boyagirl.com>
# 鏡像操作指令
COPY ./ /sinn-server
WORKDIR /sinn-server
RUN npm install
EXPOSE 8080
# 容器啟動(dòng)時(shí)執(zhí)行的指令
ENTRYPOINT ["node","bin/run"]
(3)Dockerfile語法解剖
Dockerfile有十幾條命令可用于創(chuàng)建鏡像,下面根據(jù)四個(gè)不同功能模塊來介紹這些命令。
A—基礎(chǔ)鏡像信息
基礎(chǔ)鏡像信息,只有一個(gè)From指令,指定依賴的基礎(chǔ)鏡像
- From
指定依賴的基礎(chǔ)鏡像,如果不存在就會(huì)從docker官方倉庫Docker Hub尋找
# docker官方鏡像倉庫
# 指定docker官方倉庫的最新版nodejs鏡像作為基礎(chǔ)鏡像
From node:latest
更多配置……
# 第三方鏡像倉庫,比如阿里云的 “https://dev.aliyun.com/search.html ”
# 指定標(biāo)簽為7.5的"registry.cn-hangzhou.aliyuncs.com/sessionboy/node"鏡像作為基礎(chǔ)鏡像
From registry.cn-hangzhou.aliyuncs.com/sessionboy/node:7.5
更多配置……
B—維護(hù)者信息
維護(hù)者信息也只有一個(gè)MAINTAINER指令,用于描述該鏡像的維護(hù)者信息
- MAINTAINER
# MAINTAINER指令
MAINTAINER sessionboy <postmaster@boyagirl.com>
C—鏡像操作指令
鏡像的操作指令有很多個(gè),下面逐一講解。
- COPY
COPY指令用于拷貝宿主機(jī)的源目錄/文件到容器內(nèi)的某個(gè)目錄。接受兩個(gè)參數(shù),源目錄路徑和容器內(nèi)目錄路徑。
# 將 “./”(當(dāng)前目錄) 下的文件拷貝到容器內(nèi)的 “/sinn-server” 目錄
COPY ./ /sinn-server
- ADD
功能和用法與COPY指令基本相同,不同在于使用ADD指令拷貝時(shí),如果拷貝的是壓縮文件,拷貝到容器中時(shí)會(huì)自動(dòng)解壓為目錄。
# 將當(dāng)前/server目錄拷貝到容器內(nèi)的/projects目錄
ADD /server /project
WORKDIR
指定RUN、CMD、ENTRYPOINT 指令的工作目錄RUN
RUN是核心指令,它接受命令作為參數(shù)并用于創(chuàng)建鏡像。命令較多時(shí)可用""換行。
……
RUN ["/bin/bash", "-c", "echo hello"]
RUN rm ./tmp \
npm install
……
- USER
USER命令用于設(shè)置運(yùn)行容器的UID。
# 指定容器的UID為23541
USER 23541
- VOLUME
VOLUME命令用于讓你的容器訪問宿主機(jī)上的目錄。一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等
# 指定容器可訪問宿主機(jī)(服務(wù)器)的“/data”目錄和“/home”目錄
VOLUME ["/data",'"/home"]
ONBUILD
配置當(dāng)所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時(shí),所執(zhí)行的操作指令。ENV
ENV命令用于設(shè)置環(huán)境變量,在容器內(nèi)被腳本或者程序調(diào)用。
# 設(shè)置環(huán)境變量 NODE_ENV 為 production
ENV NODE_ENV production
- EXPOSE
EXPOSE用來指定端口,使容器內(nèi)的應(yīng)用可以通過端口和外界交互。
# 對(duì)外暴露8080端口
EXPOSE 8080
D—容器啟動(dòng)時(shí)執(zhí)行的指令
- CMD
指定啟動(dòng)容器時(shí)執(zhí)行的命令,每個(gè) Dockerfile 只能有一條 CMD 命令,可被 docker run 提供的參數(shù)覆蓋。
# 三種方式
CMD ["executable","param1","param2"] 使用 exec 執(zhí)行,推薦方式
CMD command param1 param2 在 /bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認(rèn)參數(shù);
- ENTRYPOINT
容器啟動(dòng)后執(zhí)行的命令,與CMD命令不同的是,它不會(huì)被 docker run 提供的參數(shù)覆蓋。
# 兩種方式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執(zhí)行)。
(4),案例分析
經(jīng)過上面對(duì)Dockerfile腳本的解剖,相信你已對(duì)Dockerfile有了實(shí)際的了解。
我們接著上面講過的例子,也就是我的開源博客后臺(tái)sinn-server的Dockerfile腳本。
如下:
# 使用From指令指定基礎(chǔ)鏡像為registry.cn-hangzhou.aliyuncs.com/sessionboy/node7.5
From registry.cn-hangzhou.aliyuncs.com/sessionboy/node:7.5
# 使用MAINTAINER指令描述維護(hù)者信息
MAINTAINER sessionboy https://github.com/sessionboy/sinn-server
# 鏡像操作指令
COPY ./ /sinn-server // 把“./”(當(dāng)前目錄)下的所有文件拷貝到容器內(nèi)的“/sinn-server”目錄
WORKDIR /sinn-server // 指定RUN、ENTRYPOINT、CMD指令的工作目錄(容器內(nèi))
RUN npm install // 使用RUN指令,指定執(zhí)行"npm install"命令
EXPOSE 8080 // 對(duì)容器外暴露8080端口
# 容器啟動(dòng)時(shí)執(zhí)行的指令
ENTRYPOINT ["node","bin/run"] // 指定容器啟動(dòng)時(shí)執(zhí)行“node bin/run”命令,啟動(dòng)node應(yīng)用
六,docker鏡像的創(chuàng)建、使用和管理
為了方便操作,docker提供了一套鏡像的操作命令。
1,創(chuàng)建鏡像
鏡像是基于Dockerfile腳本,使用docker build
命令創(chuàng)建的。上面已經(jīng)對(duì)Dockerfile做了詳細(xì)解剖。下面來說說如何使用Dockerfile腳本創(chuàng)建。
語法:
docker build [OPTIONS] PATH
OPTIONS為對(duì)容器的配置項(xiàng),內(nèi)容有點(diǎn)多,可以到這里查看。一般不建議配置,使用默認(rèn)的就好。
PATH為Dockerfile腳本所在的目錄,通常放在項(xiàng)目根目錄下,使用"."表示。
-t 標(biāo)記,用來添加tag,指定新的鏡像信息,比如鏡像名稱,標(biāo)簽。
下面,以sinn-server的腳本為例:
# 使用當(dāng)前目錄的Dockerfile腳本創(chuàng)建名為“registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn”的鏡像,并標(biāo)記為v1(標(biāo)簽,也可以理解為版本號(hào))
docker build -t registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1 .
# 指定使用github.com/creack/docker-firefox的Dockerfile腳本創(chuàng)建鏡像
docker build github.com/creack/docker-firefox
為了方便操作,我們?cè)诟夸浵陆⒁粋€(gè)名為build.sh的shell腳本來執(zhí)行這些命令。如下:
# build.sh
docker build -t registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1 .
下面是執(zhí)行過程:
看到Successfully,說明鏡像已經(jīng)創(chuàng)建成功了。
使用命令docker images
即可查看你本地所有的docker鏡像。
2,本地鏡像管理
命令如下:
- 1,查看鏡像:docker images
# 列出本地所有鏡像
docker images
- 2,刪除鏡像:docker rmi 鏡像
# 刪除鏡像
docker rmi registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn
- 3,鏡像重命名:docker tag 原鏡像tag 新鏡像tag
# 將鏡像registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1重新標(biāo)記為newImages:0.1
docker tag registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1 newImages:0.1
- 4,查看鏡像創(chuàng)建歷史:docker history 鏡像
# 查看鏡像registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn的創(chuàng)建歷史
docker history registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn
- 5,鏡像歸檔:docker save 鏡像
# 將鏡像registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn保存成 sinn_v1.tar 歸檔文件
docker save -o sinn_v1.tar registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn
- 6,基于歸檔文件創(chuàng)建鏡像:docker import 歸檔文件 新鏡像tag
docker import sinn_v1.tar new_sinn:v2
3,遠(yuǎn)程倉庫鏡像管理
命令如下:
- 1,登錄遠(yuǎn)程鏡像倉庫: docker login 用戶信息 倉庫地址
如果未指定鏡像倉庫地址,則默認(rèn)為官方倉庫 Docker Hub
# 登錄到官方Docker Hub倉庫
docker login -u 用戶名 -p 密碼
# 登錄到阿里云docker倉庫
docker login --username=用戶名 registry.cn-hangzhou.aliyuncs.com
- 2,拉取鏡像:docker pull 鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1
- 3,推送鏡像: docker push 鏡像
docker push registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1
- 4,搜索鏡像: docker search 鏡像名
# 從官方Docker Hub倉庫搜索node鏡像
docker search node
4,鏡像的使用
鏡像通過docker run
命令使用的,這是關(guān)于容器部分的操作。
# 指定使用registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1鏡像創(chuàng)建并啟動(dòng)容器
docker run --name sinn-server -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1
七,容器的創(chuàng)建、啟動(dòng)和管理
創(chuàng)建容器的前提是要有鏡像,有了鏡像之后我們就可以創(chuàng)建并啟動(dòng)容器了。
1,容器的創(chuàng)建和啟動(dòng)
通過docker run
命令即可實(shí)現(xiàn)容器的創(chuàng)建,并也會(huì)啟動(dòng)容器,這個(gè)命令實(shí)際上就包含了創(chuàng)建和啟動(dòng)容器兩部分工作。
因此,容器的創(chuàng)建和啟動(dòng)是一體的。
下面就來說說docker run
命令的用法。
** docker run
命令的用法 **
docker run命令如下:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
或
docker run 容器配置項(xiàng) 鏡像 額外的配置
OPTIONS是一些給容器添加的配置項(xiàng),比如指定容器的名稱,IP,是否后臺(tái)啟動(dòng)等等。
IMAGE則表示鏡像。COMMAND則是一些額外的命令。
OPTIONS具體配置項(xiàng)如下:
# 摘自w3c菜鳥: http://www.runoob.com/docker/docker-run-command.html
-a stdin: 指定標(biāo)準(zhǔn)輸入輸出內(nèi)容類型,可選 STDIN/STDOUT/STDERR 三項(xiàng);
-d: 后臺(tái)運(yùn)行容器,并返回容器ID。也可以理解為守護(hù)進(jìn)程運(yùn)行。
-i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
-t: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
--name="nginx-lb": 為容器指定一個(gè)名稱;
--dns 8.8.8.8: 指定容器使用的DNS服務(wù)器,默認(rèn)和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默認(rèn)和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 設(shè)置環(huán)境變量;
--env-file=[]: 從指定文件讀入環(huán)境變量;
--cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運(yùn)行;
-m :設(shè)置容器使用內(nèi)存最大值;
--net="bridge": 指定容器的網(wǎng)絡(luò)連接類型,支持 bridge/host/none/container四種類型;
--link=[]: 添加鏈接到另一個(gè)容器;
--expose=[]: 開放一個(gè)端口或一組端口;
--restart=no/on-failure/always 是否開機(jī)自動(dòng)啟動(dòng) ,no表示不啟動(dòng),always表示始終啟動(dòng),on-failure表示容器推出狀態(tài)非0時(shí)重啟
-v 標(biāo)記來創(chuàng)建一個(gè)數(shù)據(jù)卷并掛載到容器里,實(shí)現(xiàn)宿主機(jī)目錄或文件與指定的容器內(nèi)目錄或文件同步映射。
注意: 有些是一個(gè)扛"-",有些是兩個(gè)扛"--"
這么多配置項(xiàng),除非特別需要,否則不必全都配置。但有些是經(jīng)常使用或者必須的。比如: --name -d -e -v
, 這些是常用的配置項(xiàng),需要熟悉它們。
下面來舉個(gè)例子,為了方便操作,我們通常把命令寫在一個(gè)shell腳本里面,這樣只需要執(zhí)行shell腳本即可,不需要每次都手動(dòng)輸入。
以我的開源博客后臺(tái)sinn-server的容器啟動(dòng)腳本release-sinn.sh為例:
# release-sinn.sh
docker run --name sinn-server -p 8888:8888 -d -e 'NODE_ENV=production' --restart=always registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1
# --name sinn-server 指定容器名為sinn-server
# -p 8888:8888 指定宿主機(jī)8888端口與容器內(nèi)的8888端口形成映射
# -d 守護(hù)進(jìn)程運(yùn)行
# -e 'NODE_ENV=production' 設(shè)置環(huán)境變量NODE_ENV為production
# --restart=always 開機(jī)自啟動(dòng)
# registry.cn-hangzhou.aliyuncs.com/sessionboy/sinn:v1 指定的鏡像
只需要執(zhí)行release-sinn.sh腳本即可執(zhí)行上面的命令,如下:
$ sh release-sinn.sh
以下是執(zhí)行過程,如圖:
這樣我們的容器就啟動(dòng)成功了。使用docker ps
或docker ps -a
命令即可查看所有正在運(yùn)行的容器。
下面來講講容器的管理。
2,容器的管理
docker提供了很多關(guān)于容器的操作命令,包括刪除容器,停止、重啟容器等等。
下面列出一些經(jīng)常使用的用于操作容器的命令:
- 1,查看容器: docker ps
# 列出所有正在運(yùn)行的容器
docker ps
- 2,啟動(dòng)已停止的容器: docker start
# 啟動(dòng)一個(gè)或多少已經(jīng)被停止的容器
docker start [options] [containers]
- 3,停止容器:docker stop
# 停止正在運(yùn)行的容器 sinn-server
docker stop sinn-server
- 4,重啟容器:docker restart
# 重啟正在運(yùn)行的容器 sinn-server
docker restart sinn-server
- 5,刪除容器: docker rm
#刪除容器 sinn-server
docker rm sinn-server
注意:刪除容器命令是docker rm ,刪除鏡像命令是docker rmi
- 6,殺掉正在運(yùn)行的容器(包括進(jìn)程): docker kill
# 殺掉容器 sinn-server
docker kill sinn-server
- 7,進(jìn)入容器: docker exec
這個(gè)命令比較重要,因?yàn)橥ǔN覀冃枰M(jìn)入容器內(nèi)去操作一些東西。
docker exec -it 容器名稱/ID 終端
# 例子: 進(jìn)入ID為0d15561b9f10的容器
docker exec -it sinn-server bash
或
docker exec -it 0d15561b9f10 /bin/bash
注意: 進(jìn)入容器后,如果想退出容器,只需要輸入exit
命令執(zhí)行即可。
- 8,查看容器日志:docker logs
# 查看容器sinn-server的日志
docker logs sinn-server
- 9,容器與主機(jī)之間的數(shù)據(jù)拷貝:docker cp
往容器里拷貝數(shù)據(jù),或從容器內(nèi)拷貝數(shù)據(jù)出來,偶爾會(huì)常用到
# 將主機(jī)的/data/user目錄拷貝到容器sinn-server內(nèi)的/data/user目錄
docker cp /data/user sinn-server:/data/user
# 將容器sinn-server內(nèi)的/data/user目錄拷貝到主機(jī)的/data/user目錄
docker cp sinn-server:/data/user /data/user
以上是關(guān)于容器操作的大部分內(nèi)容。
八,使用docker搭建數(shù)據(jù)庫
以往我們搭建數(shù)據(jù)庫或nginx服務(wù)的時(shí)候,通常都需要手動(dòng)去安裝,然后做大量的配置。期間也經(jīng)常會(huì)遇到各種各樣的問題。
下面來介紹,如何在linux服務(wù)器用docker來快速搭建一個(gè)mongodb數(shù)據(jù)庫。
1, 首先拉取mongodb鏡像
# 從docker官方倉庫拉取mongo鏡像(你也可以用第三方的mongo鏡像,或自己創(chuàng)建的mongo鏡像)
docker pull mongo
2,啟動(dòng)mongo容器
建立shell腳本"my-mongo.sh"來運(yùn)行mongodb容器啟動(dòng)命令
# my-mongo.sh
# 使用鏡像"mongo"創(chuàng)建并啟動(dòng)容器"my-mongo"
docker run --name my-mongo -d -p 27017:27017 -v data/sinn-db:/data/db mongo
# -p 27017:27017 容器內(nèi)27017端口與主機(jī)27017端口形成映射
# -d 守護(hù)進(jìn)程運(yùn)行
# --name my-mongo 指定容器名為my-mongo
# -v data/sinn-db:/data/db 將主機(jī)的"/data/sinn-db"目錄掛載到容器內(nèi)"/data/db"目錄,作為mongodb數(shù)據(jù)存儲(chǔ)目錄
執(zhí)行my-mongo.sh
腳本即可:
sh my-mongo.sh
容器啟動(dòng)成功后,mongodb已經(jīng)啟動(dòng)。訪問你IP的27017端口看到下面的提示,說明mongodb已經(jīng)搭建成功。
It looks like you are trying to access MongoDB over HTTP on the native driver port.
至此,一個(gè)mongodb數(shù)據(jù)庫就搭建好了,是不是很簡單?
同樣,使用docker搭建nginx也十分簡單,只需要拉取nginx鏡像,然后基于nginx鏡像啟動(dòng)容器,啟動(dòng)時(shí)加一些nginx配置或指定nginx配置文件即可。
九,總結(jié)
docker很強(qiáng)大,除了部署項(xiàng)目外,還可用于搭建數(shù)據(jù)庫,nginx服務(wù)等。它的用途十分廣泛而強(qiáng)大,另外它的性能消耗也很低。操作也十分簡單。
docker很容易學(xué),它主要基于命令來操作,熟知這些命令以及Dockerfile腳本的配置,很快就能上手。
相信學(xué)會(huì)了docker之后,你會(huì)愛不釋手。
本文的部分腳本,可參考我的開源博客后臺(tái)sinn-server的docker腳本配置。