Docker的应用(下)

606 阅读11分钟

一、常用容器使用

1. Mysql容器

拉取镜像

# 拉取MySQL 5.7镜像
docker pull centos/mysql-57-centos7

创建容器

# 创建mysql5.7容器
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-
57-centos7

-p 代表端口映射,格式为 宿主机映射端口:容器运行端口 -e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登陆密码(如果是在容器中使用root登录的话,那么其密码为空)

-d 代表开启守护式容器

-i 代表启动容器

操作容器MySQL

# 拉取MySQL 5.7镜像
docker exec -it mysql5.7 /bin/bash

# 登录容器里面的mysql
mysql -u root -p

2. Tomcat容器

拉取镜像

# 拉取tomcat镜像
docker pull tomcat

创建容器

# 创建tomcat容器;并挂载了webapps目录
docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat

# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work.
#执行如下操作
# 1、编辑 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打开的文件中后面添加
net.ipv4.ip_forward=1
# 3、重启network
systemctl restart network

3. Nginx容器

拉取镜像

# 拉取nginx镜像
docker pull nginx

创建容器

# 创建nginx容器
docker run -di --name=mynginx -p 80:80  nginx

4. Redis容器

拉取镜像

# 拉取redis镜像
docker pull redis

创建容器

# 创建redis容器
docker run -di --name=myredis -p 6379:6379 redis

操作容器

#进入redis容器
docker exec -it myredis /bin/bash

#进入redis安装目录
cd /usr/local/bin

#连接redis
./redis-cli

远程连接容器

5.rabbitmq容器

  1. 下载rabbitmq镜像 docker pull rabbitmq:management

  2. 运行 sudo docker run -di -p 15672:15672 -p 4369:4369 -p 5672:5672 --name myrabitmq rabbitmq:management 'docker run -di -p 15672:15672 -p 5672:5672 --name myrabitmq 容器id'

5672:应用访问端口;15672:控制台Web端口号

五、Docker Compose(理解运用)

1. 简介与组成

简介

Compose项目是Docker官方的开源项目 , 负责实现对Docker容器集群的快速编排 .

它是一个定义和运行多容器的docker应用工具 , 使用compose,我们可以通过YMAL文件配置自己的服务,然后通过一个命令,就可以使用配置文件创建和运行所有的服务.

组成

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工 程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参 数,依赖。

一个服务当中可包括多个容器实例。

  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名 字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose所完成的任务。
  • 项目(project):由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义。即是 Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。

Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。

例如:要部署一个Web项目,除了Web服务容器,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

2. 安装与卸载

curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose

# 查看版本信息
docker-compose -version

#卸载docker-compose
rm -f /usr/local/bin/docker-compose

3. 常用命令

SUBCOMMAND解释
build构建或重建服务
help命令帮助
kill杀掉容器
logs显示容器的输出内容
port打印绑定的开放端口
ps显示容器
pull拉取服务镜像
restart重启服务
rm删除停止的容器
run运行一个一次性命令
scale设置服务的容器数目
start开启服务
stop停止服务
up创建并启动容器服务(-d:后台启动)

4. 模版文件

模板文件是使用Compose的核心,涉及的指令关键字也比较多,大部分指令与docker run 相关参数的含义都是类 似的。

默认的模板文件名称为docker-compose.yml , 格式为YAML格式 . 比如一个Compose模板文件:

version: "2"
services:
  web:
    images: nginx
    ports:
      - "8080:80"
    volumes:
      - /usr/local/abc:/usr/local/cba
#volumes:

#networks:

Docker Compose的模板文件主要分为3个区域,如下:

  • services 服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等。
  • volumes 数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用。
  • networks 应用的网络,在它下面可以定义应用的名字、使用的网络类型等等。

5. 应用Compose

创建模板文件

# 创建文件夹
mkdir -p /usr/local/mycompose

#进入文件夹
cd /usr/local/mycompose

#创建 docker-compose.yml文件;内容如下
vi docker-compose.yml

编写模板文件

version: '3'
services:
  redis1:
    image: redis
    ports:
      - "6379:6379"
    container_name: "redis1"
    networks: 
      - dev
  mysql1:
    image: centos/mysql-57-centos7
    environment:
      MYSQL_ROOT_PASSWORD: "root"
    ports: 
      - "3306:3306"
    container_name: "mysql1"
    networks: 
      - dev
  web1:
    image: tomcat
    ports: 
      - "9090:8080"
    container_name: "web1"
    networks: 
      - dev
      - pro
networks:
  dev:
    driver: bridge
  pro:
    driver: bridge

启动服务

cd /usr/local/mycompose
# up 命令行
docker-compose up

# 如果后台启动则使用如下命令  -d 后台启动
docker-compose up -d

# 若要停止
docker-compose stop

二、构造自己的镜象

构造自己的镜象有两种方式:

docker commit命令

docker build命令和Dockerfile文件

注意:我们说构造自己的镜象,不是完全要自己做一个镜象,而是在现有的基础上进行打包封装成一个镜象。

1. docker commit命令

以安装一个redis为例。先找到一个简单的镜象

centos    7                   5182e96772bf        5 months ago        200MB

这里面找到了一个centos7的镜象,这个就是一个操作系统,其它的什么都没有。

创建一个容器redis01

[root@localhost ~]# docker run -it --name=redis01 -p 6379:6379 centos:7 /bin/bash

进入容器安装环境(如果已经存在就可以不用再次安装环境了):

yum install gcc-c++

yum install ruby

yum -y install gcc automake autoconf libtool make

上传源文件,进行安装redis.并启动redis

测试:

Jedis jedis = new Jedis("192.168.25.134",7000);
System.out.println(jedis.ping());
jedis.close();

