这里写自定义目录标题
Docker操作
Docker迁移和备份
有些项目对保密性要求很高,禁止在公网发布镜像,这就需要使用到迁移和备份命令。
备份镜像
docker save -o 备份镜像名称.tar 源镜像名称:tag版本
恢复镜像
docker load -i 备份镜像名称.tar
DockerFile简介
DockerFile本质上是脚本,它是由一系列命令和参数构成的脚本。这些命令应用于操作系统(centos或者Ubuntu)基础镜像并最终创建一个新的镜像。DockerFile使用脚本的方式自动化构建镜像,这种方式可复用、效率高,是企业级开发的首选方式。
在软件开发的生命周期终,采用Dockerfile来构建镜像有如下优点:
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
- 对于测试人员:可以直接拿开发构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;
- 对于运维人员:在部署时,可以实现应用的无缝移植。
Dockerfile常用指令
FROM image_name:tag
定义了使用哪个基础镜像启动构建过程;
MAINTAINER user_info
声明镜像维护者信息;
LABEL key value
镜像描述元信息(可以写多条);
ENV key value
设置环境变量(可以写多条);
RUN command
构建容器时需要运行的命令(可以写多条);
WORKDIR path_dir
设置终端登录进来的默认工作目录;
EXPOSE port
当前容器对外暴露的端口;
ADD source_dir/file dest_dir/file
将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压;
COPY source_dir/file dest_dir/file
和ADD相似,但是如果有压缩文件时不会解压;
VOLUME
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库或需要持久化的数据;
CMD
指定容器启动时要运行的命令,假如有多个CMD,最后一个生效;
ENTRYPOINT
指定容器启动时要运行的命令;
ONBUILD
当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发,可以把ONBUILD理解为一个触发器;
Dockerfile构建自定义centos镜像
- 自定义centos镜像的Dockerfile
FROM centos
MAINTAINER stone<pro_zxj@126.com>
LABEL name="stone's first CentOS Image" \
build-date="2020-03-11"
ENV WORKPATH /home/
WORKDIR $WORKPATH
RUN yum install -y net-tools
RUN yum install -y vim
EXPOSE 80
CMD /bin/bash
- 构建centos镜像
docker build -f mycentosDockerfile -t stone/mycentos:1.1 .
-f 指定Dockerfile
-t 打tag
末尾的英文句号不可少 - 查看镜像历史
docker history 镜像ID
Dockerfile构建自定义tomcat
练习ADD、COPY指令
先下载好jdk和tomcat,使用这两个包自行构建镜像
dockerfile
FROM centos
MAINTAINER stone<pro_zxj@126.com>
LABEL name="stone's first tomcat Image" \
build-date="2020-03-11"
# copy版权信息
COPY copyright.txt /home/copyright.txt
ADD server-jre-8u151-linux-x64.tar.gz /home/
ADD apache-tomcat-8.5.37.tar.gz /home/
ENV WORKPATH /home/apache-tomcat-8.5.37/
WORKDIR $WORKPATH
ENV JAVA_HOME /home/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /home/apache-tomcat-8.5.37/
ENV CATALINA_BASE /home/apache-tomcat-8.5.37/
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
EXPOSE 8080
CMD ["/home/apache-tomcat-8.5.37/bin/catalina.sh", "run"]
- 构建
docker build -t mytomcatDockerfile -t oranger008/tomcat:1.0
Dockerfile通过VOLUME实现容器卷
VOLUME [’/home/v1’,’/home/v2’]
使用docker inspect 容器id,查看容器卷对应的宿主机的目录。缺点宿主机目录不能指定,建议启动时使用-v参数。
Dockerfile中CMD和ENTRYPOINT的区别和联系
RUN是构建镜像时启动的命令。
CMD和ENTRYPOINT是容器启动时执行的命令,两者都支持exec和shell方式。一般用法:单独一个CMD;或者先ENTRYPOINT,然后和CMD结合使用。
假如有多个CMD、启动的时候带命令参数,会覆盖前面的CMD命令。
# exec的方式,可以跟多个参数,推荐
CMD ["catalina.sh", "run"]
*CMD语法:
CMD [“executable”, “param1”, “param2”] (exec形式,推荐)
CMD [“param1”, “param2”](作为ENTRYPOINT的默认参数)
CMD command param1 param2 (shell形式)
第一种用法:运行一个可执行的文件并提供参数;
第二种用法:为ENTRYPOINT指定参数;
第三种用法:shell形式,是以 " /bin/sh -c"的方法执行命令。
ENTRYPOINT语法:
ENTRYPOINT [“executable”, “param1”, “param2”](exec格式,推荐)
ENTRYPOINT command param1 param (shell格式)
docker run 后面可以跟一些命令,这种命令实际上时CMD,其也会覆盖dockerfile中的CMD命令或参数。
Dockerfile之ONBUILD
ONBUILD 当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发,可以把ONBUILD理解为一个触发器。
编写Dockerfile的时候,其他命令都是为了自身镜像服务的,只有ONBUILD是为了子镜像服务。
简单实例
FROM centos
ONBUILD RUN yum install -y vim
CMD /bin/bash
构建父镜像:
docker build -f parent_df -t oranger008/parent:1.1 .
子镜像Dockerfile:
FROM parent
ONBUILD在大型项目时很有用,大型项目一般在构建基础镜像时会使用到ONBUILD,一般时执行一些父镜像无法执行的东西,比如一些COPY ADD,可以启动一些服务,父镜像当作模版使用,仅仅提供基础支持,然后具体实际执行由子镜像来操作。
Docker私有仓库搭建
Docker私有仓库主要用来企业内部存储镜像,相对官方仓库或者阿里云仓库,具有更高的保密安全级别。
registry方式
- 拉取私有仓库镜像(私有仓库本身就是一个镜像)
- 启动私有仓库容器
docker run -id --name=myRegistry -p 5000:5000 registry
- 测试
http://localhost:5000/v2/_catalog
- 修改daemon.json(/etc/docker/daemon.json ),让docker信任私有仓库地址
"insecure-registries":["ip:5000"]
- 修改daemon.json配置文件后,重启docker
systemctl restart docker
Habor方式
docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求。