Docker笔记

Docker的基本概念

名词 描述
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板。类似于类(class)
Docker 容器(Container) 容器是独立运行的一个或一组应用。类似于实例(object)
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库(Registry) Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

一份简单的Dockerfile解析

这里是一个nuxt示例项目,打包的思路就是把项目代码和node环境都打包在一起,每次修改代码之后重新打包。

# 设置基于哪个镜像文件,这里依赖node-alpine版本(一个基于alpine系统的node版本,体积小)
FROM node:8.11.3-alpine
# 复制当前文件夹下文件到容器的/usr/nuxt-init目录
COPY . /usr/nuxt-init
# 设置执行命令的工作目录(这里是运行npm的路径)
WORKDIR /usr/nuxt-init
# RUN用于执行初始化命令
RUN npm install cnpm && ./node_modules/cnpm/bin/cnpm i
# 设置环境变量(根据项目环境来设置,可选项)
ENV HOST 0.0.0.0
# 暴露3000端口给外面
EXPOSE 3000
# 启动时执行的命令,全文只能有一个,有多个时以最后一个为准
# 这里的npm start是npm run start的简写
CMD [ "npm", "start" ]

Dockerfile文件要放在项目根目录下,而且名称不可更改。

根据Dockerfile生成docker镜像

# 进入Dockerfile所在目录
 docker build -t deploy:1.0 .

-t是给镜像加上标签便于区分,格式为:<name>:<tag>;
最后的.(点)代表了对当前文件夹下所有文件进行打包 ;

过滤不打包的文件 —— .dockerignore文件

有时会有一些文件不想打包到镜像里面,这时候可以添加.dockerignore文件。用法和.gitignore一样。

# Example
  .DS_Store
  npm-debug.log*
  selenium-debug.log
  .nuxt/
  /package-lock.json
  *.tar
  *.md

  # Editor directories and files
  .idea
  *.suo
  *.ntvs*
  *.njsproj
  *.sln

查看构建完成的镜像文件

docker images

该命令可以查看自己构建的镜像和从网上下载的镜像文件

查看镜像的信息

# Example
# 查看nginx镜像的信息
docker inspect nginx
查看镜像信息

运行镜像

首先明确一个概念:容器,就是以某个镜像运行起来的实例,就跟new了一个实例对象一样。
就以上面的nuxt项目来模拟一个情景:用服务器的3001端口映射容器中nuxt项目的端口(nuxt的项目服务默认开启的是3000端口,因为此时3000端口是指容器本身暴露了3000端口,不代表服务器也暴露了3000端口,所以我们需要给服务器和容器做一个映射);

docker run -d -p 3001:3000 --name mynuxt deloy:1.0 

-p 用于映射服务器端口和容器端口,格式为:<服务器端口>: <容器端口>(还有其他写法,具体查文档)
-d 表示让进行在后台运行,如果不加的话运行信息就会在当前终端上显示了,当前终端关闭项目也会停掉。
--name代表这个容器实例的别名,后续可以通过该别名获取容器ID等其他信息,实例别名不能重复。
最后的deloy:1.0就是镜像名称加上标签号了。

这里还有一个知识点,上面说了镜像就像一个模板,可以以一个镜像跑多个容器,每个容器之间是相互独立的,你还可以用服务器的3002、3003接口去映射多个容器的3000接口。

运行上面的命令之后,你可以通过logs命令来查看容器内项目的运行情况了。

docker logs <containerId>

containerId是指容器ID。
通过容器ID你就可以查看日志情况了,这时候又有一个问题了,怎么去查容器的容器ID呢,通过docker ps命令就可以了。

docker ps -a

直接使用docker ps的话可以查出当前运行的docker实例,加上-a可以获取到全部实例,包括运行中的和没运行的,然后就可以根据实例名称获取到容器ID了。


查看实例列表

操作实例

实例的启动,重启和关闭

docker (start | restart | stop) <containerId>

实例也和其他服务一样,可以进行关闭、启动等操作,关闭之后的实例还存在于docker ps -a列表中。

删除实例

docker rm [-f] <containerId>

运行中的实例不能进行删除,如果要删除的话,可以加上-f参数删除运行中的实例。

查看运行中的容器内情况

通过exec命令可以查看运行中的实例内部信息。

docker exec -it  43148e2301b9 ls /usr/nuxt-init

执行exec命令

-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
一般这两个都是成对使用的。
43148e2301b9为运行中的容器ID,可通过docker ps获取。
最后的ls /usr/nuxt-int可以替换成当前镜像支持的shell命令。

映射服务器中的目录到容器内的指定目录。

举一个运行nginx镜像的例子:

docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx 

命令说明:

  • -p 80:80:将容器的80端口映射到主机的80端口
  • --name mynginx:将容器命名为mynginx
  • -v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www
  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf
  • -v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs

特别说明一下:

  1. 如果映射的目录原本存在着关键文件,你在映射的目录中也应该存在该文件,就比如你映射了nginx的配置文件目录,你也应该把默认配置文件复制一份到你的映射目录中,不然nginx跑不起来。
  2. 映射的过程中数据流是单向的,即映射的目录中,容器内目录会同步服务器目录的文件,服务器目录新增文件,容器内对应目录也会新增文件;但反过来不行,容器内不允许向映射目录进行写文件操作。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • 《Docker从入门到实践》阅读笔记 原书地址: https://yeasy.gitbooks.io/docker...
    GuoYuebo阅读 11,364评论 1 39
  • 参加工作以来,经历的第二家公司,用心的记录用到的技术。 Docker是一个改进的容器技术。具体的“改进”体现在,D...
    草中人阅读 261评论 0 0
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,489评论 0 120
  • 我要上班,家里又是没人管女儿,六点钟我就起床了。梳洗完,趁女儿还没起床,我便开车去乡下接婆婆。 回来...
    胡瑞格阅读 155评论 0 1
  • 这几天工作效率一直不高,心里很着急。感觉很焦虑。今早, 我一边晨跑,一边在想这个问题。我想到应该调整一下工作方法。...
    SandyZhang_ce42阅读 154评论 0 3