(Docker)02_Docker高级

一、镜像制作

docker :镜像 容器

镜像一般分为官方镜像和非官方镜像(私人发布的镜像)
因为镜像发布没有安全审核 或多或少都会存在一些安全漏洞。自己动手制作自己的镜像。

dokcer的镜像方式有两种:

使用docker commit命令
使用docker builder和Dockerfile文件

自己制作一个javaweb的运行环境的镜像:jdk tomcat

1.1.使用docker commit

1.1.1.制作步骤

  1. 拉取一个基础镜像
docker pull centos
  1. 在基础镜像上来创建一个容器
docker run -itd --name=mycentos centos
  1. 将宿主机中的jdk 和tomcat上传到容器
    在这里插入图片描述
[root@localhost opt]# docker cp soft/apache-tomcat-8.5.16.tar.gz  mycentos:/opt/
[root@localhost opt]# docker cp soft/jdk-8u131-linux-x64.tar.gz mycentos:/opt
  1. 进入容器 安装jdk
docker exec -it mycentos /bin/bash
tar -zxvf /opt/jdk-8u131-linux-x64.tar.gz -C /opt/programfiles/

配置环境变量
在这里插入图片描述

#环境变量
JAVA HOME=/opt/programfiles/jdk8
export PATH=$JAVA_HOME/bin:$PATH
  1. 安装tomcag
tar -zxvf apache-tomcat-8.5.16.tar.gz -C /opt/programfiles/
 mv apache-tomcat-8.5.16/ tomcat8

在tomcat添加配置

vi bin/setclasspath.sh

在这里插入图片描述

  1. 将容器提交为一个新的镜像
    返回宿主机
    在这里插入图片描述
    在commit时 该容器必须处于运行状态
    在这里插入图片描述

1.1.2. 端口的映射

使用该镜像来创建一个容器
在这里插入图片描述
启动容器中的tomcat
在这里插入图片描述
访问测试
在这里插入图片描述

1.1.3.目录挂载

将tomcat的两个常用目录 webapps和conf目录做一个映射 方便操作
创建一个新的容器

docker run -itd --name=t1 javaweb

完成目录映射:将容器内的目录映射到宿主机
在这里插入图片描述
停止并删除t1
在这里插入图片描述
启动一个新容器 并完成目录挂载

docker run -itd --name=tt1 -p 9999:8080 -v /opt/tomcatmapping/webapps/:/opt/programfiles/tomcat8/webapps -v /opt/tomcatmapping/conf/:/opt/programfiles/tomcat8/conf javaweb

访问测试
在这里插入图片描述
在这里插入图片描述
测试挂载目录
修改宿主机中的webapps中的index.jsp
在这里插入图片描述

1.1.4.镜像/容器打包(了解)

docker save -o /root/javaweb.tar javaweb
docker  save -o 打包之后的包的存放路径    待打包的镜像                

可以将此包传送或者拷贝到其他服务器
导入镜像

[root@localhost ~]# docker load -i /root/javaweb.tar 

容器打包

docker export -o /root/web.tar web

导入容器

docker import web.tar  web01

1.2.镜像的制作方式二:Dockerfile

Dockerfile 就是一个文件,该文件使用DSL语法构建镜像,之后 可以使用docker builder 命令来基于该文件构建一个新的镜像。
在这里插入图片描述
在这里插入图片描述

1.2.1.Dockerfile内容基础知识

1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2:指令按照从上到下,顺序执行
3:#表示注释
4:每条指令都会创建一个新的镜像层,并对镜像进行提交
dockerfile的指令:
  FROM:指定基础镜像(FROM是必备的指令,并且必须为第一条指令)。
  RUN: 用来执行命令行命令。其基本格式:
      shell格式: RUN  <命令>  ,输入在bash环境中的命令即可,一个dockerfile允许使用RUN不得超过127层,所以,使用一次RUN, 使用 ‘ \ ’ 换行,使
      exec格式: RUN  <"可执用‘ && ’执行下一条命令。一般使用此种格式;行文件", "参数1", "参数2">,此种方式像是函数调用中的格式;
  COPY:  复制文件。 其基本格式:
      格式1:COPY <源路径>...<目标路径>
      格式2:COPY [<源路径1>,....."<目标路径>"]
  ADD: 更高级的复制文件,在COPY的基础上增加了一些功能,如果复制的是压缩包的话,会直接解压,而不需要在使用RUN解压;
  CMD:容器启动命令。其基本格式:
      shell格式: CMD <命令>
      exec格式: CMD ["可执行文件", "参数1", "参数2"...]
      参数列表格式: CMD [“参数1, “参数2...],在指定了ENTRYPOINT指令后,用CMD指定具体的参数
  ENTRYPOINT: 入口点。其基本格式分为exec和shell,
      ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行中可以替代,不过比CMD繁琐,需要通过docker run 的参数--entrypoint 来指定。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接运行其命令,而是将CMD的内容作为参数传递给ENTRYPOINT指令。其执行时就变成了:  <ENTRYPOINT> "<CMD>"
  ENV: 设置环境变量。(都可以使用这里使用的变量)其基本格式:
      格式1:ENV <key> <value>
      格式2:ENV <key1>=<value1> <key2>=<value>...
  ARG: 构建参数。构建参数和ENV的效果一样,都是设置环境变量,所不同的是ARG所构建的环境变量在将来容器运行时是不存在的。其基本格式:
      格式1: ARG <参数名> [=<默认值>]
      格式2: 该默认值可以在构建命令 docker build  中用 --build-arg <参数名>=<> 来覆盖
  VOLUME: 定义匿名卷。 其基本格式:
      格式1: VOLUME ["<路径1>", "<路径2>"...]
      格式2: VOLUME <路径>
  EXPOSE:  暴露端口。EXPOSE指令是声明运行时容器所提供的端口,在启动容器时不会在因为这个声明而开启端口。 其基本格式:
      格式1: EXPOSE <端口1> [<端口2>...]
  WORKDIR: 指定工作目录。其基本格式:
      格式1: WORKDIR <工作目录路径>
  USER: 指定当前用户。USER是帮助你切换到指定用户。 其基本格式:
      格式1: USER <用户名>
  HEALTCHECK: 健康检查,判断容器的状态是否正常。 其基本格式:
      格式1: HEALTCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
      格式2: HEALTCHECK NONE: 如果基础镜像有健康检查指令,使用此格式可以屏蔽掉其健康检查指令

