zoukankan      html  css  js  c++  java
  • Docker学习——基本使用

    最近公司项目要用docker部署,第一次接触,记录一下,方便使用时查阅。

    你有没有遇到过这种情况,在本地运行良好的代码,在另一台电脑或者另一个环境里一堆bug,可以说是水土不服,本质上是两个电脑的运行环境不一样,但是不能每次给到别人都要装一遍运行环境吧,这样很抓狂,这时候docker就横空出世来拯救我们了。docker相当于我们平时使用的虚拟环境,但是它比虚拟环境好,比它轻便,并且可移植,使用起来非常方便。

    docker主要有三块内容:仓库(registry)、镜像(image)和容器(container)。理解了这三个内容,相信大家使用起来也没什么问题了。当然最好的教程是它的官方文档了:https://docs.docker.com/engine/reference/run/

    一、仓库镜像 

    使用过github的人应该对仓库不陌生,docker仓库就相当于一个收纳盒,里面有很多官方或者个人上传的镜像,我们要用时只需要从里面拿出来就好了。

    1、docker search 

    用于查找仓库里的镜像,比如我要用python,那么我就可以用这个命令查看里面已有的python镜像,拿来用即可,一般官方的镜像都是在第一个,如下图中,它是按星标量(stars)来排序的。

    2、docker pull [image]

    用于从docker仓库中拉取我们需要的镜像到我们本地,不指定版本的话,默认下载的是最新版本,如果我们要python3.7版本,则可以用python:3.7的格式

    3、docker push [image]

    用于将本地的镜像上传到镜像仓库,要先登陆到镜像仓库才可上传

    4、docker login

    用于登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

    5、docker logout

    用于登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

    二、本地镜像管理 

    上面说的是如何操作官方镜像仓库,接下来我们说说本地镜像,比如我们下载了好几个镜像到本地,我们本地也就有了镜像了,就可以以这些镜像为基础做很多事了。

    1、docker images

    用于查看本地的所有镜像

    2、docker rmi 

    用于删除本地镜像,后面可以接镜像名,也可以是镜像ID,镜像ID还可以不用写全名,只要写前几位,只要能区分就行,比如下面都是删除同一个镜像。加上-f可强制退出。后面也可以同时接多个镜像,它会一起删除

    docker rmi python_v5
    docker rmi e1b

    3、docker tag

    用于标记本地镜像,将其归入某一仓库,相当于重命名。如下图中,执行之后image ID没有变。

    4、docker save

    用于将指定镜像保存成 tar 归档文件。我们做好的镜像要传给别人一般会保存成tar格式。

    docker save [OPTIONS] IMAGE [IMAGE...]

    以上两种方式都可以把本地镜像Ubuntu保存为tar文档,然后可以将它们拷贝给别人用了,使用的人怎么导入到自己的docker里呢?

    5、docker load

    用于导入使用 docker save 命令导出的镜像。以下两种方式都可以。

    6、docker export/import

    用于将镜像归档为tar文件和从归档文件中创建镜像。刚刚save和load也是这种功能,有什么区别呢?

    (1) docker save image-name:  将镜像保存为文件,然后通过docker load再加载回来为一个镜像。会保存该镜像的的所有历史记录,比docker export 导出的文件大,很容易理解,因为save时保存了镜像的所有历史记录。

    (2) docker export container-name: 将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。

    7、docker history

    查看指定镜像的创建历史

    三、容器操作

    1、docker run 

    创建一个新的容器并运行一个命令,注意Docker容器后台运行,就必须有一个前台进程,主线程结束,容器会退出。所以如果docker run -d image 这样启动容器后,你在用docker ps 往往看不到容器正在运行,其实它启动过,然后马上又停止了,但是如果你给它一个前台进程,它会一直running,即必须有交互。比如用docker run -dit image

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    OPTIONS说明:
    
    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
    
    -d: 后台运行容器,并返回容器ID;
    
    -i: 以交互模式运行容器,通常与 -t 同时使用;
    
    -P: 随机端口映射,容器内部端口随机映射到主机的高端口
    
    -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
    
    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    
    --name="nginx-lb": 为容器指定一个名称;
    
    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
    
    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
    
    -h "mars": 指定容器的hostname;
    
    -e username="ritchie": 设置环境变量;
    
    --env-file=[]: 从指定文件读入环境变量;
    
    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
    
    -m :设置容器使用内存最大值;
    
    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    
    --link=[]: 添加链接到另一个容器;
    
    --expose=[]: 开放一个端口或一组端口;
    
    --volume , -v:    绑定一个卷
    View Code
    实例
    1 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
       docker run --name=mynginx -d nginx:latest
    2 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
       docker run -P -d nginx:latest
    3 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
      docker run -p 80:80 -v /data:/data -d nginx:latest
    4  绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.180 端口上。
      docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
    5 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
      ~$ docker run -it nginx:latest /bin/bash
      root@b8573233d675:/# 
    6 使用镜像python:v2以后台模式启动一个容器,并运行容器内的/opt/下的hello.py文件
    docker run -d 59c /bin/bash -c 'python /opt/hello.py'

    2、docker ps [-a]

    查看正在运行的容器,加上-a表示查看所有容器,不管是否在运行。a即all的意思。

    3、docker inspect

    查看某个镜像或容器信息。

    ➜  Downloads docker inspect python_v5
    [
        {
            "Id": "sha256:e1b27deb648064491092ee935137217b99d4bb69df6cbf67387cbf7f4c58d32c",
            "RepoTags": [
                "python_v5:latest"
            ],
            "RepoDigests": [],
            "Parent": "",
            "Comment": "",
            "Created": "2019-08-01T08:07:31.264992514Z",
            "Container": "6302d3a0173fb32427ca0da36f01623ff84c62db06bdd2bb9096573ec99b7166",
            "ContainerConfig": {
                "Hostname": "6302d3a0173f",
                "Domainname": "",
                "User": "",
                "AttachStdin": true,
                "AttachStdout": true,
                "AttachStderr": true,
                "Tty": true,
                "OpenStdin": true,
                "StdinOnce": true,
                "Env": [
                    "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "LANG=C.UTF-8",
                    "GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
                    "PYTHON_VERSION=3.7.4",
                    "PYTHON_PIP_VERSION=19.1.1"
                ],
                "Cmd": [
                    "/bin/bash"
                ],
                "Image": "830",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {}
            },
            "DockerVersion": "19.03.0",
            "Author": "",
            "Config": {
                "Hostname": "6302d3a0173f",
                "Domainname": "",
                "User": "",
                "AttachStdin": true,
                "AttachStdout": true,
                "AttachStderr": true,
                "Tty": true,
                "OpenStdin": true,
                "StdinOnce": true,
                "Env": [
                    "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "LANG=C.UTF-8",
                    "GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D",
                    "PYTHON_VERSION=3.7.4",
                    "PYTHON_PIP_VERSION=19.1.1"
                ],
                "Cmd": [
                    "/bin/bash"
                ],
                "Image": "830",
                "Volumes": null,
                "WorkingDir": "",
                "Entrypoint": null,
                "OnBuild": null,
                "Labels": {}
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 1178611787,
            "VirtualSize": 1178611787,
            "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/94b14c0267ea97d2e202b03c961a526a5d0e7efa569b369ecaaf5b4a158c6b0f/diff:/var/lib/docker/overlay2/8088e680020134339f3dbebae5e350a7d5289d49c05747194098d5edddb5d320/diff:/var/lib/docker/overlay2/8d6375915ac6b8ac7bab53ea08b7eb4d55ad34983d1571d55c2d2cbfc7e34533/diff:/var/lib/docker/overlay2/1e1a0b9b37457942435da7f36fcc5e9edc537502f5f7bafc6c3f0a306f9fe9b5/diff:/var/lib/docker/overlay2/908161c3a74b133dfa9f64b92263502986a6f4928a35ddb36be66f82c8c450c0/diff:/var/lib/docker/overlay2/f878d6e9110afb24ae50b3cd4ec19add29cf3eeb65f4fc902f0be8121487688c/diff:/var/lib/docker/overlay2/600822aff1d1245171a2d6b4d445c648e8a647baae59d17ab24c06c816030751/diff:/var/lib/docker/overlay2/f5254203568c9d7a82d99756c04d1198d8104a385058cc7d8fa72af1e53b0bbf/diff:/var/lib/docker/overlay2/a253040337dc2660037f2c654d5781a259d98a225ff8777db7ed8eb6e3f4527c/diff:/var/lib/docker/overlay2/78e6b4db4897d7473557fe9700cfdd384703dcee8fe7bee3edb2d65f2fccbf41/diff:/var/lib/docker/overlay2/ff2b9485217fa82eec4461ee662b0bc99aab13625a4f3794c6e7188a6b1cc108/diff:/var/lib/docker/overlay2/e596defbdc38e3c423601d8fc559579012acd5b219447374ed6ea73ca4420560/diff",
                    "MergedDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/merged",
                    "UpperDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/diff",
                    "WorkDir": "/var/lib/docker/overlay2/e5b7b0d9262a7ad3775893caa0629d13786d0ff59c52ab223b55b45eb9ac6d0c/work"
                },
                "Name": "overlay2"
            },
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:31b0e148310d3953be8ba9ff530a91424f01688ee604f99cbfb519dab9e8c66d",
                    "sha256:46601dcd41143bcf3068c33e6a3c243b91a9887cccc9f2538dd04e0052029db5",
                    "sha256:e9313b51f46d907a186066e017c68c9201dbfb858dc862e30ba25f0e1b2ea6b3",
                    "sha256:05c027e771c84f989d3014001fb68093d26433d8cdbd8a33ef6a9fb421236ebd",
                    "sha256:8c487c756d719a312177878c31e091160a82466c592082f229b81150cabd8891",
                    "sha256:a8063b4b5a7d8c0c0f7a4bc3f7ad3b40022fee3e4d80cddc422c035337d63bab",
                    "sha256:9c97ad5abfed00d029883bcc6d16f59f0a93d64613f125f6161622589e5adae0",
                    "sha256:bf67ef7447f3277d7ad9f21c89386e517ef7400c0e8edd69b613c59d1ad3d907",
                    "sha256:0d93f713b4088e1d0121f020642e524965bd88ba808360ce402a94bfa4c33099",
                    "sha256:e03d22e105305aefe1cd4cc1888438d35f4cfd1be4201c48812b1f1223ef5fdf",
                    "sha256:beaa082ea74ddfd28eeaeb6afe1d9d3c1cfa97f327f62a716915babd7bb8ba95",
                    "sha256:e07fc2dcedcb9699d7d275a292fbf2bc012487e723d914147ede6351e4f59980",
                    "sha256:c6043ace8fd9e940870be978e72abdfa976bc1513682f24c9b0bf4626da3cc98"
                ]
            },
            "Metadata": {
                "LastTagTime": "0001-01-01T00:00:00Z"
            }
        }
    ]
    View Code

    4、docker start/stop/restart

    docker start :启动一个或多个已经被停止的容器

    docker stop :停止一个运行中的容器

    docker restart :重启容器

    5、docker rm

    删除一个或多少容器,加上-f可强制退出,后面也可以接多个container一起删除

    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
    OPTIONS说明:
    
    -f :通过SIGKILL信号强制删除一个运行中的容器
    
    -l :移除容器间的网络连接,而非容器本身
    
    -v :-v 删除与容器关联的卷
    View Code

    6、docker create 

    创建一个容器但不运行它。

    docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

    7、decker exec

    在运行的容器中执行命令

    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    
    OPTIONS说明:
    -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端

    实例

    在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:

    docker exec -it mynginx /bin/sh /root/runoob.sh
    http://www.runoob.com/

    在容器 mynginx 中开启一个交互模式的终端:

    ~$ docker exec -i -t  mynginx /bin/bash
    root@b1a0703e41e7:/#

    8、docker attach

    连接到正在运行中的容器。要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕,带上--sig-proxy=false可以确保CTRL-D或CTRL-C不会关闭容器。

    docker attach --sig-proxy=false mynginx

    9、docker commit

    从容器创建一个新的镜像。这个比较实用。

    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    
    OPTIONS说明:
    -a :提交的镜像作者;
    -c :使用Dockerfile指令来创建镜像;
    -m :提交时的说明文字;
    -p :在commit时,将容器暂停。
    ~$ docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 
    sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
    ~$ docker images mymysql:v1
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mymysql             v1                  37af1236adef        15 seconds ago      329 MB

    10、docker cp

    用于容器与主机之间的数据拷贝。我们经常要将写好的代码放入容器中,这个方法就很适用。

    docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
    docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
    docker cp /opt/try  96f7f14e99ab:/home/zzf

    11、docker logs

    获取容器的日志

    docker logs [OPTIONS] CONTAINER

      OPTIONS说明:

    • -f : 跟踪日志输出

    • --since :显示某个开始时间的所有日志

    • -t : 显示时间戳

    • --tail :仅列出最新N条容器日志

     12、docker 启停

    # 停止服务
    systemctl stop docker 
    # 重启服务
    systemctl daemon-reload
    systemctl restart docker
    systemctl enable docker

    13、Docker DeviceMapper占用空间太大解决方案

    • 问题主要在于原先分配的空间过大导致的,使用“docker info”查看
    • 首先备份需要的容器和镜像,使用“docker save”或者“docker export”.
    • 然后暂停docker;
    • 删除/var/lib/docker目录;
    • 重建目录,空间分配
    mkdir -p /var/lib/docker/devicemapper/devicemapper
    dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1M count=0 seek=8192
    • 重启docker
  • 相关阅读:
    关于Android中的三级缓存
    Android中的自定义控件(二)
    Android中的自定义控件(一)
    安卓四大组件之内容提供者
    实施面试题
    实施相关资料
    短路运算符
    第二章SQL映射文件
    第一章 初始MyBatis
    周测
  • 原文地址:https://www.cnblogs.com/zongfa/p/11295685.html
Copyright © 2011-2022 走看看