docker的一点学习笔记

docker是什么

docker是操作系统级别(lxc内核虚拟化, 从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd )的虚拟化。docker隔离了进程,网络,进程交互,用户,并且可配额可度量。
在这里插入图片描述
在这里插入图片描述

为什么要用docker

  • 减少各种环境和软件的管理和配置。
  • 相对于虚拟机来说,更加高效和轻量。
  • docker隔离了进程,网络,进程交互,用户,并且可配额可度量。

安装、启动、HelloWorld

安装devicecmapper 和设置存储库

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
##发现官方存储库安装太慢,于是换了一个
####sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装最新版
sudo yum install docker-ce docker-ce-cli containerd.io
#安装特定版本
yum list docker-ce --showduplicates | sort -r 
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

卸载移除

#卸载
sudo yum remove docker-ce
#删除所有镜像
sudo rm -rf /var/lib/docker

启动服务

sudo systemctl start docker

运行hello-world

 sudo docker run hello-world

概念与命令

分层存储:
  • 因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构
  • 所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成
  • 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
docker镜像(image):
  • 在分层存储的基础上。通过 docker history image:tag 可以列出各个层的创建信息。
  • docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
  • 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
docker容器(container):
  • 容器就是一个进程,容器依托于镜像存在,运行镜像之后产生的进程就叫容器。容器的配置又可以打包为新的镜像,从而在其他地方运行该镜像之后一个与原容器一致的容器环境。镜像可以运行为多个容器,容器可以打包为多个镜像。
  • 与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
  • 容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
  • 每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
