• Docker


    概念

    下面这三个概念一开始可能不好理解,等大家跟着博客把例子做完了,再回头来看应该就能理解了。

    docker image  # docker镜像
    镜像就是一个只读的模板。镜像可以用来创建Docker容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

    docker container  # docker容器
    容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
    可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

    docker repository  # docker仓库
    仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

    docker安装

    系统要求(下段英文截取至官方文档)
    OS requirements
    To install Docker CE, you need a maintained version of CentOS 7. Archived versions aren’t supported or tested.
    可能有些文章说centos6也能运行,不过我没有测试,我这里使用的是CentOS7
    [root@dockhost ~]# cat /etc/redhat-release
    CentOS Linux release 7.6.1810 (Core)

    使用yum安装
    [root@dockhost ~]# yum -y install docker-io

    开机自动启动
    [root@dockhost ~]# systemctl enable docker

    启动docker
    [root@dockhost ~]# systemctl start docker

    查看docker信息
    [root@dockhost ~]# docker --version
    Docker version 1.13.1, build b2f74b2/1.13.1

    查看更加详细的信息
    [root@dockhost ~]# docker info

    查看帮助文档
    [root@dockhost ~]# docker  # 查看所有命令帮助
    [root@dockhost ~]# docker container --help  # 如果想知道container的有哪些命令,可以使用这个帮助

    docker使用

    接下来使用一个例子(简单nginx服务)来演示如何使用docker,为避免混乱全部使用英文,image:镜像,container:容器

    查看docker image
    [root@dockhost ~]# docker image ls 
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    因为docker才安装,所以没有任何image,docker image ls与docker images命令等价

    查看正在运行的docker container
    [root@dockhost ~]# docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    连image都没有,当然也就没有container了,因为只有运行了image才会产生container,docker container ls与docker ps命令等价

    查看所有container,包括没有运行的container
    [root@dockhost ~]# docker container ls --all
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    该命令与上一条命令的区别就是,加--all会把所有container显示出来,docker container ls --all与docker ps -a命令等价

    下载nginx image
    [root@dockhost ~]# docker pull nginx

    Using default tag: latest
    Trying to pull repository docker.io/library/nginx ... 
    latest: Pulling from docker.io/library/nginx
    743f2d6c1f65: Pull complete 
    6bfc4ec4420a: Pull complete 
    688a776db95f: Pull complete 
    Digest: sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68
    Status: Downloaded newer image for docker.io/nginx:latest

    此时再来查看docker image,就能看到当前主机上有一个nginx image了
    [root@dockhost ~]# docker images

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    docker.io/nginx     latest              53f3fd8007f7        3 weeks ago         109 MB

    运行nginx image
    [root@dockhost ~]# docker run -p 8080:80 -d nginx
    47511fe91ce243583e7300bb143f9d15755c175b3a33405db92158e596d61f68
    这里的参数-p表示端口映射,前面的8080为我自定义的主机端口,后面的80是docker里面的nginx服务默认端口,docker里面的端口只有映射出来,本机或其它机器才能访问得到。具体是8080还是其它端口,这个自己定义。
    -d表示把命令放到后台执行,前端返回一个数字,具体数字表示什么含义后面有介绍

    再来查看docker container,可以看到有一个正在运行的container了,而CONTAINER ID就是上一步中返回的数字的截断
    [root@dockhost ~]# docker ps

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    47511fe91ce2        nginx               "nginx -g 'daemon ..."   9 minutes ago       Up 9 minutes        0.0.0.0:8080->80/tcp   stoic_easley

    打开浏览器,输入你docker运行的主机ip:8080,显示了nginx的欢迎界面。到这儿大家就应该知道docker的作用了,docker就是把别人做好的一段程序或应用打包,你拿来直接使用。

    1


    接下来我通过更改container里面的nginx欢迎界面文件,来介绍如何修改别人的image
    新建一个index.html,下面三行为index.html的内容
    <html>
    <p1>hello, I change index file.</p1>
    </html>

    上传到container中,命令有点类似于scp
    [root@dockhost ~]# docker cp index.html 47511fe91ce2:/usr/share/nginx/html  # 47511fe91ce2为前面docker ps命令显示的CONTAINER ID
    刷新浏览器,显示"hello, I change index file.",表示刚才做了的更改生效了

    2

    停止docker container
    [root@dockhost ~]# docker stop 47511fe91ce2  # 47511fe91ce2为前面docker ps命令显示的CONTAINER ID
    47511fe91ce2

    查看container,此时发现无任何container运行
    [root@dockhost ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS

    使用docker ps -a可以看到所有container,包括前面stop掉的
    [root@dockhost ~]# docker ps –a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                          PORTS               NAMES
    47511fe91ce2        nginx               "nginx -g 'daemon ..."   24 minutes ago      Exited (0) About a minute ago                       stoic_easley

    重新运行nginx image
    [root@dockhost ~]# docker run -p 8080:80 -d nginx
    f784361b43448453cbf646b2fc1eb52d943baca3848dbc08fa6d0446b2942d03

    查看docker container
    [root@dockhost ~]# docker ps -a

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                  NAMES
    f784361b4344        nginx               "nginx -g 'daemon ..."   56 seconds ago      Up 55 seconds              0.0.0.0:8080->80/tcp   elated_bose
    47511fe91ce2        nginx               "nginx -g 'daemon ..."   27 minutes ago      Exited (0) 4 minutes ago                          stoic_easley

    发现有两个container,从status这列中可以看到,第一个是正在运行,第二个是四分钟前退出,每次运行image,都会创建一个新的container。

    再刷新浏览器,竟然又显示了nginx的欢迎界面

    1

    也就是说之前所做的修改,重启之后就失效了,原因是因为修改是针对container的,重新运行image,container id就变了,是个新的container了。如果想永久保存这些变化,可以使用下面的命令

    重新将index.html上传到container中,注意这里是正在运行的CONTAINER ID
    [root@dockhost ~]# docker cp index.html f784361b4344:/usr/share/nginx/html
    此时你可以刷新浏览器看下,现在应该显示"hello, I change index file."

    保存修改
    [root@dockhost ~]# docker commit -m 'change html' f784361b4344 'new_nginx'
    sha256:f7de2c5040239142857aa9fdc6f4ed55bf2462fe9be97d8139978965f7a8065c
    这个命令放到下一步解释

    再来查看docker image
    [root@dockhost ~]# docker images

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    new_nginx           latest              f7de2c504023        40 seconds ago      109 MB
    docker.io/nginx     latest              53f3fd8007f7        3 weeks ago         109 MB

    可以看到这时候多了一个image,现在解释下docker commit这个命令
    -m 'change html','change html'是描述符,实际意义不大
    f784361b4344,需要保存更改的container id
    'new_nginx',实际上永久更改container,就是重新创建了一份image文件,new_nginx就是一个新的image文件名字。可以看文章最开始的image介绍,image是个只读的模板,运行image就启动了container,更改container就重新创建image

    现在停掉前面的container
    [root@dockhost ~]# docker ps

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    f784361b4344        nginx               "nginx -g 'daemon ..."   11 minutes ago      Up 11 minutes       0.0.0.0:8080->80/tcp   elated_bose

    [root@dockhost ~]# docker stop f784361b4344
    f784361b4344

    再打开new_nginx image
    [root@dockhost ~]# docker run -p 8080:80 -d new_nginx
    ebbba295fe241012325564872a90c8537d431e3f13ea154c7faec6b7c142d42e
    [root@dockhost ~]# docker ps  # 查看正在运行的container

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    ebbba295fe24        new_nginx           "nginx -g 'daemon ..."   6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   vigilant_yalow

    刷新浏览器,显示"hello, I change index file.",也就是说改动生效了,不过不是在nginx image中,而是后面创建的new_nginx image。

    2


    删除container使用docker rm <CONTAINER ID>
    [root@dockhost ~]# docker ps -a  # 查看所有的container

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
    ebbba295fe24        new_nginx           "nginx -g 'daemon ..."   2 minutes ago       Up 2 minutes                0.0.0.0:8080->80/tcp   vigilant_yalow
    f784361b4344        nginx               "nginx -g 'daemon ..."   55 minutes ago      Exited (0) 36 minutes ago                          elated_bose
    47511fe91ce2        nginx               "nginx -g 'daemon ..."   About an hour ago   Exited (0) 59 minutes ago                          stoic_easley

    [root@dockhost ~]# docker rm f784361b4344  # 删除id为f784361b4344的container
    f784361b4344

    [root@dockhost ~]# docker ps -a  # 可以看到id为f784361b4344的container已经被删除了

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                         PORTS                  NAMES
    ebbba295fe24        new_nginx           "nginx -g 'daemon ..."   4 minutes ago       Up 4 minutes                   0.0.0.0:8080->80/tcp   vigilant_yalow
    47511fe91ce2        nginx               "nginx -g 'daemon ..."   About an hour ago   Exited (0) About an hour ago                          stoic_easley

    这里需要注意的是不能删除一个正在运行的container
    [root@dockhost ~]# docker rm ebbba295fe24

    Error response from daemon: You cannot remove a running container ebbba295fe241012325564872a90c8537d431e3f13ea154c7faec6b7c142d42e. Stop the container before attempting removal or use -f

    删除image
    [root@dockhost ~]# docker images  # 列出所有镜像

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    new_nginx           latest              f7de2c504023        49 minutes ago      109 MB
    docker.io/nginx     latest              53f3fd8007f7        3 weeks ago         109 MB

     
    [root@dockhost ~]# docker rmi nginx  # 这里提示不能删除nginx image,由于有container与其绑定,即使该container已经停掉了

    Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container 47511fe91ce2 is using its referenced image 53f3fd8007f7

    [root@dockhost ~]# docker rm 47511fe91ce2  # 删除nginx image相关的container
    47511fe91ce2

    [root@dockhost ~]# docker rmi nginx

    Untagged: nginx:latest
    Untagged: docker.io/nginx@sha256:23b4dcdf0d34d4a129755fc6f52e1c6e23bb34ea011b315d87e193033bcd1b68

    [root@dockhost ~]# docker images

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    new_nginx           latest              f7de2c504023        54 minutes ago      109 MB

    这时nginx的镜像就已经被删除了

    好了,docker常用的操作就都演示完了,下面来个总结
    docker pull 获取image
    docker build 创建image 
    # 这个命令本文没讲,篇幅有限,感兴趣可以搜其它的文章
    docker images 列出image
    docker run 运行container
    docker ps 列出container
    docker rm 删除container
    docker rmi 删除image
    docker cp 在host和container之间拷贝文件
    docker commit 保存改动为新的image

    其它命令
    向容器里面执行命令:docker exec -it <CONTAINER_ID> bash
    如:[root@dockhost ~]# docker exec -it ebbba295fe24 ls

    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr

    容器与本地服务器互拷文件或文件夹
    从容器到本地:docker cp <containerId>:/file/path/within/container /host/path/target
    从本地到容器:docker cp filename <containerId>:/file/path/within/container

    删除docker安装程序

    rpm -qa | grep docker | xargs rpm -ev --nodeps
    rm -rf /var/lib/docker

  • 相关阅读:
    面向对象深入:继承01——子类
    面向对象的基础知识——小结
    IP地址配置
    二、RPM包管理-rpm命令管理
    一、软件包管理简介
    关机重启命令
    网络命令
    权限管理命令
    字符截取命令
    shell-正则表达式(二)
  • 原文地址:https://www.cnblogs.com/ddzj01/p/10947592.html
Copyright © 2020-2023  润新知