美文网首页
Docker 安装与应用

Docker 安装与应用

作者: 今天有什么新鲜事呀 | 来源:发表于2021-08-11 18:35 被阅读0次

    一、CentOS 安装 docker

    1、yum 源安装

    # 下载 repo 文件,repo saved to /etc/yum.repos.d/docker-ce.repo
    [root@localhost ~]# yum-config-manager \ --add-repo \ https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
    
    # 更新 yum 资源及安装 docker
    [root@localhost ~]# yum makecache fast
    [root@localhost ~]# yum install docker-ce
    

    2、脚本安装

    [root@localhost ~]# curl -fsSL get.docker.com -o get-docker.sh 
    [root@localhost ~]# sh get-docker.sh --mirror Aliyun
    # Executing docker install script, commit: 0e685c6ac0bddd7b2ba7bcaaeb519746ad249a29
    + sh -c 'yum install -y -q yum-utils'
    + sh -c 'yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo'
    Loaded plugins: fastestmirror, langpacks
    adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
    repo saved to /etc/yum.repos.d/docker-ce.repo
    + '[' stable '!=' stable ']'
    + sh -c 'yum makecache'
    Loaded plugins: fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    base                                                                                                                                                                                        | 3.6 kB  00:00:00     
    docker-ce-stable                                                                                                                                                                            | 3.5 kB  00:00:00     
    extras                                                                                                                                                                                      | 2.9 kB  00:00:00     
    updates                                                                                                                                                                                     | 2.9 kB  00:00:00     
    (1/2): docker-ce-stable/7/x86_64/filelists_db                                                                                                                                               |  27 kB  00:00:00     
    (2/2): docker-ce-stable/7/x86_64/other_db                                                                                                                                                   | 120 kB  00:00:00     
    Metadata Cache Created
    + '[' -n '' ']'
    + sh -c 'yum install -y -q docker-ce'
    warning: /var/cache/yum/x86_64/7/docker-ce-stable/packages/docker-ce-20.10.8-3.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY
    Public key for docker-ce-20.10.8-3.el7.x86_64.rpm is not installed
    Importing GPG key 0x621E9F35:
     Userid     : "Docker Release (CE rpm) <docker@docker.com>"
     Fingerprint: 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
     From       : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
    setsebool:  SELinux is disabled.
    + version_gte 20.10
    + '[' -z '' ']'
    + return 0
    + sh -c 'yum install -y -q docker-ce-rootless-extras'
    Package docker-ce-rootless-extras-20.10.8-3.el7.x86_64 already installed and latest version
    
    ================================================================================
    
    To run Docker as a non-privileged user, consider setting up the
    Docker daemon in rootless mode for your user:
    
        dockerd-rootless-setuptool.sh install
    
    Visit https://docs.docker.com/go/rootless/ to learn about rootless mode.
    
    
    To run the Docker daemon as a fully privileged service, but granting non-root
    users access, refer to https://docs.docker.com/go/daemon-access/
    
    WARNING: Access to the remote API on a privileged Docker daemon is equivalent
             to root access on the host. Refer to the 'Docker daemon attack surface'
             documentation for details: https://docs.docker.com/go/attack-surface/
    
    ================================================================================
    

    3、安装结果测试

    #启动 docker
    [root@localhost ~]# systemctl enable docker 
    [root@localhost ~]# systemctl start docker
    
    # 建立 docker 用户组及将当前用户加入该用户组
    [root@localhost ~]# groupadd docker
    [root@localhost ~]# usermod -aG docker $USER
    
    #测试
    [root@localhost ~]# docker run hello-world
    # 输出以下内容则说明已成功安装 docker
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    b8dfde127a29: Pull complete 
    Digest: sha256:776b0895d5e2fcd5e80bcdd607adc45461ba11143ef3df531174bf00679f43fe
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
    

    二、Docker 的使用

    1、使用手册

    [root@localhost ~]# docker --help
    Usage:  docker [OPTIONS] COMMAND
    Options:
          --config string      Location of client config files (default "/root/.docker")
      -c, --context string     Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use")
      -D, --debug              Enable debug mode
      -H, --host list          Daemon socket(s) to connect to
      -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
          --tls                Use TLS; implied by --tlsverify
          --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
          --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
          --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
          --tlsverify          Use TLS and verify the remote
      -v, --version            Print version information and quit
    
    Management Commands:
      app*        Docker App (Docker Inc., v0.9.1-beta3)
      builder     Manage builds
      buildx*     Build with BuildKit (Docker Inc., v0.6.1-docker)
      config      Manage Docker configs
      container   Manage containers
      context     Manage contexts
      image       Manage images
      manifest    Manage Docker image manifests and manifest lists
      network     Manage networks
      node        Manage Swarm nodes
      plugin      Manage plugins
      scan*       Docker Scan (Docker Inc., v0.8.0)
      secret      Manage Docker secrets
      service     Manage services
      stack       Manage Docker stacks
      swarm       Manage Swarm
      system      Manage Docker
      trust       Manage trust on Docker images
      volume      Manage volumes
    
    Commands:
      attach      Attach local standard input, output, and error streams to a running container
      build       Build an image from a Dockerfile
      commit      Create a new image from a container's changes
      cp          Copy files/folders between a container and the local filesystem
      create      Create a new container
      diff        Inspect changes to files or directories on a container's filesystem
      events      Get real time events from the server
      exec        Run a command in a running container
      export      Export a container's filesystem as a tar archive
      history     Show the history of an image
      images      List images
      import      Import the contents from a tarball to create a filesystem image
      info        Display system-wide information
      inspect     Return low-level information on Docker objects
      kill        Kill one or more running containers
      load        Load an image from a tar archive or STDIN
      login       Log in to a Docker registry
      logout      Log out from a Docker registry
      logs        Fetch the logs of a container
      pause       Pause all processes within one or more containers
      port        List port mappings or a specific mapping for the container
      ps          List containers
      pull        Pull an image or a repository from a registry
      push        Push an image or a repository to a registry
      rename      Rename a container
      restart     Restart one or more containers
      rm          Remove one or more containers
      rmi         Remove one or more images
      run         Run a command in a new container
      save        Save one or more images to a tar archive (streamed to STDOUT by default)
      search      Search the Docker Hub for images
      start       Start one or more stopped containers
      stats       Display a live stream of container(s) resource usage statistics
      stop        Stop one or more running containers
      tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
      top         Display the running processes of a container
      unpause     Unpause all processes within one or more containers
      update      Update configuration of one or more containers
      version     Show the Docker version information
      wait        Block until one or more containers stop, then print their exit codes
    

    2、镜像拉取、列出、删除

    • 配置镜像拉取加速
    #编辑配置文件
    [root@localhost ~]# vim /etc/docker/daemon.json 
    {
         "registry-mirrors": [ 
            "https://registry.docker-cn.com" ] 
    }
    
    #重启服务
    [root@localhost ~]#  systemctl daemon-reload 
    [root@localhost ~]#  systemctl restart docker
    
    • 从仓库拉取镜像
    # docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
    docker pull ubuntu   # 若不指定版本默认拉取最新镜像
    # 输出结果
    Using default tag: latest
    latest: Pulling from library/ubuntu
    16ec32c2132b: Pull complete 
    Digest: sha256:82becede498899ec668628e7cb0ad87b6e1c371cb8a1e597d83a47fac21d6af3
    Status: Downloaded newer image for ubuntu:latest
    docker.io/library/ubuntu:latest
    
    • 列出所有镜像
    [root@localhost ~]# docker images 
    # 仓库名      标签       镜像ID        创建时间        占用空间
    REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
    ubuntu        latest    1318b700e415   2 weeks ago    72.8MB
    registry      2         1fd8e1b0bb7e   3 months ago   26.2MB
    hello-world   latest    d1165f221234   5 months ago   13.3kB
    
    • 列出指定仓库名的镜像
    [root@localhost ~]# docker images ubuntu
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    ubuntu       20.04     1318b700e415   2 weeks ago    72.8MB
    ubuntu       latest    1318b700e415   2 weeks ago    72.8MB
    
    • 列出指定镜像
    [root@localhost ~]# docker images ubuntu:20.04 
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    ubuntu       20.04     1318b700e415   2 weeks ago   72.8MB
    
    • 以特定格式列出镜像(GO语法)
    # 仅打印  "ID"  和  "Repository" 信息并以 " : " 隔开
    [root@localhost ~]# docker images --format "{{.ID}}: {{.Repository}}"   
    1318b700e415: ubuntu
    1318b700e415: ubuntu
    1fd8e1b0bb7e: registry
    
    # 仅打印  "ID"  和  "Repository" 信息并等距显示
    [root@localhost ~]# docker images --format "table{{.ID}}\t{{.Repository}}\t{{.Size}}"
    IMAGE ID       REPOSITORY   SIZE
    1318b700e415   ubuntu       72.8MB
    1318b700e415   ubuntu       72.8MB
    1fd8e1b0bb7e   registry     26.2MB
    
    • 删除镜像
    # 用镜像的完整 ID(长 ID)来删除镜像,使用脚本的时候可能会用长 ID
    # 用短 ID 来删除镜像,一般取前3个字符以上
    [root@localhost ~]# docker rmi hello-world:latest 
    Untagged: hello-world:latest
    Untagged: hello-world@sha256:776b0895d5e2fcd5e80bcdd607adc45461ba11143ef3df531174bf00679f43fe
    Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
    Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd
    [root@localhost ~]# docker images 
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    ubuntu       latest    1318b700e415   2 weeks ago    72.8MB
    registry     2         1fd8e1b0bb7e   3 months ago   26.2MB
    

    ERROR

    # Error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container 1b2fb7cdf07d is using its referenced image d1165f221234
    

    SOLUTION

    # 重复删除 ID 为 1b2fb7cdf07d 的 container
    docker rm 1b2fb7cdf07d 
    
    • 查看镜像、容器、数据卷所占用的空间
    [root@localhost ~]# docker system df
    TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
    Images          2         1         99.02MB   72.78MB (73%)
    Containers      1         0         0B        0B
    Local Volumes   1         1         0B        0B
    Build Cache     0         0         0B        0B
    

    3、容器的启动、终止、进入、导入、导出

    • 容器启动

    -p 指定要映射的端口,一个指定端口上只可以绑定一个容器。支持格式 :ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort 。

    [root@localhost ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    ubuntu       20.04     1318b700e415   2 weeks ago    72.8MB
    ubuntu       18.04     39a8cfeef173   2 weeks ago    63.1MB
    registry     latest    1fd8e1b0bb7e   3 months ago   26.2MB
    
    # 通过指定的 REPOSITORY 和 TAG 运行容器,用户不可进行交互,但等同于在本地执行 echo 指令
    [root@localhost ~]# docker run ubuntu:20.04 /bin/echo "NO PAIN,NO GAIN."
    NO PAIN,NO GAIN.
    
    # 通过指定的 IMAGE ID 运行,用户不可进行交互,但等同于在本地执行 echo 指令
    [root@localhost ~]# docker run 39a8cfeef173 /bin/echo "NO PAIN,NO GAIN."
    NO PAIN,NO GAIN.
    
    # 启动一个终端,用户可进行交互
    [args]:
    -t, --tty            Allocate a pseudo-TTY
    -i, --interactive    Keep STDIN open even if not attached
    
    [root@localhost ~]# docker run -t -i ubuntu:18.04 /bin/bash
    root@cc80f23bc9e4:/# echo "NO PAIN,NO GAIN."
    NO PAIN,NO GAIN.
    
    # 指定参数启动容器
    [args]:
    -d, --detach         Run container in background and print container ID #后台运行,不进入交互模式
    --name string        Assign a name to the container
    -p                   Publish a  port(s) of container to the host
    
    [root@localhost ~]# docker run -itd -p 5001:5001 --name=test1 ubuntu:20.04 
    62389f915096efde58d6fc6bf560085ccb91f7997a0229078d5df3057195957a
    [root@localhost ~]# docker run -itd -p 5002:5002 --name=test2 ubuntu:18.04 
    c2e251801beaf0ffa5a1830f2d8e7c6906f764a922d2ec10de5e09209a750f41
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    16 seconds ago   Up 15 seconds   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    62389f915096   ubuntu:20.04   "bash"    34 seconds ago   Up 33 seconds   0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    
    # 在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
    # docker attach CONTAINER ID    # 退出容器,容器终止
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND   CREATED         STATUS         PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    6 minutes ago   Up 6 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    62389f915096   ubuntu:20.04   "bash"    6 minutes ago   Up 8 seconds   0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    [root@localhost ~]# docker attach test1 
    root@62389f915096:/# ls
    bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@62389f915096:/# exit
    exit
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND   CREATED         STATUS         PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    6 minutes ago   Up 6 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                     PORTS                                       NAMES
    ffd257af6f34   registry       "/entrypoint.sh /etc…"   3 minutes ago   Exited (2) 2 minutes ago                                               test3
    c2e251801bea   ubuntu:18.04   "bash"                   7 minutes ago   Up 7 minutes               0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    62389f915096   ubuntu:20.04   "bash"                   7 minutes ago   Exited (0) 8 seconds ago                                               test1
    
    # docker exec CONTAINER ID      #退出容器,容器终止
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    11 minutes ago   Up 11 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    [root@localhost ~]# docker exec -it test2 /bin/bash
    root@c2e251801bea:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@c2e251801bea:/# exit
    exit
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    11 minutes ago   Up 11 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    
    
    
    • 列出所有容器
    [root@localhost ~]# docker ps --help
    Usage:  docker ps [OPTIONS]
    Options:
      -a, --all             Show all containers (default shows just running)
      -f, --filter filter   Filter output based on conditions provided
          --format string   Pretty-print containers using a Go template
      -n, --last int        Show n last created containers (includes all states) (default -1)
      -l, --latest          Show the latest created container (includes all states)
          --no-trunc        Don't truncate output
      -q, --quiet           Only display container IDs
      -s, --size            Display total file sizes
    
    # 列出在运行的容器(默认)
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    11 minutes ago   Up 11 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    
    # 列出所有容器(包括已退出的容器)
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                     PORTS                                       NAMES
    ffd257af6f34   registry       "/entrypoint.sh /etc…"   9 minutes ago    Exited (2) 8 minutes ago                                               test3
    c2e251801bea   ubuntu:18.04   "bash"                   12 minutes ago   Up 12 minutes              0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    62389f915096   ubuntu:20.04   "bash"                   13 minutes ago   Exited (0) 6 minutes ago                                               test1
    
    • 终止运行中的容器
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    14 minutes ago   Up 14 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    [root@localhost ~]# docker stop test2 
    test2
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    
    • 启动终止状态容器
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                          PORTS     NAMES
    ffd257af6f34   registry       "/entrypoint.sh /etc…"   16 minutes ago   Exited (2) About a minute ago             test3
    c2e251801bea   ubuntu:18.04   "bash"                   19 minutes ago   Exited (0) About a minute ago             test2
    62389f915096   ubuntu:20.04   "bash"                   20 minutes ago   Exited (0) 6 seconds ago                  test1
    
    # 通过 NAMES 启动
    [root@localhost ~]# docker start test1 
    test1
    
    # 通过 CONTAINER ID 启动
    [root@localhost ~]# docker start c2e251801bea
    c2e251801bea               
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    20 minutes ago   Up 11 seconds   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    62389f915096   ubuntu:20.04   "bash"    20 minutes ago   Up 26 seconds   0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    
    • 导出、导入容器
    # 进入 test1 容器,编辑 TEST.txt 文件作为后面导入容器验证比对参照
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                       NAMES
    c2e251801bea   ubuntu:18.04   "bash"    30 minutes ago   Up 10 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    62389f915096   ubuntu:20.04   "bash"    30 minutes ago   Up 10 minutes   0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    [root@localhost ~]# docker exec -it test1 /bin/bash
    root@62389f915096:/# cat > TEST.txt << EOF
    > NO PAIN,NO GAIN!
    > EOF
    root@62389f915096:/# cat TEST.txt 
    NO PAIN,NO GAIN!
    root@62389f915096:/# exit 
    exit
    
    # 导出容器并命名为 DEMO.tar
    [root@localhost ~]# docker export --help
    Usage:  docker export [OPTIONS] CONTAINER
    Export a container's filesystem as a tar archive
    Options:
      -o, --output string    Write to a file, instead of STDOUT
    ----------------------------------------------------------------------------------------
    [root@localhost ~]# docker export test1 > DEMO.tar
    [root@localhost ~]# ll -h DEMO.tar 
    -rw-r--r-- 1 root root 72M Aug 12 01:54 DEMO.tar
    
    # 导入容器 DEMO.tar 
    [root@localhost ~]# docker import --help
    Usage:  docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
    Import the contents from a tarball to create a filesystem image
    Options:
      -c, --change list       Apply Dockerfile instruction to the created image
      -m, --message string    Set commit message for imported image
      --platform string       Set platform if server is multi-platform capable
    ----------------------------------------------------------------------------------------
    [root@localhost ~]# ll -h DEMO.tar 
    -rw-r--r-- 1 root root 72M Aug 12 01:54 DEMO.tar
    [root@localhost ~]# cat DEMO.tar | docker import - ubuntu:v01
    sha256:00e53287c020f83d3a159d27f5b37aebb18f2ae6e187fdb76f6e7ab73f03786e
    [root@localhost ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    ubuntu       v01       00e53287c020   51 seconds ago   72.8MB
    ubuntu       20.04     1318b700e415   2 weeks ago      72.8MB
    ubuntu       18.04     39a8cfeef173   2 weeks ago      63.1MB
    registry     latest    1fd8e1b0bb7e   3 months ago     26.2MB
    
    # 验证导入容器 ubuntu:v01
    [root@localhost ~]# docker run -itd -p 5003:5003 --name=test3 ubuntu:v01 /bin/bash
    e259b5e999062d7966987cd4906f1524f4efdcb9425428640119986b8bbc9d6b
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                                       NAMES
    e259b5e99906   ubuntu:v01     "/bin/bash"   11 seconds ago   Up 5 seconds    0.0.0.0:5003->5003/tcp, :::5003->5003/tcp   test3
    c2e251801bea   ubuntu:18.04   "bash"        49 minutes ago   Up 29 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    62389f915096   ubuntu:20.04   "bash"        50 minutes ago   Up 29 minutes   0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    [root@localhost ~]# docker exec -it test3 /bin/bash
    root@e259b5e99906:/# ls
    TEST.txt  bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@e259b5e99906:/# cat TEST.txt 
    NO PAIN,NO GAIN!
    
    • 删除容器
    # 删除对应容器 CONTAINER ID 或 NAMES 均可
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                      PORTS                                       NAMES
    6373f20cccc0   registry       "/entrypoint.sh --na…"   59 seconds ago      Exited (0) 57 seconds ago                                               agitated_cannon
    bbbecf0ebe1f   ubuntu:20.04   "/bin/bash"              2 minutes ago       Up 2 minutes                0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    e259b5e99906   ubuntu:v01     "/bin/bash"              11 minutes ago      Up 11 minutes               0.0.0.0:5003->5003/tcp, :::5003->5003/tcp   test3
    c2e251801bea   ubuntu:18.04   "bash"                   About an hour ago   Up 40 minutes               0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    [root@localhost ~]# docker rm -f test
    Error: No such container: test
    
    # 添加参数 -f  可删除运行态容器
    [root@localhost ~]# docker rm -f test1
    test1
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                          PORTS                                       NAMES
    6373f20cccc0   registry       "/entrypoint.sh --na…"   About a minute ago   Exited (0) About a minute ago                                               agitated_cannon
    e259b5e99906   ubuntu:v01     "/bin/bash"              11 minutes ago       Up 11 minutes                   0.0.0.0:5003->5003/tcp, :::5003->5003/tcp   test3
    c2e251801bea   ubuntu:18.04   "bash"                   About an hour ago    Up 41 minutes                   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    
    # 删除指定终止态容器
    [root@localhost ~]# docker rm agitated_cannon 
    agitated_cannon
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS          PORTS                                       NAMES
    e259b5e99906   ubuntu:v01     "/bin/bash"   15 minutes ago      Up 14 minutes   0.0.0.0:5003->5003/tcp, :::5003->5003/tcp   test3
    c2e251801bea   ubuntu:18.04   "bash"        About an hour ago   Up 44 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    
    # 删除所有终止态容器
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS                      PORTS     NAMES
    e259b5e99906   ubuntu:v01     "/bin/bash"   17 minutes ago      Exited (0) 6 seconds ago              test3
    c2e251801bea   ubuntu:18.04   "bash"        About an hour ago   Exited (0) 12 seconds ago             test2
    [root@localhost ~]# docker container prune 
    WARNING! This will remove all stopped containers.
    Are you sure you want to continue? [y/N] y
    Deleted Containers:
    e259b5e999062d7966987cd4906f1524f4efdcb9425428640119986b8bbc9d6b
    c2e251801beaf0ffa5a1830f2d8e7c6906f764a922d2ec10de5e09209a750f41
    
    Total reclaimed space: 110B
    [root@localhost ~]# docker ps -a
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    

    4、数据管理

    1)数据卷(Volumes)

    数据卷是一个可供一个或多个容器使用的特殊目录,特性:

    • 数据卷可以在容器之间共享和重用
    • 对数据卷的修改会立马生效
    • 对数据卷的更新,不会影响镜像
    • 数据卷默认会一直存在,即使容器被删除

    注意: 数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中被指定为挂载点的目录中的文件会隐藏掉,能显示的是挂载的数据卷 。


    • 创建、列出、查看、删除数据卷
    [root@localhost docker]# docker volume --help
    Usage:  docker volume COMMAND
    Manage volumes
    Commands:
      create      Create a volume
      inspect     Display detailed information on one or more volumes
      ls          List volumes
      prune       Remove all unused local volumes
      rm          Remove one or more volumes
    ----------------------------------------------------------------------------------------
    # 创建数据卷
    [root@localhost ~]# docker volume create demo_vol
    demo_vol
    # 列出数据卷
    [root@localhost ~]# docker volume ls
    DRIVER    VOLUME NAME
    local     demo_vol
    # 查看数据卷信息(可同时是查看多个)
    [root@localhost ~]# docker volume inspect demo_vol 
    [
        {
            "CreatedAt": "2021-08-12T18:39:59+08:00",
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/demo_vol/_data",
            "Name": "demo_vol",
            "Options": {},
            "Scope": "local"
        }
    ]
    # 删除数据卷(使用参数 prune 可同时删除多个)
    [root@localhost ~]# docker volume rm demo_vol 
    demo_vol
    
    • 启动挂载数据卷的容器
    # 数据卷 demo_vol1 下新建文件做后面验证校验
    root@localhost _data]# pwd
    /var/lib/docker/volumes/demo_vol1/_data
    [root@localhost _data]# touch demo{1..5}.txt
    [root@localhost _data]# ll
    total 0
    -rw-r--r-- 1 root root 0 Aug 12 19:25 demo1.txt
    -rw-r--r-- 1 root root 0 Aug 12 19:25 demo2.txt
    -rw-r--r-- 1 root root 0 Aug 12 19:25 demo3.txt
    -rw-r--r-- 1 root root 0 Aug 12 19:25 demo4.txt
    -rw-r--r-- 1 root root 0 Aug 12 19:25 demo5.txt
    
    # 启动挂载数据卷的容器
    # 将数据卷 demo_vol1 挂载到容器 ubuntu:20.04 的 "/mnt" 目录
    [root@localhost ~]# docker run -itd -p 5002:5002 --name test2 --mount source=demo_vol1,target=/mnt ubuntu:20.04 /bin/bash
    3a1bdbd8c08c63a5f80d01da354f93d774f5f63455407c5a8736eb61877627b5
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                                       NAMES
    3a1bdbd8c08c   ubuntu:20.04   "/bin/bash"   15 seconds ago   Up 13 seconds   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    30fdb335add4   ubuntu:18.04   "/bin/bash"   2 hours ago      Up 2 hours      0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    
    # 查看已启动容器 ubuntu:20.04 数据卷挂载信息
    [root@localhost ~]# docker inspect test2 
    [
        {
            "Id": "3a1bdbd8c08c63a5f80d01da354f93d774f5f63455407c5a8736eb61877627b5",
            "Created": "2021-08-12T11:16:39.690901124Z",
            "Path": "/bin/bash", ...
    "Mounts": [
                {
                    "Type": "volume",
                    "Name": "demo_vol1",
                    "Source": "/var/lib/docker/volumes/demo_vol1/_data",
                    "Destination": "/mnt",
                    "Driver": "local",
                    "Mode": "z",
                    "RW": true,
                    "Propagation": ""
                }
            ]
    # 进入容器 test2,校验挂载情况
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                                       NAMES
    3a1bdbd8c08c   ubuntu:20.04   "/bin/bash"   18 minutes ago   Up 18 minutes   0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    30fdb335add4   ubuntu:18.04   "/bin/bash"   2 hours ago      Up 2 hours      0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    [root@localhost ~]# docker exec -it test2 /bin/bash
    root@3a1bdbd8c08c:/# ll /mnt/
    total 0
    drwxr-xr-x 2 root root 91 Aug 12 11:25 ./
    drwxr-xr-x 1 root root 18 Aug 12 11:16 ../
    -rw-r--r-- 1 root root  0 Aug 12 11:25 demo1.txt
    -rw-r--r-- 1 root root  0 Aug 12 11:25 demo2.txt
    -rw-r--r-- 1 root root  0 Aug 12 11:25 demo3.txt
    -rw-r--r-- 1 root root  0 Aug 12 11:25 demo4.txt
    -rw-r--r-- 1 root root  0 Aug 12 11:25 demo5.txt
    

    2)监听主机目录 (Bind mounts)

    使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去

    # 挂载主机目录 "/root/demo",挂载点容器test3 "/mnt"
    [root@localhost demo]# pwd
    /root/demo
    [root@localhost demo]# ll
    total 73400
    -rw-r--r-- 1 root root 75160576 Aug 12 01:54 DEMO.tar
    
    # 启动挂载主机目录容器 test3
    [root@localhost ~]# docker run -itd -p 5003:5003 --name test3 --mount type=bind,source=/root/demo,target=/mnt ubuntu:18.04 /bin/bash
    064576cfc3884285309c344e103ab84bc51a1bf75c4686663c95e3d9bd5c6db8
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS                                       NAMES
    064576cfc388   ubuntu:18.04   "/bin/bash"   7 seconds ago   Up 4 seconds   0.0.0.0:5003->5003/tcp, :::5003->5003/tcp   test3
    3a1bdbd8c08c   ubuntu:20.04   "/bin/bash"   2 hours ago     Up 2 hours     0.0.0.0:5002->5002/tcp, :::5002->5002/tcp   test2
    30fdb335add4   ubuntu:18.04   "/bin/bash"   4 hours ago     Up 4 hours     0.0.0.0:5001->5001/tcp, :::5001->5001/tcp   test1
    
    # 进入容器 test3 并验证
    [root@localhost demo]# docker exec -it test3 /bin/bash
    root@064576cfc388:~# ll /mnt/
    total 73400
    drwxr-xr-x 2 root root       22 Aug 12 11:40 ./
    drwxr-xr-x 1 root root        6 Aug 12 13:44 ../
    -rw-r--r-- 1 root root 75160576 Aug 11 17:54 DEMO.tar
    

    注意:挂载的主机目录的默认有读写权限,增加 readonly 可指设定挂载主机目录为只读权限

    [root@localhost ~]# docker run -itd -p 5004:5004 --name test4 --mount type=bind,source=/root/demo,target=/mnt,readonly ubuntu:20.04 /bin/bash
    85ea1d3282b178334baffbe0dbd187f0dda8c2d6f2afeda8de3b309818719079
    [root@localhost ~]# docker ps 
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS                                       NAMES
    85ea1d3282b1   ubuntu:20.04   "/bin/bash"   4 minutes ago   Up 4 minutes   0.0.0.0:5004->5004/tcp, :::5004->5004/tcp   test4
    [root@localhost ~]# docker inspect test4 | grep "Mounts" -A9
                "Mounts": [
                    {
                        "Type": "bind",
                        "Source": "/root/demo",
                        "Target": "/mnt",
                        "ReadOnly": true
                    }
                ],
                "MaskedPaths": [
                    "/proc/asound",
    --
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/root/demo",
                    "Destination": "/mnt",
                    "Mode": "",
                    "RW": false,
                    "Propagation": "rprivate"
                }
            ],
    
    # 进入容器 test4 新建文件夹 TEST 验证权限
    [root@localhost ~]# docker exec -it test4 /bin/bash
    root@85ea1d3282b1:~# cd /mnt/
    root@85ea1d3282b1:/mnt# pwd
    /mnt
    root@85ea1d3282b1:/mnt# ll
    total 73400
    drwxr-xr-x 2 root root       22 Aug 12 11:40 ./
    drwxr-xr-x 1 root root        6 Aug 12 14:00 ../
    -rw-r--r-- 1 root root 75160576 Aug 11 17:54 DEMO.tar
    root@85ea1d3282b1:/mnt# mkdir TEST
    mkdir: cannot create directory 'TEST': Read-only file system
    

    使用 --mount 标记从主机挂载单个文件到容器中

    # 挂载主机上 .bash_history 文件到容器,记录容器内执行过的命令
    [root@localhost ~]# docker run -itd -p 5005:5005 --name test5 --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:20.04 /bin/bash
    92daee5c46fc895acb495d575437ef2c0ffac3002aec1578d6e0f5bedb143fb5
    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS          PORTS                                       NAMES
    92daee5c46fc   ubuntu:20.04   "/bin/bash"   17 seconds ago   Up 16 seconds   0.0.0.0:5005->5005/tcp, :::5005->5005/tcp   test5
    [root@localhost ~]# echo '' > .bash_history 
    [root@localhost ~]# cat .bash_history 
    
    [root@localhost ~]# docker exec -it test5 /bin/bash
    root@92daee5c46fc:/# apt-get update
    Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]                                         
    Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
    Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
    Get:4 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [30.6 kB]
    Get:5 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [990 kB]
    Get:6 http://archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
    Get:7 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
    Get:8 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
    Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]                                                                                                                                        
    Get:10 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [787 kB]                                                                                                                          
    Get:11 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [432 kB]                                                                                                                        
    Get:12 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]                                                                                                                                   
    Get:13 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1056 kB]                                                                                                                           
    Get:14 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [1427 kB]                                                                                                                               
    Get:15 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [39.0 kB]                                                                                                                         
    Get:16 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [478 kB]                                                                                                                          
    Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [6319 B]                                                                                                                          
    Get:18 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [2668 B]                                                                                                                              
    Fetched 18.7 MB in 59s (315 kB/s)                                                                                                                                                                                 
    Reading package lists... Done
    root@92daee5c46fc:/# apt-get install net-tools
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following NEW packages will be installed:
      net-tools
    0 upgraded, 1 newly installed, 0 to remove and 3 not upgraded.
    Need to get 196 kB of archives.
    After this operation, 864 kB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 net-tools amd64 1.60+git20180626.aebd88e-1ubuntu1 [196 kB]
    Fetched 196 kB in 2s (93.4 kB/s)    
    debconf: delaying package configuration, since apt-utils is not installed
    Selecting previously unselected package net-tools.
    (Reading database ... 4127 files and directories currently installed.)
    Preparing to unpack .../net-tools_1.60+git20180626.aebd88e-1ubuntu1_amd64.deb ...
    Unpacking net-tools (1.60+git20180626.aebd88e-1ubuntu1) ...
    Setting up net-tools (1.60+git20180626.aebd88e-1ubuntu1) ...
    root@92daee5c46fc:/# ifconfig  
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
            RX packets 12258  bytes 19688478 (19.6 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8201  bytes 589130 (589.1 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    root@92daee5c46fc:/# echo "NO PAIN,NO GAIN!"
    NO PAIN,NO GAIN!
    root@92daee5c46fc:/# exit
    exit
    
    # 验证
    [root@localhost ~]# cat .bash_history 
    apt-get update
    apt-get install net-tools
    ifconfig 
    echo "NO PAIN,NO GAIN!"
    exit
    

    5、网络

    1) 外部访问网络

    要实现外部访问容器中运行的网络应用,可以通过 -P 或 -p 参数来指定端口映射。
    -P:随机映射一个 49000~49900 的端口到内部容器开放的网络端 口
    -p:指定要映射的端口,在一个指定端口上只可以绑定一个容器。
    支持格式:
    ip:hostPort:containerPort
    ip::containerPort
    hostPort:containerPort

    2)容器互联

    相关文章

      网友评论

          本文标题:Docker 安装与应用

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