Docker

164 阅读4分钟

Docker

1.Docker镜像(Image)就是一个只读模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器
容器就是一个对象,镜像就是一个类

Student s1 = new Student() Student s2=new Student() Student s3=new Student()

就是相当于3个容器,Student 就是一个模板,镜像。

仓库就是存放镜像地方
官方总结:

Dokcer 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。

它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的Linux环境。

为什么要用Docker

1.更轻量:基于容器的虚拟化,仅包含业务运行所需的runtime环境,CentOS/Ubuntu基础镜像仅170M;宿主机可部署100-1000个容器
2.更高效:无操作系统虚拟化开销
3.更敏捷、更灵活
容器是一个简易版的Linux虚拟机环境,去掉了一些硬件。

有镜像才能创建容器,这是根本前提

1.新建并启动容器:
docker run [options] image[command][arg...]
options说明(常用):有些是一个减号,有些是两个减号

–name= "容器新名字"为容器指定一个名称

-d:后台运行容器,并返回容器Id,也即启动守护式容器

-i :以交互模式运行容器,通常与 -t 同时使用

-t :为容器重新分配一个伪输入终端,通常与 -i同时使用;

-P : 随机端口映射

-p : 指定端口映射,有以下四种格式

​ ip:hostPort:containerPort

​ ip::containerPort

​ hostPort:containerPort

​ containerPort

1561601187780

docker run -it  imageid  交互式启动dockers镜像生成容器实例
docker ps   列出所有正在运行的容器 查看装了哪些集装箱 也就是容器

1561604059455

docker ps [options]

options说明常用:

-a :列出当前所有正在运行的容器+历史运行过的

-l: 显示最近创建的容器

-n: 显示最近n个创建的容器

docker ps - n 3 最近3个

-q: 静默模式,只显示容器编号

–no-trunc:不截断输出

退出容器 两种方式

1.exit 容器停止退出

2.ctrl +P+Q 容器不停止退出

进入正在运行的容器并以命令行交互

docker exec -it 容器id ls -l /tmp 可以在外面看结果,不用进去,而attach得进入里面

docker exec -it 容器ID bashShell
重新进入docker attach 容器ID
上述两个区别:attach直接进入容器启动命令的终端,不会启动新的进程
exec是在容器中打开新的终端,并且可以启动新的进程

启动容器

docker start 容器实例id或者名称

docker restart

停止容器 docker stop 强制停止 docker kill

删除已经停止的容器

docker rm 容器Id 删除已经关闭的

docker rm f 容器id 强制删除

docker rmi 删除镜像

一次性删除多个容器

docker rm -f $(docker ps -a -q)

docker ps -a -q|xargs docker rm

以后台模式启动一个容器

启动守护式容器

docker run -d centos
问题:然后 docker ps -a 进行查看,会发现容器已经退出,很重要得要说明一点:Docker容器后台运行,就必须有一个前台进程。容器运行得命令如果不是那些一直挂起得命令(比如运行top,tail),就是会自动退出得。
这个dockers的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如 service nginx start 但是,这样做nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀,因为他觉得他没事可做了,所以最佳的解决方案是,将你要运行的程序以前台进程的形式进行

查看容器日志

docker logs -f -t --tail 容器ID

-t 是加入时间戳   -f 跟随最新的日志打印    --tail数字显示最后多少条

docker logs -f -t --tail 3 最后三条

查看容器内运行的进程 docker top 容器ID

查看容器内部细节 docker inspect 容器ID

从容器内拷贝文件到主机上 docker cp 容器id:路径 路径

1561618653984

镜像:镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

docker run -it -p 8888:8080 tomcat 启动tomcat

-p 是对外暴露端口

p主机端口号:docker容器端口号

-P是随机分配 i:交互 t:终端

Docker 数据卷同步 docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 没有限制

Docker 数据卷同步 docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 没有限制 有保护限制

DockerFile 体系结构(保留字指令) 必须全部大写

FORM 基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER 镜像维护者的新名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对象对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量一样;
也可以在其他指令中直接使用这些环境变量
比如   :  WORKDIR $MY_PATH
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令 Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令 ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

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

FROM centos
MAINTAINER HYF

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------ok"
CMD /bin/bash 
FROM centos
MAINTAINER hyf
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把Java与tomcat 添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登陆落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置Java 与tomcat 环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/LIB:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
docker run -d -p 9080:8080 --name myt11 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzyytomcat9