镜像 commit

下载 tomcat 镜像并运行

  1. docker run -it -p 8888:8080 tomcat
  2. docker run -it -P tomcat //-P随机端口

容器数据卷

概念

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。

特点
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷


特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止

添加

直接命令添加

添加数据卷(数据目录挂载)

  1. //注意写法
  2. docker run -di -v /宿主机绝对路径目录:/容器内目录 centos
  3. docker run -it -v /myDataVolume:/dataVolumeContainer centos

查看数据是否挂载成功

  1. 查看容器内部详情
  2. docker inspect id

DockerFile添加

1.根目录下新建mydocker文件夹并进入

  1. cd /
  2. mkdir mydocker
  3. cd /mydocker

2.创建Dockerfile文件
可以使用VOLUME指令来给镜像添加一个或多个数据卷

  1. VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
  1. # volume test
  2. FROM centos
  3. VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
  4. CMD echo "finished,--------success1"
  5. CMD /bin/bash

3.build后生成镜像

  1. docker build [选项] <上下文路径/URL/->
  1. docker build -f /mydocker/Dockerfile1 -t chu/centos . // .是当前文件夹
  2. 参数说明
  3. --tag,-t //Name and optionally a tag in the 'name:tag' format 标签
  4. --file,-f //允许指定要使用替代文件的路径

image.png

4.run容器

  1. docker run -it chu/centos /bin/bash

可以看到我们容器内已经有卷目录地址。
image.png

通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址?

  1. docker inspect 容器id

DockerFile 解析

概念

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建三步骤
编写Dockerfile文件 -> docker build -> docker run

文件长什么样
以centos 为例 https://hub.docker.com/_/centos/
image.png

构建过程解析

DockerFile 内容基础知识

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  2. 指令按照丛上到下顺序执行
  3. 表示注释

  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交 (history)

Docker执行Dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

DockerFile 保留字指令

image.png

image.png

案例

Base镜像(scratch)
Docker Hub中 99% 的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。

自定义镜像 mycentos
官方的centos中是精简版本的,没有安装ifconfig,vim。自定义镜像要求 登录后的默认路径,vim,ifconfig

自定义 tomcat9

  1. FROM centos
  2. MAINTAINER chu<chu@qq.com>
  3. #把宿主机当前上下文的c.txt 拷贝到容器 /usr/local/ 路径下
  4. COPY c.txt /usr/local/cincontainer.txt
  5. #把java与tomcat添加到容器中
  6. ADD jdk-8u171-linux-x64.tar.gz /usr/local/
  7. ADD apache-tomcat-9.0.8.tar.gz /usr/local/
  8. #安装vim编辑器
  9. RUN yum -y install vim
  10. #设置工作访问时候的WORKDIR路径,登录落脚点
  11. ENV MYPATH /usr/local
  12. WORKDIR $MYPATH
  13. #配置java与tomcat环境变量
  14. ENV JAVA_HOME /usr/local/jdk1.8.0_171
  15. ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  16. ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
  17. ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
  18. ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
  19. #容器运行时监听的端口
  20. EXPOSE 8080
  21. #启动时运行tomcat
  22. # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
  23. # CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
  24. CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
  1. docker run -d -p 9080:8080 --name myt9 -v /mydocker/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /mydocker/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true chutomcat9

image.png

在外面执行容器里面

  1. docker exec 容器id ls -l

Docker 常用安装

mysql

  1. docker search mysql
  2. docker pull mysql:5.6
  3. docker run -p 12345:3306 --name mysql -v /mydocker/mysql/conf:/etc/mysql/conf.d -v /mydocker/mysql/logs:/logs -v /mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

进入容器操作
image.png

本地镜像推送到阿里云
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcr.console.aliyun.com%2F&lang=zh

将镜像推送到Registry

  1. $ docker login --username=21147****@qq.com registry.cn-hangzhou.aliyuncs.com
  2. $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/doaremon/mycentos:[镜像版本号]
  3. $ docker push registry.cn-hangzhou.aliyuncs.com/doaremon/mycentos:[镜像版本号]

image.png

删除本地镜像

  1. docker rmi -f registry.cn-hangzhou.aliyuncs.com/doaremon/mycentos:1.1

https://segmentfault.com/a/1190000022274697


DockerFile
容器数据卷用 dockerFile 文件添加

vim Dockerfile

  1. # volume test
  2. FROM centos
  3. VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
  4. CMD echo "finished,--------success1"
  5. CMD /bin/bash
  6. build后生成镜像
  7. docker build -f /mydocker/Dockerfile -t zzyy/centos .

image.png

image.png

  1. //创建容器
  2. docker run -it zzyy/centos

可以看到这个容器中已经有目录了
image.png

退出容器 crtr p + Q

Docker file 文件解析

  1. FROM centos
  2. MAINTAINER chu<chu@qq.com>
  3. ENV mypath /tmp
  4. WORKDIR $mypath
  5. RUN yum -y install vim
  6. RUN yum -y install net-tools
  7. EXPOSE 80
  8. CMD echo "success...."
  9. CMD /bin/bash
  1. docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .

image.png
image.png

创建容器
image.png

  1. FROM centos
  2. RUN yum install -y curl
  3. CMD ['curl','-s','http://ip.cn']
  1. docker build -f /mydocker/Dockerfile3 -t myip .

命令行叠加

  1. cp Dockerfile3 Dockerfile4
  2. FROM centos
  3. RUN yum install -y curl
  4. ENTRYPOINT ['curl','-s','http://ip.cn']
  1. docker build -f /mydocker/Dockerfile4 -t myip2 .
  1. docker run myip2

观看记录
https://www.bilibili.com/video/BV1Ls411n7mx?p=28&spm_id_from=pageDriver