docker 入门下篇

上篇在这里 docker 入门上篇html

本文主要记录:前端

  • 建立 docker 镜像
  • docker-compose 的使用

建立镜像

咱们开始使用的镜像都是别人制做好的,这些镜像能够用来建立多个不一样的实例容器,可是不能够修改镜像自己,因此当咱们想去定制本身的镜像时,须要本身建立一个新的镜像。建立镜像的方式有两种。node

使用容器制做镜像

前面说到镜像自己是不能够修改的,因此没办法直接在镜像上作定制,可是容器是能够修改的,咱们能够在容器上作一些本身须要的定制,而后再将容器反转为镜像,这种操做是能够的,用一张图表示:mysql

要注意的是,容器反转成的镜像并非覆盖源镜像,而是建立了一个新的镜像(不要被图误导)。nginx

来查看下当前本地的镜像:git

如今咱们就来定制一个 centos 的镜像,首先建立一个新容器:github

docker run -it --name=aa centos /bin/bash
复制代码

建立完成进入容器,咱们要拿这个容器生成一个镜像,为了与源镜像区分开,因此咱们来作一点定制,只是简单示范下,好比发现容器里默认没有 vim 工具,因此使用 yum install vim 来安装一下 vimredis

安装完 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。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 条指令,关键词分别是:FROMADDLABELCMD,每一条指令构建一层,每条指令后的内容就是描述该层应当如何构建。

Dockerfile 文件的指令有不少,推荐看菜鸟教程的文档,我主要来介绍一下使用 Dockerfile 的过程。

使用 Dockerfile 建立 centos 镜像

接下来咱们使用 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 项目镜像

拿个咱们前端熟悉的东西来试试 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-compose 是编排容器的工具,做用是可使用一条命令来定义和运行多容器。

咱们知道每当开启一个容器服务时,都须要执行 docker run 命令,这在服务少的时候是彻底可行的,可是当一个业务须要不少的容器服务时,好比同时须要使用 node镜像,mysql镜像,nginx镜像和redis镜像等,此时你就得敲各个容器的启动参数,环境变量,容器命名等等一系列的操做,至关繁琐。而 docker-compose 的出现,就是解决了这一痛点,它经过一个配置文件来管理多个Docker容器,只需一个命令既可启动多容器服务。

安装 docker-compose

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 是经过配置文件来启动服务的,咱们须要编写 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:指定多容器服务,这里指定了两个容器服务,分别是 mongoredis,注意这只是名字;
  • image:指定容器运行的镜像,不指定版本时默认最新版;
  • restart:重启容器,有4种状况
    • "no":是默认的重启策略,在任何状况下都不会重启容器
    • always:容器老是从新启动
    • on-failure:在容器非正常退出时(退出状态非0),才会重启容器
    • unless-stopped:在容器退出时老是重启容器,可是不考虑在Docker守护进程启动时就已经中止了的容器;
  • container_name:指定自定义容器的名称,而不是随机生成的名称;
  • environment:添加环境变量;
  • ports:端口映射,宿主机端口 : 容器端口;
  • volumes:数据卷挂载,宿主机目录 : 容器目录

总的来讲,此描述文件定义了两个容器服务,一个是mongodb数据库的,一个是redis的,分别对应services下的mongoredis,如今来运行这个文件,在这个文件所在的目录下运行:

docker-compose up
复制代码

此时两个容器就被建立好了。能够看到有了 Compose 配置文件后,只须要一个命令便可建立并启动全部服务,极大简化了操做。在实际工做中,当须要多个容器相互配合来完成某项任务的时候,就应该考虑使用 docker-compose 了。

结尾

关于 docker的实践,仍是很欠缺,我还学的动🤣,就这样吧~