docker容器数据卷
docker容器数据卷:为了能保存数据在docker中使用的卷,持久化数据的地方。类似于redis中的rdb和aof
特点:(数据持久化,容器间共享数据)
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止。
容器内添加数据卷:
直接命令添加
命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷是否挂载成功.容器内编辑 vi host.txt
容器和宿主机之间数据共享 touch xx.txt(新建并编辑)
容器停止退出后,主机修改后数据是否同步
命令(带权限):
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
加上ro表示容器只能看,不能写。只读
dockerFile添加
dockerFile是docker Images 的解释文件。就如同java中的 Wang.class是对Wang.java文件的解释
1)根目录下新建mydocker文件夹并进入
2)可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
3)file构建,文件中写入
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,-----success"
CMD /bin/bash
相当于使用命令:
docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash
4)build后生成镜像 获得一个新镜像 wang/centos
docker build -f /mydocker/dockerfile -t wang/centos .
记得后面还有个 点 .
5)run容器
docker run -it wang/centos
6)会自动创建宿主机想对应的数据卷文件夹
数据卷容器
数据卷共享步骤:
1)先启动一个父容器dc01 在dataContainer2新增内容
2)dc02/dc03继承自dc01 --volumes-from 命令 dc02/dc03分别在dataContainer2各自新增内容
docker run -it --name dc02 --volumes-from dc01 wang/centos
3)回到dc01可以看到02/03各自添加的都能共享
4)删除dc01,dc02修改后dc03可否访问 可以访问
5)删除dc02后dc03可否访问 可以访问
6)新建dc04继承dc03后再删除dc03 可以访问
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
dockerfile
dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建步骤
1、手动编写一个dockerFile文件,必须符合file规范
2、有这个文件后,直接docker build命令执行,获得一个自定义的镜像
3、run
以centos为例:
FROM scratch # 基于的基础镜像
MAINTAINER The CentOS Project <cloud-ops@centos.org> # 作者以及邮箱
ADD centos-7.2.1511-docker.tar.xz / # 拷贝文件或目录到镜像(可以自动解压缩或者下载)
# 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
LABEL name="CentOS Base Image" #Label 后面相当于一段对该生成的镜像的一些描述信息
LABEL vendor="CentOS"
LABEL license=GPLv2
# Volumes for systemd
# VOLUME ["/run", "/tmp"]
# Environment for systemd
# ENV container=docker
# For systemd usage this changes to /usr/sbin/init
# Keeping it as /bin/bash for compatability with previous
CMD ["/bin/bash"] # 默认的命令
比如:docker run -it centos,在执行的时候即:docker run -it centos /bin/bash
docker执行dockerfile的大致流程:
1)docker从基础镜像运行一个容器
2)执行一条指令并对容器作出修改
3)执行类似docker commit的操作提交一个新的镜像层
4)docker再基于刚提交的镜像运行一个新的容器
5)执行dockerfile中的下一条指令直到所有指令都执行完成
从应用软件的角度来看,dockerfile、docker镜像与docker容器分别代表软件的三个不同阶段
dockerfile是软件的原材料 (编写文件)
docker镜像是软件的交付品 (build)
docker容器则是软件的运行态 (run)
dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署与运维,三者缺一不可,合力充当docker体系的基石。
dockerfile常用命令,可参考:https://www.cnblogs.com/linjiqin/p/8735230.html
Dockerfile指令详解
Dockerfile中包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13个指令。下面一一讲解。
1.FROM
格式为FROM image或FROM image:tag,并且Dockerfile中第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
2.MAINTAINER
格式为MAINTAINER user_name user_email,指定维护者信息
3.RUN
格式为RUN command或 RUN [“EXECUTABLE”,“PARAM1”,“PARAM2”…],前者在shell终端中运行命令,/bin/sh -c command,例如:/bin/sh -c “echo hello”;后者使用exec执行,指定其他运行终端使用RUN["/bin/bash","-c",“echo hello”]
每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用\来换行。
4.CMD
支持三种格式:
CMD [“executable”,“param1”,“param2”],使用exec执行,这是推荐的方式。
CMD command param1 param2 在/bin/sh中执行。
CMD [“param1”,“param2”] 提供给ENTERYPOINT的默认参数。
CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。
5.EXPOSE
格式为 EXPOSE port [port2,port3,…],例如EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。
在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。
6.ENV
格式为:EVN key value 。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
例如
ENV word hello
RUN echo $word
7.ADD
格式:ADD src dest
该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。
8.COPY
格式为:COPY src desc
复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。
9.ENTRYPOINT
格式有两种:
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1,param2 会在shell中执行。
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。
cmd命令参数会被后面的覆盖,而entrypoint不会被覆盖,会将参数追加到命令行后面,所以entrypoint比cmd强大一点。
举例:若dockerfile中最后一句:
CMD ["curl","-s","http://ip.cn"]
那么执行 docker run 镜像名 -i 时就会报错,由于该条命令的执行过程其实是
CMD ["curl","-s","http://ip.cn"]
CMD -i
#对于CMD命令来说,后面命令覆盖前面的,所以就达不到想要的效果,而使用entrypoint就不会出现这种效果
ENTRYPOINT ["curl","-s","http://ip.cn"]
执行 docker run 镜像名 -i 命令其实相当于执行
CMD ["curl","-s","http://ip.cn","-i"]
# ENTRYPOINT 会将参数追加到命令行里面
10.VOLUME
格式为 VOLUME ["/data"]
作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。
11.USER
格式为:USER username
指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。
例如:RUN groupadd -r docker && useradd -r -g docker docker
12.WORKDIR
格式: WORKDIR /path
为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。
13.ONBUILD
格式ONBUILD [INSTRUCTION]
当构建一个被继承的dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。
例如下面的Dockerfile创建了镜像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py
则基于镜像A创建新的镜像时,新的Dockerfile中使用from A 指定基镜像时,会自动执行ONBBUILD指令内容,等价于在新的要构建镜像的Dockerfile中增加了两条指令:
FROM A
ADD ./app
RUN python app.py
14.docker build
创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。
通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。
通过 -t 指定镜像的标签信息,例如:docker build -t regenzm/first_image . ##"."指定的是Dockerfile所在的路径
例子 自定义镜像
1、自定义的dockerfile
该文件名为mydockerfile
FROM centos #基于阿里云上镜像的centos
MAINTAINER wang<wang@163.com> #描述信息
ENV MYPATH /usr/local # 配置环境变量,此处只是一个变量MYPATH=/usr/local
WORKDIR $MYPATH #指定默认的工作目录 ,$是引用上面声明的变量
RUN yum -y install vim # 让本次打包的镜像支持vim命令
RUN yum -y install net-tools #支持ifconfig命令
EXPOSE 80 # 暴露的端口号
CMD echo $MYPATH # 输出
CMD echo "success ...ok" # 输出一句话
CMD /bin/bash #默认命令
ONBUILD RUN echo "father onbuild" #当子镜像继承时就打印该句话
2、执行build
docker build -f /mydocker/mydockerfile -t mycentos:1.2
3、run
docker run -it mycentos:1.2
自定义Tomcat镜像
docker run -d -p 9080:8080 --name myt9 -v /mydocker/tomcat9/test:/usr/local/tomcat-9.0.8/webapps/test -v /mydocker/tomcat9/logs/:/usr/local/tomcat-9.0.8/logs --privileged=true
-v表示将容器中的test文件夹和logs文件夹同步到宿主机上
(docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名)
–privileged=true表示若权限不够的时候,设置为true.
docker安装mysql
第一步,拉取MySQL镜像
docker pull mysql
查看镜像
docker images
第二步,创建并启动一个MySQL容器
docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
–name:给新创建的容器命名,此处命名为mysqlserver
-e:配置信息,此处配置mysql的root用户的登陆密码
-p:端口映射,表示在这个容器中使用3306端口(第二个)映射到本机的端口号也为3306(第一个)
-d:成功启动容器后输出容器的完整ID
查看容器运行状态
docker ps
进入容器命令
docker exec -it 29fd45c1c0fc bash
测试连接MySQL
docker exec -it mysqlserver /bin/bash
docker推送到阿里云
步骤:
1、登录阿里云,找到容器镜像服务
2、创建一个命名空间,然后在镜像仓库中创建,镜像仓库
3、在本地docker服务里面执行
登录阿里云Docker Registry
$ sudo docker login --username=hi31942843@aliyun.com registry.cn-hangzhou.aliyuncs.com
从Registry中拉取镜像
$ sudo docker pull registry.cn-hangzhou.aliyuncs.com/jason_wang/myservice:[镜像版本号]
将镜像推送到Registry
$ sudo docker login --username=hi31942843@aliyun.com registry.cn-hangzhou.aliyuncs.com
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/jason_wang/myservice:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/jason_wang/myservice:[镜像版本号]
注:创建好镜像仓库之后,点开该镜像仓库,都有详细的说明