p.s 说明与相关命令:
  • 搞清镜像和容器的概念和关系可以更容易理解相关的命令
  • docker --help 可以看到有哪些命令,如docker run,而 docker command --help可以看到命令的具体用法,如docker run --help docker image ls --help
  • 命令:
    • docker版本和信息
    docker --version     # docker版本
    docker info    # docker详细信息,包括docker版本等
    docker system df # 查看镜像,容器,数据卷所占空间.
    
    • 首先得有镜像,相关命令
    #除官方镜像, 镜像名格式为 username/name:tag ; 官方为library。也可以在hub.docker.com查找镜像
    docker search <image name>
    #拉取镜像  
    docker pull imagename:version/tag
    #使用dockerfile建立镜像 
    docker build --tag=test ./   
    
    • 查看与操作镜像
     #标记镜像
    docker tag iamge[如friendlyhello] gordon/get-started:part2 
     #列出镜像,docker image 之后的参数类似shell的 
    docker image ls  -a 
    #说明:列表中的镜像体积总和并非是所有镜像实际硬盘消耗,由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层.由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多
    #说明:可能会列出无标签的中间层镜像,这些不必要删除,是其他镜像所依赖的镜像,由于docker会把相同的层只存一遍,而这些镜像是别的镜像的依赖,因此并不会列出来而多存一份.删除顶层镜像之后会自动删除这些镜像
    #===============
    #移除镜像,常用 docker rmi 
    docker image rm <image id>  
    # 取到镜像的id,对于某些操作常用,如, 删除仓库名为redis的镜像,可用  docker image rm $(docker image ls -q redis)    
    docker image ls -q 
    #移除所有镜像,容器操作类似
    docker image rm $(docker image ls -a -q) 
    # 查看镜像历史和详细信息
    docker history  image:tag/imageid
    docker inspect image:tag/imageid
    #删除虚悬镜像。docker image ls 中出现的  <none>  <none>  称为虚悬镜像<dangling image>
    docker image prune   
    # 导入镜像文件
    docker load 
    
    • 运行镜像到容器。
      docker run [options] [imagename:tag] cmd args  
      
      • 镜像imagename:tag 不存在本地时,会尝试进行镜像search和pull 到本地
      • 常用options参数说明:
        • --restart=always docker启动的时候启动,避免docker自启动之后,容器没有启动
        • -i -t交互的模式-d` 后台运行
        • -p localPort:dockerPort 端口映射,可多个
        • -v 数据卷映射,可多个
        • --name 指定运行的容器名称
        • --rm 停止容器时移除容器,不加此参数,则停止容器之后,如果不再需要该容器,需要手动删除(运行镜像为容器之后,可以对这个容器更改,更改之后重新运行该【容器】,还是生效的)
        • --net 网络模式,host bridge
      • cmd 在容器启动之后可以让容器运行一些命令,如果需要多个命令,使用 sh -c,如 sh -c "/usr/src/nexus/bin/nexus start && echo 'hello world' && /bin/bash"
    • 容器操作
    #列出运行中容器,所有[-a],docker container 之后的参数类似shell的 
    #常用为 docker ps
    docker container ls
    # 运行,停止,移除,重启等 常用为  docker start containerId|containerName
    docker container stop|start|restart|rm containerId|containerName
    #docker container stop $(docker container ls -q) 
    #docker container rm $(docker container ls -a -q) 
    #docker container rm `docker container ls -a -q`
    # 进入一个运行中的容器
    docker attach containerId
    # 让容器运行命令
    # 进入容器,sudo docker exec -it containerName/bin/bash
    docker container exec 
    # 容器与本地文件系统之间复制文件
    docker container cp
    # 容器信息
    docker cotainer inspect 
    # 将容器提交为镜像
    docker container commit 
    

Dockerfile与镜像的构建

我们常用镜像可以通过 docker pull,如果需要自定义可以通过容器 修改后commit为自己需要的镜像,但是还有一种常用方式是通过Dockerfile进行build。Dockerfile是一个包含用户能够构建镜像的所有命令的文本文档,它有自己的语法以及命令,docker能够从dockerfile中读取指令自动的构建镜像!

dockerfile规则:
FROM

FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
指定基础镜像,当前镜像是基于哪个镜像创建的,有点类似java中的类继承。FROM指令必是Dockerfile文件中的首条命令。

MAINTAINER

MAINTAINER <name>
镜像维护者的信息,该命令已经被标记为不推荐使用了。

LABEL

LABEL <key>=<value> <key>=<value> <key>=<value> ...
给镜像添加元数据,可以用LABEL命令替换MAINTAINER命令。指定一些作者、邮箱等信息。

ENV

ENV <key> <value>
ENV <key>=<value> ...
设置环境变量,设置的变量可供后面指令使用。跟java中定义变量差不多的意思!

WORKDIR

WORKDIR /path/to/workdir
设置工作目录,在该指令后的RUN、CMD、ENTRYPOINT, COPY、ADD指令都会在该目录执行。如果该目录不存在,则会创建!

RUN

RUN <command>
RUN ["executable", "param1", "param2"]
RUN会在当前镜像的最上面创建一个新层,并且能执行任何的命令,然后对执行的结果进行提交。提交后的结果镜像在dockerfile的后续步骤中可以使用。

ADD

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
从宿主机拷贝文件或者文件夹到镜像,也可以复制一个网络文件!如果拷贝的文件是一个压缩包,会自动解压缩!

COPY

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
从宿主机拷贝文件或者文件夹到镜像,不能复制网络文件也不会自动解压缩!

VOLUME

VOLUME ["/data"]
VOLUME用于创建挂载点,一般配合run命令的-v参数使用。

EXPOSE

EXPOSE <port> [<port>/<protocol>...]
指定容器运行时对外暴露的端口,但是该指定实际上不会发布该端口,它的功能是镜像构建者和容器运行者之间的记录文件。
回到容器命令中的run命令部分,run命令有-p和-P两个参数,如果是-P就是随机端口映射,容器内会随机映射到EXPOSE指定的端口,如果是-p就是指定端口映射,告诉运维人员容器内需要映射的端口号。

CMD

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
指定容器启动时默认运行的命令,在一个Dockerfile文件中,如果有多个CMD命令,只有一个最后一个会生效!同样是可以执行命令,可能你会觉得跟上面的RUN指令很相似,RUN指令是在构建镜像时候执行的,而CMD指令是在每次容器运行的时候执行的!docker run命令会覆盖CMD的命令!

ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
这个指令与CMD指令类似,都是指定启动容器时要运行的命令,如果指定了ENTRYPOINT,则CMD指定的命令不会执行!在一个Dockerfile文件中,如果有多个ENTRYPOINT命令,也只有一个最后一个会生效!不同的是通过docker run command命令会覆盖CMD的命令!执行的命令不会覆盖ENTRYPOINT,docker run命令中指定的任何参数都会被当做参数传递给ENTRYPOINT!

P.S RUN、CMD、ENTRYPOINT区别
  • 1、RUN指令是在镜像构建时运行,而后两个是在容器启动时执行!
  • 2、CMD指令设置的命令是容器启动时默认运行的命令,如果docker run没有指定任何的命令,并且Dockerfile中没有指定ENTRYPOINT,那容器启动的时候就会执行CMD指定的命令!有点类似代码中的缺省参数!
  • 3、如果设置了ENTRYPOINT指令,则优先使用!并且可以通过docker run给该指令设置的命令传参!
  • 4、CMD有点类似代码中的缺省参数

可以在github上找几个Dockerfile参考和尝试,例如tomcat或helloworld的
tomcat的dockerfile文件
dockercloud-hello-world

不是标准的一次使用

学了镜像的制作之后,我自己刚好有一种需求:自己有一个配置较低的云服务器,没有什么特殊用途,就放个nexus、git一些服务,但是有时(每年)可能就换服务器了,那么这些程序又要重新去安装。我想,能否将自己需要的一些服务集合到一个镜像里,这样我每次更换服务器只需要把镜像和一个数据文件夹移出来。于是我打算使用上面的两种镜像构建方式都做一下

容器管理kubernetes(k8s)

管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效

笔记来源:

Docker — 从入门到实践
看完此文,妈妈还会担心你docker入不了门?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值