文章目录
1、基础
-
docker是一种轻量级的虚拟化技术,也是应用容器引擎。基于go语言。
-
优点:
1、可以创建很多轻量级、可移植的和独立的容器,一般而言,一个容器就相当于一个应用,符合微服务思想。
2、相对于虚拟机,
占用资源很少,docker直接运行在宿主机的内核,vm则有完整的操作系统;
运行速度非常快,启动和停止是秒级别;虚拟机,都是分钟级别的,需要加载os,内核等。
非常方便进行快速部署和扩展。符合DevOps思想。
-
架构图
Docker是C/S结构
C: 我们平时在linux输入的命令docker就是使用client客户端
S: Docker Daemon是Docker架构中运行在后台的守护进程,大致可以分为4个部分,具体可见docker笔记-进阶版。除了docker服务器与docke客户端通信,还可以使用Remote API与S端Daemon守护进程进行交互。 -
三要素,镜像,容器和仓库;层
镜像:生成容器模本(源代码)。由多个只读层组成。与容器的唯一区别是,容器在这些只读层上面添加了一层可读写的容器层。最底层为bootfs,然后rootfs,再往上就是各种镜像层。
容器:镜像的一个实例;由只读镜像层和可读写容器层组成。表现为一个微型操作系统和一个(组)应用。由守护进程根据镜像产生。
仓库:用于存放镜像。私有仓库和公共仓库。
层:联合文件系统支持,Dockerfile中的一条指令就会创建一个层。基于某个容器进行修改之后commit为新的镜像,也会增加一层。
镜像与容器的区别,镜像由一层层只读层堆在一起,容器为镜像只读层(镜像层)+读写层(容器层)。
层的概念:
当你在一个容器中进行了某些操作比如添加了一个文件,然后调用docker commit操作创建新的镜像时,Docker会在镜像栈的最上面创建一个新的层,这个层包含了新添加的文件。或者,通过Dockerfile创建新的镜像时,通过FROM指令指定的就是基础镜像。此后的每条指令都会创建一个新的层,层中包含了这条指令对镜像的修改。一个镜像的大致分层结构
Dockerfile、镜像和容器的示意图
FROM ubuntu:14.04 :设置基础镜像,此时会使用基础镜像ubuntu:14.04的所有镜像层,为简单起见,图中将其作为一个整体展示。
ADD run.sh /:将Dockerfile所在目录的文件run.sh加至镜像的根目录,此时新一层的镜像只有一项内容,即根目录下的run.sh.
VOLUME /data:设定镜像的VOLUME,此VOLUME在容器内部的路径为/data。需要注意的是,此时并未在新一层的镜像中添加任何文件,但更新了镜像的json文件,以便通过此镜像启动容器时获取这方面的信息。
CMD ["./run.sh"]:设置镜像的默认执行入口,此命令同样不会在新建镜像中添加任何文件,仅仅在上一层镜像json文件的基础上更新新建镜像的json文件。
-
docker容器与虚拟机
-
docker底层原理
Linux Namespaces机制提供一种资源隔离方案,相当于一个独立的环境。而在用户层面上只能看到属于用户自己namespace下的资源。比如自己的pid数字,其他容器也可以一样。
cgroup:它以一组进程为目标进行系统资源分配和控制。
2、命令
-
安装Docker
# 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装docker yum -y install docker # 安装docker指定版本 yum install docker-ce-18.03.1.ce-1.el7.centos # 删除docker yum list installed | grep -i docker yum remove -y containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64 # 开机自启 systemctl enable docker # 开机不启动 systemctl disable docker # 启动docker服务 systemctl start docker # 停止docker服务 systemctl stop docker # 重启docker服务 systemctl restart docker # 查看docker基本信息 (查看阿里云地址,容器的运行情况等) docker info # 查看docker版本 docker version # 阿里云控制台搜索容器镜像服务 vim /etc/docker/daemon.json { "registry-mirrors": ["https://xddehuq4.mirror.aliyuncs.com"] } # 重启docker systemctl daemon-reload systemctl restart docker
-
docker镜像命令
# 下载镜像:docker pull <镜像名:tag> 如:下载tomcat镜像 docker pull tomcat:7 # 查看本地镜像库,已经下载的 docker images # 从远程仓库查找镜像 docker search httpd # 删除本地某个镜像 docker rmi hello-world # 删除本地所有镜像 docker rmi $(docker images -aq) docker rmi `docker images -aq` docker images -aq | xargs docker rmi # 构建镜像 vim Dockerfile docker build -t qsm/jdk:v1 . # 镜像打标签,并且可以复制并重新命名 docker tag centos centos:v1
-
docker容器命令
# 列出运行容器 -a 所有 docker ps # 创建并且启动容器 -it/-id 进入/后台守护 -p端口映射 -v 目录挂载 docker run -it -p 8888:8080 --name qsmtomcat2 -v /local/tomcat/webapps/ /usr/local/tomcat/webapps tomcat镜像id # 查看容器应用日志 docker logs 容器id # 查看容器进程 docker top 容器id # 查看容器信息,例如ip docker inspect 容器id # 进入容器 docker exec -it 容器id docker attach 容器id # 退出容器 exit(-it 进入,会关闭容器,exec进入不会),ctrl+p+q # 启动容器 docker start 容器id # 重启容器 docker restart 容器id # 停止容器 docker stop 容器id docker kill 容器id # 删除容器 -f 若是在运行 docker rm 容器id # 删除所有容器 docker rm $(docker ps -aq) docker rm `docker ps -aq` # 拷贝 docker cp /root/tomcat 容器id:/usr/tomcat docker cp 容器id:/usr/tomcat /root/tomcat # 提交容器为镜像 docker commit -a='作者' -m='备注' 运行时容器id 新镜像名称:版本
3、DockerFile
-
Dockerfile 是用于构建镜像的命令脚本文件。
重点是:from run entrypoint cmd#基于centos镜像 FROM centos:7 #维护人的信息 下面2种选一即可 MAINTANIER www.qsm.com LABEL maintainer="qsm.cn" #设置环境内环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_45 #add COPY 都是拷贝,但是add会解压 ADD jdk-8u45-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.0.46.tar.gz /usr/local COPY server.xml /usr/local/apache-tomcat-8.0.46/conf #构建镜像时运行的Shell命令 RUN rm -f /usr/local/*.tar.gz #工作目录,进入容器的默认目录 WORKDIR /usr/local/apache-tomcat-8.0.46 #开启8080端口 EXPOSE 8080 #挂载mount #VOLUME #类似于 CMD 指令,不会被覆盖。多个仅最后一个生效。cmd同时存在,作为entrypoint参数 ENTRYPOINT ["./bin/catalina.sh", "run"] #当启动docker run容器时执行的命令。可覆盖。多个仅最后一个生效。 CMD ["/run.sh"] #ONBUILD用于子镜像构建时执行父镜像的该命令 #ONBUILD
docker build -t qsm/jdk:v1 .
-
全景图
-
Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。主要用于单机。
本笔记为基础版,更多底层原理可以参考docker笔记-进阶版
【正在去BAT的路上修行!!!】