把容器保存为镜象

[root@localhost ~]# docker commit redis01 myredis

用新的镜象创建一个容器

[root@localhost ~]# docker run -di --name=redis02 -p 6379:6379 myredis

2. Dockerfile文件

Docker 可以通过 Dockerfile 的内容来自动构建镜像。Dockerfile 是一个包含创建镜像所有命令的文本文件,通过 docker build 命令可以根据 Dockerfile 的内容构建镜像,在介绍如何构建之前先介绍下 Dockerfile 的基本语法结构。

例如:创建一个Dockerfile文件,内容如下。

FROM centos:7
MAINTAINER zl

RUN yum install gcc-c++ -y -y -y -y
RUN yum install ruby -y -y -y -y

RUN mkdir /opt/redis/
ADD redis /opt/redis

EXPOSE 6379

FROM centos:7 说明这个镜象是建立在centos:7这个镜象的基础上的。

MAINTAINER zl 说明这:个dockerfile文件是一个叫zl的人创建的。

RUN yum install gcc-c++ -y -y -y -y 说明要运行一个yum指令,安装了gcc-c++ 的软件,后面加了多个-y,因为在安装gcc-c++软件的时候,要多次输入参数y表示同意,所以这里面就加了多个参数y .

RUN yum install ruby -y -y -y -y 同上,这次安装的环境是ruby软件。

RUN mkdir /opt/redis/ 在docker容器里面创建一个目录/opt/redis/ ADD redis /opt/redis 把本机上的reids文件(夹),上传到docker容器里面的/opt/redis目录下。

EXPOSE 6379 容器对外暴露的接口是6379

3. Dockerfile 指令

FROM

用法:

FROM <image>
  • FROM 指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
  • FROM 必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从 FROM 语句开始。
  • 如果 FROM 语句没有指定镜像标签,则默认使用 latest 标签。

MAINTAINER

用法:

MAINTAINER <name>

指定创建镜像的用户

RUN

每条 RUN 指令将在当前镜像基础上执行指定命令,有两种使用方式

  • RUN (the command is run in a shell - /bin/sh -c - shell form)
  • RUN [“executable”, “param1”, “param2”] (exec form)

RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的 RUN 都在之前 RUN 提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制。

exec 方式会被解析为一个 JSON 数组,所以必须使用双引号而不是单引号。exec 方式不会调用一个命令 shell,所以也就不会继承相应的变量,如:

RUN [ "echo", "$HOME" ]

这种方式是不会达到输出 HOME 变量的,正确的方式应该是这样的

RUN [ "sh", "-c", "echo", "$HOME" ]

EXPOSE

EXPOSE <port> [<port>...]

告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用 -p 或者 -P 选项生效。

ENV

ENV <key> <value>       # 只能设置一个变量
ENV <key>=<value> ...   # 允许一次设置多个变量

指定一个环节变量,会被后续 RUN 指令使用,并在容器运行时保留。

例子:

ENV myName="John Doe" myDog=Rex\ The\ Dog \
    myCat=fluffy

等同于

ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy

使用变量用$myName方式使用。

ADD

ADD <src>... <dest>

ADD 复制本地主机文件、目录或者远程文件 URLS 从 并且添加到容器指定路径中 。

<src> 支持通过 GO 的正则模糊匹配,具体规则可参见 Go filepath.Match

ADD hom* /mydir/        # adds all files starting with "hom"
ADD hom?.txt /mydir/    # ? is replaced with any single character
  • <dest> 路径必须是绝对路径,如果 <dest> 不存在,会自动创建对应目录
  • <src> 路径必须是 Dockerfile 所在路径的相对路径,也可以是一个网络地址。
  • <src> 如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制

COPY

COPY <src>... <dest>

COPY 复制新文件或者目录从 添加到容器指定路径中 。用法同 ADD,唯一的不同是不能指定远程文件 URLS。

WORKDIR

WORKDIR /path/to/workdir

为后续的 RUNCMDENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

最终路径是 /a/b/c

WORKDIR 指令可以在 ENV 设置变量之后调用环境变量:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME

最终路径则为 /path/$DIRNAME。

VOLUME

VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,后续具体介绍。目录挂载。

USER

USER daemon

指定运行容器时的用户名或 UID,后续的 RUNCMDENTRYPOINT 也会使用指定用户。最后不要加,加了之后以的运行容器都要加用户名了。

ONBUILD

ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

例如,Dockerfile 使用如下的内容创建了镜像 image-A:

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。

# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。

docker build

$ docker build --help

Usage: docker build [OPTIONS] PATH | URL | -

Build a new image from the source code at PATH

  --force-rm=false     Always remove intermediate containers, even after unsuccessful builds # 移除过渡容器,即使构建失败
  --no-cache=false     Do not use cache when building the image                              # 不实用 cache
  -q, --quiet=false    Suppress the verbose output generated by the containers
  --rm=true            Remove intermediate containers after a successful build               # 构建成功后移除过渡层容器
  -t, --tag=""         Repository name (and optionally a tag) to be applied to the resulting image in case of success

例如:

docker build -t=abc:001 .

docker build 可选择参数 Dockerfile所在目录

-t 说明是要指定镜象的名字和标签,abc是名字,001是标签。

. 说明就是这当前目录下找Dockerfile文件。

三、镜象的导入导出

1. 镜像备份

我们可以通过以下命令将镜像保存为tar 文件

docker  save -o mynginx.tar mynginx_i

2. 镜像恢复与迁移

首先我们先删除掉mynginx_img镜像 然后执行此命令进行恢复

docker load -i mynginx.tar

-i 输入的文件

执行后再次查看镜像,可以看到镜像已经恢复