Docker协作安装与镜像定制

一、Docker数据卷

(一)概念

数据卷:是一个可供一个或多个容器使用的特殊目录。

特性:

数据卷可以在容器之间共享和重用。

对数据卷的修改会立马生效。
对数据卷的更新,不会影响镜像。
数据卷默认会一直存在,即使容器被删除。

通过镜像创建一个容器,容器一旦被销毁,则容器内的数据将一并被删除。有些情况下,通过服务器上传的图片会丢失。容器中的数据不是持久化状态的。 

(二)为什么需要数据卷

从docker容器的文件系统说起。出于效率等一系列原因,docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:

  •    不能在宿主机上很方便地访问容器中的文件。
  •    无法在多个容器之间共享数据。
  •    当容器删除时,容器中产生的数据将丢失。

为了解决这些问题,docker引入了数据卷(volume)机制。数据卷是存在于一个或多个容器中的特定文件或文件夹,这个文件或文件夹以独立于docker文件系统的形式存在于宿主机中。
数据卷的最大特定是:其生存周期独立于容器的生存周期。

(三)数据卷应用

1、最佳场景

  • 在多个容器之间共享数据,多个容器可以同时以只读或者读写的方式挂载同一个数据卷,从而共享数据卷中的数据。
  • 当宿主机不能保证一定存在某个目录或一些固定路径的文件时,使用数据卷可以规避这种限制带来的问题。
  • 当你想把容器中的数据存储在宿主机之外的地方时,比如远程主机上或云存储上。
  • 当你需要把容器数据在不同的宿主机之间备份、恢复或迁移时,数据卷是很好的选择。

2、具体应用

#1、创建数据卷
docker volume create 数据卷名称
#创建数据卷之后,默认会存放到目录: /var/lib/docker/volume/数据卷名称/_data目录下

#2查看数据卷
docker volume inspect 数据卷名称
#3查看全部数据卷信息
docker volume ls

#4删除数据卷
docker volume rm 数据卷名称

#5应用数据卷
#5.1当你映射数据卷时,如果数据卷不存在,Docker会帮你自动创建
docker run -v 数据卷名称:容器内路径 镜像ID
#5.2直接指定一个路径作为数据卷的存储位置
docker run -v 路径:容器内部的路径 镜像ID

二、Docker安装nginx

(一)、基本安装

#拉取Nginx镜像
docker pull nginx:latest
#查看本地镜像列表(即可看到nginx)
docker images
#运行容器
docker run --name nginx-test -p 80:80 -d nginx

 参数说明:

  • --name nginx-test:容器名称。
  • -p 80:80:端口进行映射,将本地8080端口映射到容器内部的80端口。
  • -d nginx:设置容器在在后台一直运行。

whereis nginx  :  查看安装位置

 (二)、高级安装基础参考

为了更方便开发和配置,需要将Docker容器内的信息进行宿主机间的配置
docker exec -it nginx-test bash 可通过如下命令进入容器内部

1、创建目录

mkdir -p /usr/local/nginx

依次在该目录下创建三个文件目录:

#创建www目录
mkdir -p /usr/ local/nginx/html
#创建日志目录
mkdir -p /usr/ local/nginx/logs
#创建配置文件目录
mkdir -p /usr/local/nginx/ conf

2、拷贝配置文件

docker cp 容器ID:/etc/nginx/nginx.conf /usr/local/nginx/conf
docker cp 容器ID:/etc/nginx/conf.d/ /usr/local/nginx/conf

3、更高级的参考一下测试方面博主,本人Java后端。

三、Docker安装MYSQL

#1、搜索镜像
docker search mysql

#2、下载镜像
docker pull mysql:5.6

#3、创建并启动MysQL容器
docker run -d --name mysql5.6-3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD='zhangjinhe' mysql:5.6
docker run -d --name mysql5.6-3306 -p 3306:3306 -e MYSQL_ROOT_PASSWORD='zhangjinhe!' mysql:5.6

#4、访问测试
#进入到容器内部zhangjinhe!
docker exec -it mysql5.6-3306 bash
#连接mysql数据库:
mysql -u root -p
#输入数据库密码即可完成

#5、授权
#授权主机访问:
MySQL>GRANT ALL PRIVILEGES ON *.* TO 'root' @ ' %’ IDENTIFIED BY ‘ zhangjinhe' WITH GRANT OPTION;
#刷新权限:
MySQL>FLUSH PRIVILEGES;
#退出:
MySQL>EXIT;

注意开启3306端口,并重启防火墙! 

四、Docke定制镜像

(一)、定制镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 从已经创建的容器中更新镜像,并且提交这个镜像
  • 使用Dockerfile指令来创建一个新的镜像

1、对于开发人员,可以为开发团队提供一个完全一致的开发环境

2、对于测试人员,可以直接拿开发时所构建的镜像测试。

3、对于运维人员,在部署时,可以实现快速部署、移值。

(二)Dockerfile定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

五、Dockerfile常用命令

(一)、官方源码见GitHu

(二)、常用命令

FROM

指定基础镜像
基础镜像不存在,会在Docker Hub上拉去(一般会是文件的第一个指令)

使用格式:
FROM<镜像>:[tag]
FROM<镜像>@digest[校验码]
当前主机没有此镜像时,会自动去官网HUB下载

 MAINTAINER

提供Dockerfile制作者提供本人信息
[逐渐废弃]
LABLE--替代MAINTANIER

具体使用:
LABLE maintainer="作者信息"

使用格式:

MAINTANIER  "zhangjinhe <1911301987@qq.com>”
LABEL maintainer= "zhangjinhe@qq.com"
LABEL "com.exanple vendar" =ACME Incorporated"

LABEL com.example.label-with-vaLue= "foo"
LABEE-version="1.0"
LABEL description= This text illustrates\

that label-values can span multiple lines . "

ENV

ENV指令可以用于为docker容器设置环境变量ENV设置的环境变量,可以使用docker inspect命令来查看。同时还可以使用docker run --env <key>=<value>来修改环境变量。
具体用法:
ENV JAVA_HOME /usr / local/jdk

ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/ :$JRE_HOME/lib/

ENV PATH SPATH : $JAVA_HOME/bin/

USER

用来切换运行属主身份的。Docker默认是使用root,但若不需要,建议切换使用者身分,毕竟root权限太大了,使用上有安全的风险。

WORKDIR

WORKDIR用来切换工作目录的。
Docker默认的工作目录是/,只有RUN能执行cd命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个RUN 都是独立进行的。
如果想让其他指令在指定的目录下执行,就得靠WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次WORKDIR。
WORKDIR /usr/local/tomcat/

RUN

RUN指令是用来执行命令行命令的。由于命令行的强大能力,RUN指令在定制镜像时是最常用的指令之一。其格式有两种:

  • shell格式:RUN<命令>,就像直接在命令行中输入的命令一样。
  • exec格式: RUN ["可执行文件","参数1", "参数2"],这更像是函数调用中的格式。

使用格式:
RUN <command>
RUN ["<executable> ","<param1> ","<param2>"]

EXPOSE

为容器打开指定要监听的端口以实现与外部通信
使用格式:
EXPOSE 80/tcp 23/udp

不加协议默认为tcp
使用-P选项可以暴露这里指定的端口!
但是宿主的关联至这个端口的端口是随机的!

COPY

把宿主机中的文件复制到镜像中去!
文件要在Dockerfile工作目录
src 原文件
--支持通配符

--通常相对路径

dest目标路径

--通常绝对路径

ADD

类似COPY命令
ADD将文件从路径<src> 复制添加到容器内部路径<dest>。
<src>必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。
<dest>是目标容器中的绝对路径。所有的新文件和文件夹都会创建UID和GID。事实上如果<src>是一个远程文件URL,那么目标文件的权限将会是600。

VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
--卷
只能定义docker管理的卷:
VOLUME /data/mysql运行的时候会随机在宿主机的目录下生成一个卷目录! 

 六、案例

需求:创建一个镜像(基于tomcat)里面要有一个index.html,并写入Hello Docker

#1、在宿主机创建一空白目录
mkdir -p /usr/local/docker/demo1
#2、在该目录下,创建一文件Dockerfile
vim Dockerfile
#3、其内容为:
#指定tomcat最新版本镜像
FROM tomcat
RUN echo 'Hello Docker'>/usr/local/tomcat/webapps/RO0T/index.html
#这个Dockerfile很简单,一共就两行。涉及到了两条指令,FROM和 RUN。
#4、构建镜像
docker build -t demo1 .
#5、运行镜像所在容器
docker run --rm --name demo1-8088 -p 8080:8080 -d demo1
#访问浏览器即可成功该问

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java张金贺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值