本文档通过对该官方案例进行实践,并对内容总结。
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文件的步骤
-
From
从node镜像开始构建项目,若没有下载node镜像,则自动下载 - 镜像下载完成后,复制项目到镜像中
WORKDIR
是指镜像中的位置,COPY . .
将当前项目的文件,复制到镜像中的WORKDIR
下。并且安装依赖. -
CMD
命令则是第一次运行容器的时候,默认运行的命令. - 最后,
-t
对我们对镜像进行命名,命令最后一个.
是指在当前目录下寻找Dockerfile文件
FROM node:12-alpine // 从node镜像中构建我们的项目,如果没有node镜像,则系统会自动下载node镜像
WORKDIR /app // 镜像中的目录
COPY . . // 将当前位置下的文件复制到 WORKDIR目录下去
RUN yarn install --production // 安装依赖
CMD ["node", "src/index.js"] // 初次运行Docker默认运行的命令
03 更新项目
更新项目需要
- 重新build项目
- 使用run运行项目
更新项目之前,需要先暂停之前运行的项目(使用命令行或者Docker客户端,这里使用命令行)
- 获取id镜像
docker ps
- 暂停镜像
docker stop <the-container-id>
- 删除镜像
docker rm <the-container-id>
可以使用一个命令实现 暂停和删除镜像
docker rm -f <the-container-id>
04 分享你的镜像
分享你的镜像,首先需要在DockerHub创建一个仓库。
发布你的镜像
- 在发布镜像之前,需要在你的主机上登陆DockerHub账号。
docker login -u Your-User-Name
- 然后使用
-t
给你的镜像一个新的名字
使用方法
docker tag old-container-name new-container-name
案例
docker tag getting-started YOUR-USER-NAME/getting-started
- 最后使用下面命令推送
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
这两种方式比较
开始开发者模式容器
开发流程
- 挂载我们的源代码到容器中
- 安装所有依赖,包括开发依赖
- 使用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
构建新的镜像。
其他
- nodemon是什么
Nodemon是一个实用程序,它将监视源中的任何更改并自动重新启动服务器。 Nodemon不会对你的代码产生额外的更改,它只是node命令的替代品。 因为当你修改源文件后,如果你用的是原来的node 则必须手动重启你的更改才会有效