上篇在这里 docker 入门上篇html
本文主要记录:前端
咱们开始使用的镜像都是别人制做好的,这些镜像能够用来建立多个不一样的实例容器,可是不能够修改镜像自己,因此当咱们想去定制本身的镜像时,须要本身建立一个新的镜像。建立镜像的方式有两种。node
前面说到镜像自己是不能够修改的,因此没办法直接在镜像上作定制,可是容器是能够修改的,咱们能够在容器上作一些本身须要的定制,而后再将容器反转为镜像,这种操做是能够的,用一张图表示:mysql
要注意的是,容器反转成的镜像并非覆盖源镜像,而是建立了一个新的镜像(不要被图误导)。nginx
来查看下当前本地的镜像:git
如今咱们就来定制一个 centos 的镜像,首先建立一个新容器:github
docker run -it --name=aa centos /bin/bash
复制代码
建立完成进入容器,咱们要拿这个容器生成一个镜像,为了与源镜像区分开,因此咱们来作一点定制,只是简单示范下,好比发现容器里默认没有 vim
工具,因此使用 yum install vim
来安装一下 vim
:redis
安装完 vim
也至关于作了一个小定制,如今就将容器转换为镜像,使用命令:sql
docker commit 容器ID 镜像名称:版本号
复制代码
操做以下:mongodb
如图,拿到容器的 id 后便可建立新的镜像。有个小细节就是当咱们使用容器 id 时,能够不用输入完整的 id,只要前几位就好了。如今咱们建立好了新的镜像 my_centos
,为了验证可用性,咱们用它来建立一个新的容器:
docker run -it --name=bb my_centos:1.0 /bin/bash
复制代码
建立完成后使用 docker ps
来验证:
能够看到 bb
容器已经存在,并且先前的 aa
容器已经不在了,这说明当容器转换为镜像后,容器自己将删除。
另外,还记得咱们以前在 aa
容器上作的定制嘛,咱们安装了 vim
工具,如今咱们在 bb
容器上使用 vim 命令后,发现是有这个工具的。
这说明定制生效。习惯用一张图来表示流程:
以上就是使用容器建立镜像的过程。
建立镜像最经常使用的方式就是使用 Dockerfile。Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。它的格式是这样的:
FROM scratch ADD centos-7-x86_64-docker.tar.xz / LABEL org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20191001" CMD ["/bin/bash"] 复制代码
这是 centos 镜像的 Dockerfile 文件,它有 4 条指令,关键词分别是:FROM
、ADD
、LABEL
和 CMD
,每一条指令构建一层,每条指令后的内容就是描述该层应当如何构建。
Dockerfile 文件的指令有不少,推荐看菜鸟教程的文档,我主要来介绍一下使用 Dockerfile 的过程。
接下来咱们使用 Dockerfile 方式来定制一个本身的 centos 镜像。
建立一个新目录,并在目录中新建 Dockerfile 文件:
// 目录名和文件名都随意 mkdir docker-files cd docker-files touch centos_dockerfile 复制代码
在 centos_dockerfile
中输入如下内容并保存:
FROM centos:7
MAINTAINER aaa
RUN yum install -y vim
WORKDIR /root
CMD /bin/bash
复制代码
来逐行解释一下这个 Dockerfile 文件:
FROM centos:7
:表示基础镜像使用 centos:7
这个版本。若是本地已有这个镜像就直接使用,若是没有会先下载到本地;MAINTAINER aaa
:做者名;RUN yum install -y vim
:运行安装 vim 的命令,加上 -y
参数是由于安装vim过程当中会有确认步骤;WORKDIR /root
:设置工做目录,建立出来的容器进入时,默认所在的目录;CMD /bin/bash
:启动容器时默认执行的命令。用到的指令虽然很少,但已经够咱们建立一个新的镜像了,在 docker-files 目录中执行命令:
docker build -f ./centos_dockerfile -t centos_with_vim:1 . 复制代码
注意命令最后还有一个 .
,它是上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(好比复制),docker build 命令得知这个路径后,会将路径下的全部内容打包。使用 .
就是将当前路径指定为上下文路径,通常不要放无用的东西在上下文路径中。
-f
参数后面接的是 Dockerfile 文件,-t
参数后面接的是要建立的镜像的名称或加上版本。
执行命令时:
能够看到会根据 Dockerfile 文件中的指令而一层层地去构建镜像,完成后使用 docker images
能够查看构建出来的镜像:
如今来使用这个新镜像去建立容器:
docker run -it --name=cc centos_with_vim:1 /bin/bash
复制代码
建立完成进入容器后,首先验证了工做目录确实是 /root
,而后 vim 工具也是存在的,这些都是咱们在 Dockerfile 中配置好的,为了对比,能够直接建立一个基于 centos:7
源镜像的容器:
说明咱们使用 Dockerfile 方式建立特定镜像成功。
拿个咱们前端熟悉的东西来试试 Dockerfile,来建立一个 koa 项目的镜像。
首先咱们要有一个koa项目,这个就作一个简单的demo就行了,好比个人:
app.js
内容:
const Koa = require('koa') const app = new Koa() app.use(async ctx => { ctx.body = 'hello Docker!' }) app.listen(3000) 复制代码
package.json
内容:
{ "name": "koa-demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "node app.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "koa": "^2.11.0" } } 复制代码
Dockerfile
就是以前说的配置文件,直接命名为 Dockerfile 时,就不须要加 -f
参数指定,它的内容是:
# 基础镜像指定为 node 镜像 FROM node:latest # 指定做者信息,以前用的是 MAINTAINER,但推荐用 LABEL,格式 LABEL <key>=<value> ... LABEL maintainer="pingzi" # 移动当前目录下面的文件到app目录下 ADD . /app/ # 容器工做目录为 /app WORKDIR /app # 安装依赖 RUN npm install # 暴露3000端口 EXPOSE 3000 # 执行 npm start CMD ["npm", "start"] 复制代码
还有一个 .dockerignore
文件,它的做用跟 .gitignore
相似,指定的内容就不会被打包到镜像中,这里在网上找的一分内容:
# Logs logs *.log npm-debug.log* # Runtime data pids *.pid *.seed # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # nyc test coverage .nyc_output # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules jspm_packages # Optional npm cache directory .npm # Optional REPL history .node_repl_history .idea .node_modules node_modules .vscode 复制代码
好了齐活,如今来建立镜像,还记得建立镜像的命令吗?在当前目录下执行:
docker build -t koa_image .
复制代码
有了镜像后,能够建立容器啦,执行:
docker run -d --name=koa_demo -p 9000:3000 koa_image 复制代码
不出意外的话,此时在浏览器中就能够访问到啦~
到这,Dockerfile 的一些基本概念已经说完了,说的比较浅显,还需多实践啊~
docker-compose 是编排容器的工具,做用是可使用一条命令来定义和运行多容器。
咱们知道每当开启一个容器服务时,都须要执行 docker run
命令,这在服务少的时候是彻底可行的,可是当一个业务须要不少的容器服务时,好比同时须要使用 node镜像,mysql镜像,nginx镜像和redis镜像等,此时你就得敲各个容器的启动参数,环境变量,容器命名等等一系列的操做,至关繁琐。而 docker-compose 的出现,就是解决了这一痛点,它经过一个配置文件来管理多个Docker容器,只需一个命令既可启动多容器服务。
Linux 上安装:
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 复制代码
添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose 复制代码
检查版本
docker-compose --version
复制代码
另外,在 Mac 或者 Windows 上安装docekr客户端的,是默认包含Compose的,因此不须要单独安装。
docker-compose 是经过配置文件来启动服务的,咱们须要编写 docker-compose.yml
文件,这里我写了一个简单的例子:
version: '3' services: mongo: image: mongo restart: always container_name: 'mongo-test' environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example ports: - 27018:27017 volumes: - /composetest/mongodb:/data/db redis: image: redis container_name: 'redis-test' ports: - 6380:6379 复制代码
建立一个新目录 /composetest
(目录名字随意),而后在目录中建立 docker-compose.yml
文件,文件中输入上面内容,保存,注意缩进。
如今来看下这个文件描述了什么:
version
:指定本 yml 依从的 compose 哪一个版本制定的,这里是版本 3;services
:指定多容器服务,这里指定了两个容器服务,分别是 mongo
和 redis
,注意这只是名字;image
:指定容器运行的镜像,不指定版本时默认最新版;restart
:重启容器,有4种状况
container_name
:指定自定义容器的名称,而不是随机生成的名称;environment
:添加环境变量;ports
:端口映射,宿主机端口 : 容器端口;volumes
:数据卷挂载,宿主机目录 : 容器目录总的来讲,此描述文件定义了两个容器服务,一个是mongodb
数据库的,一个是redis
的,分别对应services下的mongo
和 redis
,如今来运行这个文件,在这个文件所在的目录下运行:
docker-compose up
复制代码
此时两个容器就被建立好了。能够看到有了 Compose 配置文件后,只须要一个命令便可建立并启动全部服务,极大简化了操做。在实际工做中,当须要多个容器相互配合来完成某项任务的时候,就应该考虑使用 docker-compose 了。
关于 docker的实践,仍是很欠缺,我还学的动🤣,就这样吧~