Docker笔记:基本概念、镜像、容器、仓库以及数据卷的使用

什么是docker

  • docker 是一个开源的应用容器引擎
  • 可以使用docker将应用程序和依赖打包到一个镜像之中
  • 可以非常方便的移植到其他机器上运行
  • 使用docker构建打包我们的应用(build),之后可以像集装箱一样很方便的传输到别的机器上(ship),可以在任何环境下运行我们的应用程序
  • 用官方的话概况为:Build, Ship, and Run Any App, Anywhere
  • docker可以运行在物理机、虚拟机、云平台、笔记本,我们不用担心环境的变化导致程序不能正常运行的问题
  • 语言或框架在不同版本之间会存在很大差别, 如果要部署不同版本依赖的应用,将增加运维的复杂程度,容器技术的发展很好的解决了这一问题
  • 容器技术可以让我们大规模的部署应用:
    • 早在2016年,京东就将全部流量运行在docker之上,运行容器达到15万个,docker完美支持了618的大促销
    • 阿里这边也使用了几十万个docker来提供服务
  • 我们也可以把docker来当成虚拟机来使用

docker与虚拟机

  • 虚拟机可以在一台物理机上运行多个操作系统
  • 虚拟机是完全虚拟出一整套的硬件设备,里面的每个操作系统都是完整的
  • docker容器则非常简单,应用进程直接运行在物理机的内核上,docker容器上面没有内核,只有应用
  • docker不需要硬件虚拟,容器要比传统的虚拟机更轻便,效率更高,性能接近原生
  • 可以在单台物理机上可以启动上千个docker容器(要看物理机的具体配置)
  • docker容器技术被应用在自动化打包发布, 自动化测试, 持续集成, 以及快速的部署应用

docker的一些基本概念

1 ) Image 镜像

  • 镜像是一个特殊的文件系统,是个虚拟的概念,是多层文件系统联合组成的
  • 镜像构建好后,基本不去改变它

2 ) Container 容器

  • 将docker镜像运行后就会产生一个容器
  • 容器的本质是进程,每个容器都有属于自己的独立命名空间,也就是容器内运行的进程运行在一个隔离的环境中,感觉上就是一个独立的操作系统
  • 可以在同一个镜像上启动多个容器,每个容器之间也是相互独立的,如果多个容器同时修改镜像上的一个文件也不会导致冲突
  • 镜像是分层文件系统,一个镜像构建好后是不会发生改变的,所以不会造成冲突
  • 通过镜像启动容器后,容器会创造一个临时的存储层,当容器被删除时,存储层也会随之消失
  • 在使用容器的时候,不要在容器内部保存一些数据,我们会使用数据卷来存放数据

3 ) Repository 仓库

  • 仓库是用于存储镜像的,构建好镜像后,将镜像文件保存在仓库之中
  • 每个仓库可以包含多个标签,每个标签对应着一个镜像
  • 比如制作一个叫ubuntu的镜像,我们可以用ubuntu:15.01表示我们的镜像,15.01就是标签(tag)
  • 如果在构建镜像的时候,没有写标签,docker会使用一个latest来作为默认的标签

docker的安装

1 ) docker版本

  • CE 社区版 Community Edition (免费)
  • EE 企业版 Enterprise Edition (收费)
  • 支持各大流行操作系统:linux、windows、macos等
  • 我们在这里只记录在linux上的安装和使用

2 ) docker的安装

  • 我们选择安装社区版
  • 在docker官方文档上:docs.docker.com 点击左侧Get Docker 找到 Docker CE 下的Ubuntu文档
  • 首先要更新apt, $ sudo apt-get update
  • 然后安装docker所需要的一些依赖:
    sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
    
  • 第三步, 添加docker的官方GPG key, $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 第四步, 验证下key, $ sudo apt-key fingerprint 0EBFCD88 和 官方一致,则表示成功了
  • 第五步, 添加docker仓库
    sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
    
  • 第六步, 正式安装docker
    • 先update, $ sudo apt-get update
    • 使用apt进行安装, $ sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 第七步, 查看docker版本, $ docker --version

docker服务管理

  • $ service docker stop 停止
  • $ service docker start 开启
  • $ service docker restart 重启

查看docker其他基础命令

  • $ docker info 查看docker更多信息
  • $ docker --help 查看docker帮助文档

docker的镜像管理

