Dockerfile
Image 文件,都是通过 Dockerfile 文件生成的。
1.dockerfile 语法
dockerfile文件格式:
FROM node:8.4:
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node index.js
FROM
: 表示引用的image名称以及版本号COPY
: 第一个参数表示当前的文件路径,第二参数表示 Image 内的文件路径WORKDIR
: 指定 Image 内的工作环境RUN
: 在 /app 目录,下载安装项目依赖EXPOSE
: 将 3000 端口暴露出来,供外部访问到这个接口CMD
: 表示容器启动后,自动启动node服务 node index.js
此时,可能会有疑问: CMD
和 RUN
有什么区别呢?
RUN
: 是 image 文件的构建阶段执行,执行的结果都会打包到image文件CMD
: 是容器启动成功之后执行
Image
Docker 根据 image 文件生成容器的实例。同一份 image 文件可以生成多个同时运行的容器实例。
Docker 用镜像(Image)来管理文件,一个镜像中包含了应用程序和其相关的依赖库。当容器启动之后,会自动将镜像中的文件移动到容器环境中,然后运行。
启动容器指令:
$ docker container run <imaeg-name>
2.创建 image 文件
通过 Dockerfile 文件,就可以构建出 image 文件了。
# 通过 docker image build 指令进行构建
$ docker image build -t <image-name:tag-name> .
# 例如
$ docker image build -t image:0.1 .
上面代码中,-t
参数用来指定 image 的名称,:
后表示image 对应的版本号。
Container
Image 文件生成的容器实例,本身也是一个文件,称之为容器文件。也就是说,容器一旦生成,同时存在两个文件: 容器文件和image文件。
3.生成容器
$ docker container run -p 8000:3000 -it <image-name:versoin> /bin/bash
-p
: 将容器的3000端口,映射到本机的8000端口-it
: 将容器的shell,映射到本机的shell。这样在本机窗口输入指令,就会传入到容器-i
: 以交互式运行,阻塞式-t
: 分配一个伪终端,后面接参数 /bin/bash,这样就将我们带入到容器中<image-name>:version
: image文件名和版本号/bin/bash
: 表示容器启动后,内部第一个执行的命令-d
: 在后台运行容器,并打印id--mount
: 挂载宿主机文件目录到容器目标目录 (用法请参考: https://blog.csdn.net/kikajack/article/details/79474286)
4.访问容器
# 查看容器 id
$ docker ps
# 查看运行容器的日志
$ docker logs <container_id>
# 进入容器
$ docker exec -it <container_id> /bin/bash
推送远端
$ docker push <image-name:tag-name>
关闭运行的容器
$ docker kill <container_id>
删除容器
$ docker rm <container_name>
CI/CD
参考文章
- 阮一峰-Docker 入门教程: https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
- Docker Api 文档: https://docs.docker.com/engine/reference/commandline/run