docker入门

为什么会有docker?

软件可以带环境安装.也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。

docker入门

简单的说就是我们把代码,环境,配置,依赖包等等打包。

只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作

如何工作?

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境。

docker入门

和虚拟机的区别

(1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。如下图,右边是docker,可以发现共用了Operating System。

(2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。

docker入门

docker入门

常用命令

docker images  列出本地的镜像

dokcer search  搜索镜像

dokcer pull 镜像名:版本     版本省略的话默认latest

docker rmi  删除镜像

docker run image  新建并且启动容器

一般用 docker run -it image /bin/.bash  使用镜像以交互模式启动一个容器,在容器内执行/bin/bash命令。

docker top 容器id  查看容器内运行的镜像

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

docker ps    列出正在运行的容器

exit 容器停止退出

ctrl+P+Q  不停止退出

docker start 启动

docker restart 重新启动

docker stop 停止容器

docker kill  强制停止

docker attach 进入容器

docker exec  在容器中打开终端,可以启动新进程,简单的说就是,可以不进入容器,对容器进行操作

docker rm 删除

docker cp 容器id:容器内路径  目的主机路径

Docker镜像

镜像是一个联合文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加。简单来说就是一个镜像里面是包含了多个镜像的。

加载原理

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

docker入门

这就是为什么docker中的Centos都才几百m的原因。因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。

怎么证明是镜像是分层的?

docker入门

我们下载一个镜像的时候都会下载很多镜像。

为什么要用分层结构?

共享资源! 如果很多镜像都要centos,那么宿主机只要保存一份,且内存也只要加载一份。

特点

镜像都是只读的,如果要实现可读可写,那么就需要在镜像上面加上一层,容器层。

Docker容器数据卷

两个作用

1.对数据进行持久化,我们不可能对容器进行修改之后就提交容器形成一个新的镜像,这样麻烦。

2.数据的共享,可以和宿主机和其他的容器进行共享数据。

使用

1.docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash

docker入门

2.使用dockerfile

FROM centos

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

CMD echo "finished,--------success1"

CMD /bin/bash

 重点

VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

注意,这里没有设置宿主机的位置,只是设置了容器中的。这是出于可移植来考虑的,因为宿主机目录是依赖于宿主机的,我们不能保证宿主机都有这个目录把? 

那么宿主机的路径是什么?是随机的,我们可以在docker inspect 容器id 中查看

docker入门

DockerFile

用来构建Docker镜像的构建文件。

怎么构建?

1.编写dockerfile

2.docker build

3.docker run

构建的流程

1.docker从基础镜像运行一个容器, 其中有个一个最基本的镜像,所有镜像都是在他的基础上构建的。

2.执行一条指令对容器进行修改

3.commit形成一个新的镜像层

4.基于刚刚提交的镜像运行一个新容器

5.继续继续

从构建的步骤当中可以看到镜像是一层套着一层的。

指令

docker入门

例子

FROM centos

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

解释一下,centos最新版的作为基础镜像,以键值对的形式设置MYPATH。设置第一次进入容器时的路径为MYPATH。装vim 装 net-tools 开放接口80

最后执行命令 /bin/bash。这里注意一下,CMD只有最后一个是生效的。

第二个例子

 

构建一个tomcat

FROM         centos

MAINTAINER    zzyy<[email protected]>

#把宿主机当前上下文的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