Docker入门学习

作者: caokai001 | 来源:发表于2021-10-10 13:45 被阅读0次

    参考

    Docker 入门教程
    Docker —— 从入门到实践

    1.Docker是什么

    1.1 环境配置

    软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

    用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

    如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:"它在我的机器可以跑了"(It works on my machine),言下之意就是,其他机器很可能跑不了。

    环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

    1.2 虚拟机

    虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

    但存在以下问题:

    • 资源占用多;
    • 冗余步骤多;
    • 启动慢;

    1.3 Linux 容器

    由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写LXC)。
    Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

    由于容器是进程级别的,相比虚拟机有很多优势。

    • 启动快;
    • 资源占用少;
    • 体积小;

    1.4 Docker主要用途

    Docker 的主要用途,目前有三大类。

    • 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
    • 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
    • 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

    2.Docker安装

    Docker是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE);企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务。下面列举是社区版安装教程

    2.1 检测是否安装成功

    $ docker version
    # 或者
    $ docker info
    
    img

    2.2 开启Docker服务

    Docker 是服务器----客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动

    # service 命令的用法
    $ sudo service docker start
    
    # systemctl 命令的用法
    $ sudo systemctl start docker
    
    img

    3.Docker常用命令

    3.1 镜像

    获取镜像(docker image pull)

    Docker Hub 上有大量的高质量的镜像可以用,我们可以直接获取已经做好的镜像文件。
    下面代码中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在仓库里面的位置,其中library是 image 文件所在的组,hello-world是 image 文件的名字。

    由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。

    $ docker pull --help
    $ docker image pull --help
    
    Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    
    Pull an image or a repository from a registry
    
    Options:
      -a, --all-tags                Download all tagged images in the repository
          --disable-content-trust   Skip image verification (default true)
          --platform string         Set platform if server is multi-platform capable
      -q, --quiet                   Suppress verbose output
    
    $ docker image pull library/hello-world
    $ docker image pull hello-world
    
    img

    列出镜像(docker image ls)

    列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。

    (base) [12:48:37] root@VM-4-4-centos:~
    $ docker image ls
    REPOSITORY             TAG       IMAGE ID       CREATED       SIZE
    rocker/rstudio         latest    0f828055b20c   3 days ago    1.89GB
    hello-world            latest    feb5d9fea6a5   2 weeks ago   13.3kB
    codercom/code-server   latest    08823d73807e   3 weeks ago   1.11GB
    

    删除本地镜像(docker image rm)

    可以通过image_ID 或 镜像名来删除

    (base) [12:52:04] root@VM-4-4-centos:~
    $ docker image rm hello-world
    Untagged: hello-world:latest
    Untagged: hello-world@sha256:9ade9cc2e26189a19c2e8854b9c8f1e14829b51c55a630ee675a5a9540ef6ccf
    Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
    Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
    
    (base) [12:53:39] root@VM-4-4-centos:~
    $ docker image ls
    REPOSITORY             TAG       IMAGE ID       CREATED       SIZE
    rocker/rstudio         latest    0f828055b20c   3 days ago    1.89GB
    codercom/code-server   latest    08823d73807e   3 weeks ago   1.11GB
    

    3.2 容器

    启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(exited)的容器重新启动。

    新建并启动(docker run)

    常用的参数:
    -i:运行容器
    -t:容器启动后会进入命令行,将入这两个参数后,容器创建壳登录进去,即分配一个伪终端
    -d: 后台运行(创建容器后不会自动登录容器,只加-i-t两个参数,创建后会自动进入容器)
    -v:表示目录映射关系,前者是宿主机目录,后者是容器映射目录。
    -p : 标识端口映射,前者是宿主机端口,后者是容器映射端口。可使用多个-p做端口映射

    如果容器不存在,会自动docker pull 一个最新的image;

    (base) [12:56:46] root@VM-4-4-centos:~
    $ docker run ubuntu:18.04 /bin/echo 'Hello world'
    Unable to find image 'ubuntu:18.04' locally
    18.04: Pulling from library/ubuntu
    284055322776: Pull complete 
    Digest: sha256:bfb4cabd667790ead5c95d9fe341937f0c21118fa79bc768d51c5da9d1dbe917
    Status: Downloaded newer image for ubuntu:18.04
    Hello world
    

    启动已终止容器(docker container start)

    终止容器(docker container stop)

    查看所有容器(docker ps -a)

    进入容器(docker exec)

    在使用 -d 参数时,容器启动后会进入后台。

    某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐大家使用 docker exec 命令

    举例:

    (base) [13:09:25] root@VM-4-4-centos:~
    $ docker exec -it 4791c4f6cd63 bash
    root@4791c4f6cd63:/# ls
    bin   dev  home  lib32  libx32  mnt  proc  run   srv  tmp  var
    boot  etc  lib   lib64  media   opt  root  sbin  sys  usr
    root@4791c4f6cd63:/# pwd
    /
    

    删除容器(docker container rm)

    比如:需要删除modest_feistel这个容器,需要先stop->再rm

    $ docker container ls
    CONTAINER ID   IMAGE                         COMMAND                  CREATED         STATUS         PORTS                    NAMES
    4791c4f6cd63   ubuntu                        "bash"                   3 minutes ago   Up 3 minutes                            modest_feistel
    4eafd6d919e3   ubuntu                        "bash"                   3 minutes ago   Up 3 minutes                            sharp_wilbur
    4dd3572398e8   codercom/code-server:latest   "/usr/bin/entrypoint…"   11 hours ago    Up 11 hours    0.0.0.0:8080->8080/tcp   code-server
    2f6ca3b22896   rocker/rstudio                "/init"                  11 hours ago    Up 11 hours    0.0.0.0:8787->8787/tcp   rstuido
    
    $ docker container stop modest_feistel
    modest_feistel
    
    $ docker container rm modest_feistel
    modest_feistel
    
    $ docker container ls
    CONTAINER ID   IMAGE                         COMMAND                  CREATED         STATUS         PORTS                    NAMES
    4eafd6d919e3   ubuntu                        "bash"                   4 minutes ago   Up 4 minutes                            sharp_wilbur
    4dd3572398e8   codercom/code-server:latest   "/usr/bin/entrypoint…"   11 hours ago    Up 11 hours    0.0.0.0:8080->8080/tcp   code-server
    2f6ca3b22896   rocker/rstudio                "/init"                  11 hours ago    Up 11 hours    0.0.0.0:8787->8787/tcp   rstuido
    

    3.3 仓库

    目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 2,650,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

    注册

    你可以在 https://hub.docker.com 免费注册一个 Docker 账号。

    登录

    可以通过执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub

    你可以通过 docker logout 退出登录。

    搜索镜像(docker search)

    例如以 centos 为关键词进行搜索:

    $ docker search centos
    NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    centos                             The official build of CentOS.                   6449      [OK]
    ansible/centos7-ansible            Ansible on Centos7                              132                  [OK]
    consol/centos-xfce-vnc             Centos container with "headless" VNC session…   126                  [OK]
    jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   117                  [OK]
    centos/systemd                     systemd enabled base container.       
    

    4. 其他

    4.1 外部访问容器

    容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P-p 参数来指定端口映射。

    • 当使用 -P 标记时,Docker 会随机映射一个端口到内部容器开放的网络端口。

    使用 docker container ls 可以看到,本地主机的 32768 被映射到了容器的 80 端口。此时访问本机的 32768 端口即可访问容器内 NGINX 默认页面。

    $ docker run -d -P nginx:alpine
    
    $ docker container ls -l
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    fae320d08268        nginx:alpine        "/docker-entrypoint.…"   24 seconds ago      Up 20 seconds       0.0.0.0:32768->80/tcp   bold_mcnulty
    
    • 当使用 -p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有
      ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort.

    使用 hostPort:containerPort 格式本地的 80/443 端口映射到容器的 80/443 端口

    $ docker run -d \
        -p 80:80 \
        -p 443:443 \
        nginx:alpine
    

    4.2 docker 目录挂载

    比如你使用docker安装了rstudio,你想将某个宿主目录设定为docker-rstudio容器的home目录,就需要考虑这个问题,可以用-v参数指定;

    譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:

    docker run -it -v /test:/soft centos /bin/bash
    

    这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

    欢迎评论交流~

    相关文章

      网友评论

        本文标题:Docker入门学习

        本文链接:https://www.haomeiwen.com/subject/tfeholtx.html