1 ) Image 镜像仓库

  • hub.docker.com

    • 是docker官方的镜像仓库,也是我们最常用的镜像仓库
    • 点击explore进入: hub.docker.com/explore 可以搜索我们想要的docker镜像
    • 如果想要ubuntu操作系统镜像,只需要搜索 ubuntu 即可,我们可以通过 docker pull 来拉取这个镜像 $ docker pull ubuntu
    • 每个镜像都有一个标签,我们可以拉取特定版本的镜像,如:$ docker pull ubuntu:17.10
    • 我们也可以拉取 alpine 镜像, 这个镜像也是一个linux的操作系统镜像 $ docker pull alpine 没有指定标签, 默认拉取latest标签
  • dev.aliyun.com

    • 如果docker镜像下载的非常慢, 我们可以指定国内的阿里云服务器
    • 进入dev.aliyun.com登录后进入管理中心, 进入容器镜像服务, 点进镜像加速器,选择对应的操作系统如Ubuntu, 复制并执行
      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
          "registry-mirrors":["https://bwxenga6.mirror.aliyuncs.com"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker
      
    • 执行完成后,docker就默认在阿里云上拉取镜像了,速度会提升很多

2 ) Image 镜像管理的相关命令

  • 在docker中,所有的镜像相关的操作都封装在 docker image 这个命令下
  • 查看当前已经拉取的镜像 $ docker image ls 或 $ docker images
    REPOSITORY     TAG          IMAGE ID        CREATED          SIZE
    alpine         latest       3fd9065eaf02    3 months ago     4.15MB
    
  • $ docker pull 命令等同于 $ docker image pull
    • $ docker image pull hello-world
    • hello-world 是docker提供用于测试的镜像
  • 删除 hello-world镜像, $ docker image rm hello-world 或 $ docker rmi hello-world
  • 其他命令通过 $ docker 或 $ docker --help 或 $ docker image pull --help 等 来查看具体使用

docker的Container容器管理的相关命令

  • 在docker中将一个镜像运行起来就可以创造一个新的容器
  • $ docker container 用于所有容器相关的管理命令
  • $ docker container ls 列出所有容器
  • $ docker container rm 删除一个或多个容器
  • $ docker container run 在一个新容器中运行一条命令
  • $ docker container stop 停止一个或多个运行中的容器
  • $ docker container kill 强制结束一个或多个运行中的容器

具体示例:

  • $ docker container run alpine echo "hello docker" 通过运行一个镜像得到一个容器
    • alpine是一个linux操作系统
    • echo “hello docker” 是将在alpine上执行的一条命令
    • 这时候我们已经成功的运行了一个容器
    • 如果alpine这个镜像文件不存在,docker会自动pull这个镜像
    • 这行命令表示在alpine镜像所启动的容器里面执行一句指令echo “hello docker”
    • docker container run 还可以省略成 docker run 即:$docker run alpine echo "hello docker"
    • 当前容器在执行完这条命令时,便自动停止
  • 列出当前启动的容器, $ docker container ls 或 $ docker ps
  • 列出所有容器, $ docker container ls -a 或 $ docker ps -a
  • 删除容器:$ docker container rm 容器ID
  • 运行一个不会自动停止的命令 $ docker run alpine ping www.baidu.com,ctrl + c结束容器运行
  • 在实际应用中,我们有大量的服务需要长时间运行, 我们可以使用-d的选项,让容器以后台服务的方式长时间的运行
    • 如:$ docker run -d alpine ping www.baidu.com 打印了一个容器ID,没有占用终端,以一个服务的方式来启动了我们的容器
    • 我们需要停止这个容器时,就可以通过 $ docker stop 容器ID, 可能需要等待一些时间,很快
  • 在实际使用中, 每次run之后就会产生一个新的容器, 有大量的容器在运行结束后,并不需要保留,我们可以使用 --rm 选项来回收(自动删除)
    • 如:$ docker run --rm alpine echo "hello docker"
    • 自动删除选项会将在容器中产生的数据一并删除,如果要持久保存容器中的数据,就要用到数据卷的方式
  • 大多数情况下,我们需要容器一直运行着对外提供服务,即容器以一个服务的方式来运行,我们以后来说明

docker中volume数据卷的使用

  • 在一个镜像上运行一个容器的时候,容器会创建一个临时的存储层, 来临时的保存容器中所产生的数据,当容器被删除时, 存储层同时被删除
  • 为了将容器中产生的数据及时保留下来,可以将物理机中的一个目录映射到容器中去,容器会在这个映射后的目录中保存数据,同时会永久的保存在物理机上,而不会随着容器的消失而消失
  • 目录的映射 $ docker run -v
    • 启动一个容器:$ docker run --rm -v /root:/data alpine touch /data/test.txt
    • 将物理机上的/root目录映射到容器中的/data目录
    • 执行完毕后,发现在物理机/root目录下存在一个test.txt文件
    • 可以优化指令:$ docker run --rm -v $(pwd):/data alpine touch /data/test.txt
    • 这条命令是说将当前目录映射到/data目录中去, 如果当前目录有空格,需要加上"", 即:
    • $ docker run --rm -v "$(pwd):/data" alpine touch /data/test.txt 这里在映射的关系上加上双引号
    • 还有一种只读挂载的方式: $ docker run --rm -v $(pwd):/data:ro alpine touch /data/test2.txt
    • 这里的ro表示readonly 只读的映射
发布了403 篇原创文章 · 获赞 198 · 访问量 69万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/104213564