1.2.2.Dockerfile的大致的执行流程

1 从基础镜像运行一个容器
2 执行一条指令 并对容器进行修改
3 执行类型docker commit来提交一个新的镜像层
4 在基于刚刚提交的镜像来运行一个新的容器
5 继续执行dockerfile的下一条指令  重复2--5的过程 直到所有的指令执行结束

1.2.3.Dockerfile的使用

1 创建一个目录
2 在目录中创建一个Dockerfile文件
3 通过Dockerfile来构建镜像
4 通过镜像来运行一个容器

具体案例:

  1. 在root目录下新建一个my_imgs目录
  2. 创建一个Dockerfile文件
#pull down centos image
FROM docker.io/centos
#维护者信息
MAINTAINER hw huwei@lanqiao.org

#install nginx
#ADD  获取url中的文件,放在当前目录下
ADD http://nginx.org/download/nginx-1.16.1.tar.gz .

 #RUN 执行以下命令 
 RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
 RUN useradd -M -s /sbin/nologin nginx
 RUN tar -zxvf nginx-1.16.1.tar.gz
 RUN mkdir -p /usr/local/nginx
 RUN cd nginx-1.16.1 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
 RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log
  #EXPOSE 映射端口
  EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]
  1. 构建镜像
docker build -t my_nginx --rm=true .

-t 表示生成的镜像名称和标签
–rm=true 表示删除生成过程中产生的临时的容器
. 表示在当前目录下构建镜像 不可省略

  1. 测试
    根据镜像来创建一个容器
 docker run -itd --name=docker_nginx -P my_nginx /bin/bash
 docker exec docker_nginx /bin/bash

在这里插入图片描述
在这里插入图片描述

二、Docker应用的部署

如何使用docker 完成javaweb的部署环境的配置
docker的使用步骤:

	1 搜索镜像
	2 拉取镜像
	3 查看镜像
	4 根据镜像  创建并启动容器 
	5 停止容器
	6 移除容器

环境配置通常两种做法:

1 我创建一个centos的容器 接下来之后 将web项目运行所需的所有环境都部署在容器中 环境搭建好之后  可以将容器制作成一个镜像  
2 将web项目运行所需的环境 每一个单独部署  这样就是每一个环境都是一个单独的容器 

2.1.Tomcat配置

docker search tomcat
docker pull tomcat
docker run -it --name=mytomcat-p 8080:8080 tocmat:latest

在这里插入图片描述
在这里插入图片描述
如果访问不到 需要进入容器 查看tomcat中webapps 是否有内容
如果没有
则 在webapps下创建一个ROOT目录
在其中部署一个网页

2.2.Mysql

docker pull mysql

创建容器
创建之前的准备工作
创建一个目录 /opt/mysql(可以做挂载)

mkdir -p /opt/mysql
docker run -p 3306:3306 --name=mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
进入容器
docker exec -it mysql /bin/bash

在这里插入图片描述
在这里插入图片描述

2.3.redis

创建/opt/redis目录,并在redis目录下进行挂载

docker pull redis
docker run -p 6379:6379 -v $PWD/data:/data -v $PWD/conf/redis.conf:/usr/local/etc/redis/redis.conf  -d redis  redis-server /usr/local/etc/redis/redis.conf --appendonly yes
docker exec -it 92d205e955db redis-cli

2.4.jdk

2.4.1. 使用Dockfile制作jdk镜像

步骤:
(1)创建目录

mkdir -p /usr/local/dockerjdk8

(2)下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
在这里插入图片描述
(3)创建文件Dockerfile vim Dockerfile

#依赖镜像名称和ID
FROM centos
#指定镜像创建者信息
MAINTAINER lbt
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/dockerjdk8
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/dockerjdk8/
#配置java环境变量
ENV JAVA_HOME /usr/local/dockerjdk8/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

(4)执行命令构建镜像

docker build -t='jdk1.8' --rm=true .

注意后边的空格和点,不要省略
(5)查看镜像是否建立完成

docker images

在这里插入图片描述

docker run -itd --name=jdk8 jdk1.8 /bin/bash

(6)测试jdk配置

docker exec -it jdk8 /bin/bash
java -version
java 

在这里插入图片描述

发布了67 篇原创文章 · 获赞 6 · 访问量 1901

猜你喜欢

转载自blog.csdn.net/weixin_45801537/article/details/105261990