一、数据卷容器
命令的容器挂载数据卷,其他的容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
–valumes-from :容器间传递共享
# 启动容器1 容器1有共享数据卷 会自动创建文件夹
docker run -it --name dco1 lm/centos
#启动容器2 与容器1是用的同一个镜像 但是有了--volumes-from dc01 就会继承dc01的容器卷 而且他们之间容器卷的数据会共享 !!
docker run -it --name dco2 --volumes-from dc01 lm/test
#启动容器3 容器3和容器1 还有容器2 的容器卷数据就能达到互相同步的效果
docker run -it --name dco3 --volumes-from dc01 lm/test
###删除dco1后 dco2 和 do03 之间照样能互相同步数据
#启动容器4 让容器4继承容器3
docker run -it --name dco4 --volumes-from dc03 lm/test
##删除容器3后 容器2 和容器4 照样能数据共享
##说明: 容器之间配置信息的传递 数据卷生命周期一直持续到没有容器使用它为止
二、DockerFile 解析
2.1、DockerFile是什么?
DockerFile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤:
1. 手动编写一个dockerfile容器 编写
2. docker build 获得自定义镜像 构建
3. run 执行
文件长什么样:
#scratch 超级父类 跟java的Object差不多
FROM scratch
# 添加解压文件
ADD centos-6-docker.tar.xz /
# 标签 说明
LABEL name="CentOS Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="20170406"
# 执行命令
CMD ["/bin/bash"]
#说明 如果执行docker run -it centos 就会自动在后边偷偷加上 /bin/bash
#说明 如果执行docker run -it centos /bin/bash 就直接替换掉CMD命令了... 感觉像备胎
2.2、DockerFile 构建过程
Docker内容基础知识:
- 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
- 指令从上到下 顺序执行
- # 表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行DockerFile 的大致流程:
(1)docker从基础镜像运行一个容器 最少是个祖先镜像 scratch
(2)执行一条指令 并对镜像进行修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile的下一条指令直到所有指令都执行完成
小总结:
2.3、DockerFile 保留指令字
-
FROM
基础镜像 当前新镜像是基于哪个镜像 -
MAINTAINER
镜像维护者 姓名 和 邮箱 -
RUN
容器构建的时候 需要运行的命令
比如 :RUN groupadd -r redis && useradd -r -g redis redis
redis的dockerfile文件里边 就有创建分组和创建用户的命令 -
EXPOSE
当前镜像 对外暴露的端口号 -
WORKDIR
指定在创建容器后,终端默认登录进来的工作目录 默认是/ 根目录
例如: WORKDIR /data
就表示 登录之后 默认在/data 目录下 -
ENV
用来在构建镜像过程中设置环境变量
例子:
ENV MY_PATH /user/mytest
这个环境变量可以在后续的任何RUN 指令中使用 这就如同命令前边 指定环境变量一样 也可以在其他指令中使用这些环境变量
比如:WORKDIR $MY_PATH -
ADD
将宿主机目录下的文件拷贝到镜像 ADD命令会自动处理URL 和 解压 tar 压缩包 -
COPY
将宿主机目录下的文件拷贝到镜像 不会处理
COPY src dest
COPY[“src”,“dest”] -
VOLUME
容器数据卷 用于数据保存和持久化工作 会自动创建指定文件(如果没有)
指定文件就可以用来做数据共享 -
CMD
指定一个容器 启动时要运行的命令
可以有多个CMD 但是 只有最后一个生效 ,而且 CMD会被docker run 之后的参数替换 可怜的像一个备胎一样
-
ENTRYPOINT
与 CMD一样 但是人家是正式男朋友 不能当备胎 不会被run 后的参数 替换 -
ONBUILD
当构建一个被继承的dockerfile时,父镜像被子镜像继承后,父镜像的onbuild被触发
小结:
2.4、DockerFile 案例
- base镜像(scratch) 99% 镜像都是通过在base镜像中安装与配置需要的软件构建出来的
- 自定义镜像
(1) 编写dockerfile文件
#基于centos镜像创建当前镜像
FROM centos
#维护者的作者和邮箱
MAINTAINER lm<[email protected]>
#环境变量
ENV MY_PATH /usr/local
#登录进去后的落脚点
WORKDIR $MY_PATH
#执行命令 这里是安装vim 和 net工具
RUN yum -y install vim
RUN yum -y install net-tools
#暴露端口是80
EXPOSE 80
#cmd命令
CMD echo $MY_PATH
CMD echo "success!!!!"
CMD /bin/bash
(2)构建
# dockerfile dockerfile文件
#mycentos01 新镜像的名字
#. 当前目录下
docker build -f dockerfile -t mycentos01 .
成功:
查看镜像:
(3)运行
进去的落脚点不是根目录 而是WORKDIR 的指定
vim ifconfig 都可以使用了!!
(4)列出镜像的变更历史
docker history 镜像id
从下往上看
RUN :
dockerfile2:
FROM centos
RUN yum -install -y curl
CMD ["curl" , "-s" ,"http://ip.cn" ]
构建:
docker build -f dockerfile2 -t myip .
启动:
docker run -it myip
会输出执行curl -s http://ip.cn 的内容
如果想在curl 后加上 -i 参数 curl -s -i http://ip.cn
自己想的是: docker run myip -i
结果:报错了 为什么呢 因为在 run 后边的 -i 覆盖了原来的CMD命令 相当于只执行 -i
ENTRYPOINT :
dockerfile3:
FROM centos
RUN yum -install -y curl
ENTRYPOINT ["curl" , "-s" ,"http://ip.cn" ]
构建:
docker build -f dockerfile3 -t myip3 .
启动:
docker run -it myip3
会输出执行curl -s http://ip.cn 的内容
如果想在curl 后加上 -i 参数 curl -s -i http://ip.cn
自己想的是: docker run myip -i
结果: 就是期待的结果
ONBUILD:
父镜像:dockerfile4
FROM centos
RUN yum -install -y curl
ENTRYPOINT ["curl" , "-s" ,"http://ip.cn" ]
ONBUILD RUN echo "---------hello father images here -------------------"
构建:
docker build -f dockerfile4 -t myip4 .
启动:
docker run -it myip4
子镜像:dockerfile5
FROM myip4 #这是myip4 继承myip4
RUN yum -install -y curl
ENTRYPOINT ["curl" , "-s" ,"http://ip.cn" ]
构建:
docker build -f dockerfile5 -t myip5 .
结果:build的时候 会触发myip4的 RUN echo “---------hello father images here -------------------”
ADD COPY:
#切换到根目录
cd /
#创建文件夹
mkdir -p /dockerfile/tomcat9
#进入文件夹
cd /dockerfile/tomcat9
#创建文件 没意义 只是为了演示copy的功能
touch c.txt
把tomcat压缩包 和 jdk 压缩包 放到 /dockerfile/tomcat9 文件夹下
编写dockerfile:
#基础镜像
FROM centos
#维护者
MAINTAINER lm<[email protected]>
#把宿主机的c.txt 拷贝到容器的 /usr/local 路径下
COPY c.txt /usr/local/cincontainer.txt
#把java 和 tomcat 添加到容器中 他会自动解压 指定解压地址
ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.16.tar.gz /usr/local
# 安装vim编辑器
RUN yum -y install vim
# 设置落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java 和 tomcat环境
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.16
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.16
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
#运行容器时监听的端口
EXPOSE 8080
#启动时运行tomcat 读日志
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.16/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.16/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.16/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.16/log/catalina.out
编译:
docker build -f dockerfile -t mytomcat9 .
查看镜像: docker images
启动:
# -v 容器卷
docker run -d -p 8080:8080 --name mytom9 -v /dockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.16/webapps/test
-v /dockerfile/tomcat9/tomcatlogs:/usr/local/apache-tomcat-9.0.16/logs
--privileged=true mytomcat9
容器卷:
copy的文件:
数据卷的作用是可以直接在宿主机上上传我们的项目 然后重启容器 就更新项目了
小总结:
2.5、Docker 常用安装
步骤:
- 搜索镜像
- 拉去镜像
- 查看镜像
- 启动镜像(容器)
- 停止容器
- 移除容器
Mysql:
(1)
(2)docker pull mysql:5.6
(3)
#
docker run -p 3306:3306 --name mysql -v /mysql/conf:/etc/mysql/conf.d -v /mysql/logs:/logs -v /mysql/data:/var/lib/mysql -e MY
SQL_ROOT_PASSWORD=123456 -d mysql:5.6
(4) docker exec -it mysql /bin/bash 交互运行
数据库备份:
docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"123456" >/mysql/test/bf.sql
redis 等
appendonly yes #开启AOF模式 这是redis的参数
推送到仓库:
提交到本地仓库(创建新镜像)
# commit 我觉得其实跟提交到远程仓库没什么直接关联关系 commit就是为了把已经修改的镜像 打包成一个新镜像
docker commit -a liliming -m 'new tomcat9 ' mytom9 mytomcat9:1.0
小知识:
docker image inspect --format=’{{.RepoTags}} {{.Id}} {{.Parent}}’ $(docker image ls -q --filter since=镜像id) 查看依赖此镜像的镜像id
镜像 提交到docker hub
- 注册账号 lmtest
自己仓库空空 https://cloud.docker.com/repository/list
- docker login 登录 输入密码
- 推送镜像的规范是:ocker push 注册用户名/镜像名 所以我们第一步就是要修改自己的镜像
- 比如我们有一个镜像是 centos
我们需要修改自己镜像lmtest是自己用户名
docker tag centos lmtest/centos:1.0
docker images 查看
提交到远程仓库:
docker push lmtest/centos:1.0
再看自己仓库 已经有一个啦:
提交到阿里云大同小异
小知识点:
centos7 安装docker 需要先安装gcc gcc-c++
yum install gcc
yum install gcc-c++
centos7 过程中有一步下载 可以直接设置成阿里云的地址
centos7安装的时候 有几步是可选的
centos7 配置镜像地址:
json内容写: