Docker-03 20190309

版权声明:本文为博主原创文章,未经博主允许不得转载,如需转载请在明显处标明出处! https://blog.csdn.net/qq_36291682/article/details/88357765

一、数据卷容器

命令的容器挂载数据卷,其他的容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

–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内容基础知识:

  1. 每条保留字指令都必须为大写字母,且后面要跟随至少一个参数
  2. 指令从上到下 顺序执行
  3. # 表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行DockerFile 的大致流程:
(1)docker从基础镜像运行一个容器 最少是个祖先镜像 scratch
(2)执行一条指令 并对镜像进行修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile的下一条指令直到所有指令都执行完成

小总结:

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

2.3、DockerFile 保留指令字
  1. FROM
    基础镜像 当前新镜像是基于哪个镜像

  2. MAINTAINER
    镜像维护者 姓名 和 邮箱

  3. RUN
    容器构建的时候 需要运行的命令
    比如 :RUN groupadd -r redis && useradd -r -g redis redis
    redis的dockerfile文件里边 就有创建分组和创建用户的命令

  4. EXPOSE
    当前镜像 对外暴露的端口号

  5. WORKDIR
    指定在创建容器后,终端默认登录进来的工作目录 默认是/ 根目录
    例如: WORKDIR /data
    就表示 登录之后 默认在/data 目录下

  6. ENV
    用来在构建镜像过程中设置环境变量
    例子:
    ENV MY_PATH /user/mytest
    这个环境变量可以在后续的任何RUN 指令中使用 这就如同命令前边 指定环境变量一样 也可以在其他指令中使用这些环境变量
    比如:WORKDIR $MY_PATH

  7. ADD
    将宿主机目录下的文件拷贝到镜像 ADD命令会自动处理URL 和 解压 tar 压缩包

  8. COPY
    将宿主机目录下的文件拷贝到镜像 不会处理
    COPY src dest
    COPY[“src”,“dest”]

  9. VOLUME
    容器数据卷 用于数据保存和持久化工作 会自动创建指定文件(如果没有)
    指定文件就可以用来做数据共享

  10. CMD
    指定一个容器 启动时要运行的命令
    可以有多个CMD 但是 只有最后一个生效 ,而且 CMD会被docker run 之后的参数替换 可怜的像一个备胎一样
    在这里插入图片描述

  11. ENTRYPOINT
    与 CMD一样 但是人家是正式男朋友 不能当备胎 不会被run 后的参数 替换

  12. ONBUILD
    当构建一个被继承的dockerfile时,父镜像被子镜像继承后,父镜像的onbuild被触发
    小结:
    在这里插入图片描述

2.4、DockerFile 案例
  1. base镜像(scratch) 99% 镜像都是通过在base镜像中安装与配置需要的软件构建出来的
  2. 自定义镜像
    (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 常用安装

步骤:

  1. 搜索镜像
  2. 拉去镜像
  3. 查看镜像
  4. 启动镜像(容器)
  5. 停止容器
  6. 移除容器

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

  1. 注册账号 lmtest
    自己仓库空空 https://cloud.docker.com/repository/list
    在这里插入图片描述
  2. docker login 登录 输入密码
  3. 推送镜像的规范是:ocker push 注册用户名/镜像名 所以我们第一步就是要修改自己的镜像
  4. 比如我们有一个镜像是 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内容写:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36291682/article/details/88357765