一、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/jdkENV 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
#访问浏览器即可成功该问