初次使用Docker

本文档通过对该官方案例进行实践,并对内容总结。

01 Docker运行

运行容器的命令

docker run -d -p 80:80 docker/getting-started

参数介绍

  • -d (detached mode)容器在后台运行
  • -p 80:80 (port)映射本机端口到容器的端口
  • docker/getting-started 需要运行的镜像

上面的命令可以进行缩写

docker run -dp 80:80 docker/getting-started

Docker控制面板

安装了Docker软件后可以看到此页面,该面板管理所有的容器,也可以使用命令行查看 docker ps

什么是容器

容器是一个独立的进程。

什么是镜像

镜像为容器提供运行环境。

02 第一个应用程序

Dockerfile

Dockerfile是一个脚本,用来创建一个容器镜像。

Dockerfile应用

创建一个dockerfile在项目的根目录下。本项目运行在node.js下,因此在package.json的同级目录下创建Dockerfile(注意,此文件没有后缀)

FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

在项目的根目录下,使用下面命令创建一个Docker镜像

docker build -t getting-started .

该命令会使用Dockerfile来创建镜像。
接下来来分析Dockerfile文件的步骤

  1. From 从node镜像开始构建项目,若没有下载node镜像,则自动下载
  2. 镜像下载完成后,复制项目到镜像中WORKDIR是指镜像中的位置,COPY . .将当前项目的文件,复制到镜像中的WORKDIR下。并且安装依赖.
  3. CMD命令则是第一次运行容器的时候,默认运行的命令.
  4. 最后,-t对我们对镜像进行命名,命令最后一个.是指在当前目录下寻找Dockerfile文件
FROM node:12-alpine // 从node镜像中构建我们的项目,如果没有node镜像,则系统会自动下载node镜像
WORKDIR /app  // 镜像中的目录
COPY . . // 将当前位置下的文件复制到 WORKDIR目录下去
RUN yarn install --production // 安装依赖
CMD ["node", "src/index.js"] // 初次运行Docker默认运行的命令

03 更新项目

更新项目需要

  1. 重新build项目
  2. 使用run运行项目

更新项目之前,需要先暂停之前运行的项目(使用命令行或者Docker客户端,这里使用命令行)

  1. 获取id镜像
docker ps
  1. 暂停镜像
docker stop <the-container-id>
  1. 删除镜像
docker rm <the-container-id>

可以使用一个命令实现 暂停和删除镜像

docker rm -f <the-container-id>

04 分享你的镜像

分享你的镜像,首先需要在DockerHub创建一个仓库。

发布你的镜像

  1. 在发布镜像之前,需要在你的主机上登陆DockerHub账号。
docker login -u Your-User-Name
  1. 然后使用-t给你的镜像一个新的名字

使用方法

docker tag old-container-name new-container-name

案例

docker tag getting-started YOUR-USER-NAME/getting-started
  1. 最后使用下面命令推送
docker push YOUR-USER-NAME/getting-started

05 数据持久化

不同容器之前的数据不互通,即使在同一个镜像里面。

练习

docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"

使用exec执行容器里面命令

docker exec <container-id> cat /data.txt

在同一个镜像中启动另一个容器

docker run -it ubuntu ls 
  • -i 暂时不知道作用
  • -t (terminal)分配终端
  • -it 容器可以在终端运行,不会立即停止。即我们可以在终端中访问容器环境。

Container Volumes

Volumes提供了将容器的特定文件系统路径连接回主机的能力.如果容器中挂载了该目录,容器中进行修改,主机中也会进行修改。

有两种类型的Volumes。

  • Bind mounts
  • named volumes

named volumes

首先是命名一个Volume。命名Volume相当于创建一桶数据。Docker保存到物理位置,我们只需要知道该Volume的名字即可。

创建一个Volume

docker volume create todo-db

使用-v将Volume绑定并挂载到App中

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

这里将todo-db挂载到/etc/todos中。

查看Volume存储在本地的位置,使用下面命令

docker volume --help
➜  app docker volume inspect todo-db
[
    {
        "CreatedAt": "2020-09-18T09:10:57Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]
➜  app

06 实时在容器里面更新项目

volumes有两种类型

  • Bind mounts
  • named volumes

这两种方式比较

UMPMi9

开始开发者模式容器

开发流程

  • 挂载我们的源代码到容器中
  • 安装所有依赖,包括开发依赖
  • 使用nodemon模式观察文件变化

进行开发

docker run -dp 3000:3000 \
    -w /app -v "$(pwd):/app" \
    node:12-alpine \
    sh -c "yarn install && yarn run dev"
  • -dp 3000:3000 在后台运行并且创建映射
  • -w /app 设置工作目录,容器一启动就自动进入到该目录
  • -v "$(pwd):/app" (==bind mode==)挂载当前代码到容器的/app目录下
  • node:12-alpine 使用的镜像。
  • sh -c "yarn install && yarn run dev"启动shell使用命令安装依赖然后运行该项目

使用docker logs -f <container-id>查看当前的日志

当开发完成后,使用docker build -t xxxx构建新的镜像。

其他

  1. nodemon是什么

Nodemon是一个实用程序,它将监视源中的任何更改并自动重新启动服务器。 Nodemon不会对你的代码产生额外的更改,它只是node命令的替代品。 因为当你修改源文件后,如果你用的是原来的node 则必须手动重启你的更改才会有效

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