今天,是你去新公司入职的第一天。
早上起了个大早,洗漱干净带着材料去新公司报道。签完合同到达工位,开机,泡一杯红糖枸杞(不要问我为什么,我也不知道。。。)。然后开始下载 vscode、chrome、nodejs,配置 NODE_PATH、cnpm、安装 webpack、webpack-cli、@vue-cli、yarn、、、(此处省略 1k+插件)。
如果顺利的话,这个时候你应该已经准备下班了。当然,一般都不会很顺利。。。在这个过程中,你可能会遇到网络问题、环境问题、配置问题、兼容问题、、、(此处省略 1w+问题)。
然后周五新人周报:配置环境,熟悉项目。
上面这个经历想必每位到新公司的同学都经历过吧,是不是感觉很低效、很繁琐。可能你会感觉这还好,能接受,那如果公司的项目很复杂,需要配置的环境很复杂呢,是不是每次新同学来,老员工都要手把手帮忙配置环境呢?想想都头疼,那有没有什么好的解决办法呢?
方法肯定是有的,今天的主角登场,它就是 docker。
docker 可以看成是一个高性能的虚拟机,主要用于 linux 环境的虚拟化。开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 linux 机器上。容器完全使用沙箱机制,相互之间不会有任何接口。
docker 实现了资源隔离,一台机器运行多个容器互无影响。
docker 容器的运行不需要额外的虚拟化管理程序的支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
使用 docker,开发人员可以利用镜像快速构建一套标准的研发环境,开发完成后,测试和运维人员可以直接通过使用相同的环境来部署代码。
docker 容器几乎可以在任意的平台上运行,包括虚拟机、公有云、私有云、个人电脑、服务器等,这种兼容性让用户可以在不同平台之间轻松的迁移应用。
使用 Dockerfile,只需要很少的配置修改,就可以替代以往大量的更新工作。并且所有修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理。
brew -v
sudo brew update
brew cask install update
https://docs.docker.com/docker-for-mac/install/
virtualbox
, 地址https://www.virtualbox.org/wiki/Downloads
vagrant
, 地址https://www.vagrantup.com/downloads.html
docker 使用 Dockerfile 作为配置文件进行镜像的构建,简单看一个 node 应用构建的 dockerfile
FROM node:12.10.0
WORKDIR /usr/app
COPY package*.json ./
RUN npm ci -qy
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
基于这个 Image 开始
设置工作目录
复制文件
新层中执行命令
声明容器监听端口
容器启动时执行指令默认值
更多指令参考文末 dockerfile 指令集合
这里补充一下Docker Registry 公开服务
和私有 Docker Registry
的概念:
功能 | 命令 |
---|---|
拉取镜像 | docker pull [镜像名称:版本] |
镜像列表 | docker images |
删除镜像 | docker rmi[镜像名称:版本] |
镜像操作记录 | docker history [镜像名称:版本] |
给镜像设置新的仓库 | docker tag [镜像名称:版本][新镜像名称:新版本] |
查看镜像详细 | docker inspect [镜像名称:版本] |
搜索镜像 | docker search [关键字] |
仓库登录 | docker login |
功能 | 命令 |
---|---|
启动容器并进入 | docker run -ti --name [容器名称][镜像名称:版本] bash |
容器列表 | docker ps -a |
容器提交为新的镜像 | docker commit [容器名称] my_image:v1.0 |
容器后台运行 | docker run -d --name [容器名称][镜像名称:版本] bash -c "echo hello world" |
容器结束后自动删除 | docker run --rm --name [容器名称][镜像名称:版本] bash -c "echo hello world" |
删除容器 | docker rm [容器名称] |
进入容器 exec | docker exec -ti [容器名称] bash |
进入容器 attach | docker attach [容器名称] |
停止容器 | docker stop [容器名称] |
Docker 日志 | docker logs [容器名称] |
查看容器详细 | docker inspect [容器名称] |
查看容器最近一个进程 | docker top [容器名称] |
docker top [容器名称] | docker restart [容器名称] |
暂停一个容器进程 | docker pause [容器名称] |
取消暂停 | docker unpause [容器名称] |
终止容器 | docker kill [容器名称] |
端口映射 | docker run -ti --name [容器名称] -p 8080:80 [镜像名称:版本] bash |
参数 | 简介 |
---|---|
-m, - -memory | 内存限制,格式:数字+单位,单位可以是 b, k, m, g,最小 4M |
参数 | 简介 |
---|---|
-- -cpuset-cpus="" | 允许使用的 CPU 集 |
-c,- -cpu-shares=0 | CPU 共享权值 |
命令 | 说明 | 示例 |
---|---|---|
FROM | 基于这个 Image 开始 | FROM nginx:latest |
ENV | 环境变量 | ENV localfile /usr/local/nginx |
RUN | 新层中执行命令 | RUN /bin/bash -c 'source HOME |
LABEL | 设置 metadata | LABEL version="1.0" |
MAINTAINER | 维护者 (deprecated) | maintainer="feng shuanfengshuan95@gmail.com" |
EXPOSE | 声明容器监听端口 | EXPOSE 80 443 |
ADD | 添加文件 | ADD ./dist ${foo}/html |
COPY | 复制文件 | COPY ./dist ${foo}/html |
ENTRYPOINT | 容器启动时执行指令 | |
CMD | 容器启动时执行指令默认值 | CMD ["-la"] |
WORKDIR | 设置工作目录 | WORKDIR /path/to/workdir |
VOLUME | 挂载点 | VOLUME ["/data"] |
USER | 指定操作用户 | USER www |