Docker实践

作者: QuietHeart | 来源:发表于2020-01-19 08:01 被阅读0次

    系统相关

    $cat /etc/issue
    Ubuntu 18.04.1 LTS \n \l
    

    安装配置

    $sudo apt-get install docker.io
    

    用户组配置

    $sudo gpasswd -a miracle docker
    $sudo systemctl docker restart
    $pkill X
    

    注:如果不进行如上的用户组配置,那么执行 docker images 的时候就会出现权限的错误。

    如下命令同样适用

    $sudo systemctl start docker
    $sudo systemctl enable docker
    $sudo systemctl restart docker
    
    #修改配置文件之后,重启docker服务
    $systemctl daemon-reload
    $systemctl restart docker.service
    

    注:发现重启之后,已运行的docker容器也退出了。

    Docker版本

    查看 docker 版本的命令:

    $docker -v
    

    Docker仓库相关

    Docker仓库的理解参考: 关于Docker仓库

    docker search 搜索镜像

    $docker search busybox
    

    搜索包含 busybox 的镜像,会有很多,比如

    miracle@xmnb4003210:~/misc$ docker search busybox
    NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    busybox                   Busybox base image.                             1634                [OK]                
    progrium/busybox                                                          70                                      [OK]
    radial/busyboxplus        Full-chain, Internet enabled, busybox made f…   24                                      [OK]
    arm32v7/busybox           Busybox base image.                             7                                       
    yauritux/busybox-curl     Busybox with CURL                               5                                       
    armhf/busybox             Busybox base image.                             4                                       
    arm64v8/busybox           Busybox base image.                             3                                       
    ......
    

    docker pull 下载镜像

    $docker pull busybox
    

    不指定版本号会默认下载 busy:latest ,结果类似如下:

    $ docker pull busybox
    Using default tag: latest
    latest: Pulling from library/busybox
    ee153a04d683: Pull complete 
    Digest: sha256:e3b586a669fae4073bb68b5bcabea26dae469ee6f157050c212c77b50f992d5a
    Status: Downloaded newer image for busybox:latest
    

    镜像下载中可以看到是分层下载,每一层都有一个唯一的ID值表示,每层下载的大小实际为该层进行的修改增量。

    docker login 登录

    $docker login --username=vaqeteart
    Password: 
    WARNING! Your password will be stored unencrypted in /home/miracle/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    

    只有登录之后,才能使用 docker push 推送提交的镜像到仓库。使用 docker login 命令直接登陆到 docker hub, 登陆信息均会保存在 $HOME/.docker/config.json 目录下

    docker logout 退出

    $docker logout
    Removing login credentials for https://index.docker.io/v1/
    

    Docker常用操作

    docker images 查看本地镜像

    $docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    ubuntu              18.04               d131e0fa2585        10 days ago         102MB
    ubuntu              latest              d131e0fa2585        10 days ago         102MB
    

    docker search 搜索镜像

    $ docker search busybox
    NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    busybox                   Busybox base image.                             1637                [OK]                
    progrium/busybox                                                          70                                      [OK]
    radial/busyboxplus        Full-chain, Internet enabled, busybox made f…   24                                      [OK]
    arm32v7/busybox           Busybox base image.                             7                                       
    yauritux/busybox-curl     Busybox with CURL                               5                           
    ......
    

    这会搜索所有dockerhub上的镜像。

    docker pull 拉取镜像

    $docker pull busybox
    

    这会将相应名称的镜像拉取(下载)到本地,拉取之后,便可以运行镜像了。

    其它可能的命令类似:

    $docker pull ubuntu:latest
    或
    $docker pull ubuntu:18.04
    #或
    $docker pull registry.hub.docker.com/ubuntu:latest
    

    docker run 运行镜像

    $docker run -it ubuntu:18.04 /bin/bash
    root@7b74c9092147:/#
    

    这样就由镜像的运行生成了一个容器,并进入到容器中了。发现,很多命令比如 ifconfig 等都没有。但是可以运行 apt-get install update

    docker ps 查看正在运行的容器

    $docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    7b74c9092147        ubuntu:18.04        "/bin/bash"         3 minutes ago       Up 3 minutes                            angry_spence
    

    注意,使用 docker ps -a 可查看所有状态的容器。

    docker exec 进入正在运行的容器

    $docker exec -it 7b74c9092147 /bin/bash
    

    这样和使用ssh登录一样,使用 C-D 退出之后也不会导致整个容器退出(注意,这个容器事先必须是已经处于运行的状态),

    使用 docker top <容器id> 可以看到,执行exec之后,新多了一个bash进程。

    使用exec命令进入容器内部就如同进入另一个机器一样,并且使用exit命令,不会像attach那样导致容器停止,所以非常适合容器内部操作
    

    docker attach 附到正在运行的容器(attach)

    $docker attach 7b74c9092147
    

    这样会进入到相应的容器中,如同exec登录一样,但是如果通过 C-d 退出容器的时候,会发现,原来用 docker run -it / docker exec -it 运行的容器也被退出了,并且 docker ps 会发现没有正在运行的容器了,而 docker ps -a 可以看到容器的状态是Exited(130)。退出的方式应该是: C-p C-q

    中文意思是附加、贴上、系上等意思,所以dokcer attach主要的作用就是进入容器,这个容器和后面的docker exec类似但是完全不一样。
    使用exit命令或者ctrl+C命令是停止容器,退出容器命令可使用ctrl+P,然后使用ctrl+Q命令,即可退出容器的虚拟终端,此时容器还在运行。
    官方不推荐使用docker attach命令进入开启了交互模式的容器,docker attach的主要功能是查看信息,容器内部操作有更加方便的docker exec命令,将在稍后介绍。
    

    docker top 查看容器运行的进程

    $docker top 7b74c9092147
    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
    root                7726                7700                0                   16:44               pts/0               00:00:00            /bin/bash
    root                8079                7700                0                   16:48               pts/1               00:00:00            /bin/bash
    

    docker stop 停止/退出容器

    $docker stop 7b74c9092147
    

    这样会停止容器,同时通过 exec 等进入容器的终端也会退出,使用 docker ps -a 可以看到停止的状态是 Exit(0), 和 docker attach 通过 C-d 或重启机器之后看到的状态Exit(130)类似。

    实践发现,对于容器中发现如下三种方式退出后,容器仍为Up或者被停止的情况视 exec 还是 attach 有所不同。

    • 运行 exit 命令: exec -it 进入、或 run -it 启动的,只是退出登录,容器仍然运行; attach 附加的会导致容器停止。
    • 运行 C-p C-q : exec -it 进入、或 run -it 启动的、或 attach 附加的,只是退出登录,容器仍然运行。
    • 运行 C-d: exec -it 进入、或 run -it 启动的,只是退出登录,容器仍然运行; attach 附加的会导致容器停止。

    docker start 启动容器

    $docker start 7b74c9092147
    

    这样会将 docker ps -a 看到的状态为Exit状态的容器重启起来。

    docker restart 重启容器

    $docker restart 7b74c9092147
    

    这样会重启容器,相当于 stopstart, 同时通过 exec 等进入容器的终端也会退出。

    docker rm 删除容器

    $docker rm 7b74c9092147
    

    执行之后,将会在 docker ps -a 中看到相应的容器已经消失。

    docker commit 提交容器

    可以提交容器,来创建相应的镜像,保存事先操作的环境。

    root@71fe2a8636b9:/#exit
    $ docker commit -m 'ubuntu with ifconfig/sudo/miracle' -a "vaqeteart" 71fe2a8636b9 vaqeteart/ubuntu:test1
    sha256:c2fd07bf051627a437da9a963ad4d06990b7b0e134f2f7e4e3936ad11474d832
    

    注意,先退出容器(71fe2a8636b9)。
    其中, -m 指定说明信息; -a 指定用户信息; 71fe2a8636b9 代表容器的id; vaqeteart/ubuntu:vim 指定目标镜像的用户名、仓库名和 tag 信息,运行命令的时候使用自己注册Docker时的用户名。

    此时Docker中就有了我们新建的镜像 vaqeteart/ubuntu:test1 ,此镜像和原有的 ubuntu 镜像区别在于多了一些工具。此时我们利用新镜像创建的容器,本身就自带之前提交容器相关的工具了。

    可看到相关的镜像

    miracle@xmnb4003210:~$ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    vaqeteart/ubuntu    test1               c2fd07bf0516        5 minutes ago       132MB
    busybox             latest              db8ee88ad75f        3 months ago        1.22MB
    ubuntu              18.04               d131e0fa2585        5 months ago        102MB
    ubuntu              latest              d131e0fa2585        5 months ago        102MB
    

    docker push 上传提交的容器/镜像

    $docker push vaqeteart/ubuntu:test1
    The push refers to repository [docker.io/vaqeteart/ubuntu]
    1b0fea03824f: Pushed 
    7660ded5319c: Mounted from library/ubuntu 
    94e5c4ea5da6: Mounted from library/ubuntu 
    5d74a98c48bc: Mounted from library/ubuntu 
    604cbde1a4c8: Mounted from library/ubuntu 
    test1: digest: sha256:b44733a335979077d46237d826a267176ea9cf1e5e80c1b5914a6277662d2b7b size: 1362
    

    注意,只有事先使用 docker login 登录之后,才能够使用 docker push 推送镜像,没有登录的话,会出现如下失败:

    $docker push vaqeteart/ubuntu:test1
    The push refers to repository [docker.io/vaqeteart/ubuntu]
    1b0fea03824f: Preparing 
    7660ded5319c: Preparing 
    94e5c4ea5da6: Preparing 
    5d74a98c48bc: Preparing 
    604cbde1a4c8: Preparing 
    denied: requested access to the resource is denied
    

    其它参考

    源自:https://www.oschina.net/question/877522_239204

    无敌菌君 2015/09/06 15:41
    step1——找到本地镜像的ID:docker images
    step2——登陆Hub:docker login --username=username --password=password --email=email
    step3——tag:docker tag <imageID> <namespace>/<image name>:<version tag eg latest>
    step4——push镜像:docker push <namespace>/<image name>
    ......
     Yashin 2015/06/12 13:07
    额,这个看一下文档就行了啊,好简单的,碰到具体问题再来提问比较好
    https://docs.docker.com/docker-hub/
    评论 (0) 引用此答案 举报
    0
    ......
    xue777hua
    xue777hua 2015/09/05 13:36
    1. 建立一个private的 registry
    2. 制作一个image:可以dockerfile,也可以docker commit
    3. docker push 即可
    

    docker info 查看docker系统配置信息

    $docker info
    Containers: 5
     Running: 1
     Paused: 0
     Stopped: 4
    Images: 3
    Server Version: 18.09.7
    Storage Driver: overlay2
     Backing Filesystem: extfs
     Supports d_type: true
     Native Overlay Diff: true
    Logging Driver: json-file
    Cgroup Driver: cgroupfs
    Plugins:
     Volume: local
     Network: bridge host macvlan null overlay
     Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
    Swarm: inactive
    Runtimes: runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: 
    runc version: N/A
    init version: v0.18.0 (expected: fec3683b971d9c3ef73f284f176672c44b448662)
    Security Options:
     apparmor
     seccomp
      Profile: default
    Kernel Version: 4.15.0-43-generic
    Operating System: Ubuntu 18.04.1 LTS
    OSType: linux
    Architecture: x86_64
    CPUs: 4
    Total Memory: 7.343GiB
    Name: xmnb4003210
    ID: DPEZ:7TCA:W5LW:QFSM:PU7X:5SC6:KXU5:SN4A:VTAS:HBTZ:ZUUJ:EO6D
    Docker Root Dir: /var/lib/docker
    Debug Mode (client): false
    Debug Mode (server): false
    Registry: https://index.docker.io/v1/
    Labels:
    Experimental: false
    Insecure Registries:
     127.0.0.0/8
    Live Restore Enabled: false
    
    WARNING: No swap limit support
    

    docker help 帮助信息

    查看整体帮助信息:

    $docker help
    

    查看具体命令帮助信息:

    docker <command> --help
    或
    docker help <command>
    

    docker volume 数据卷管理

    管理数据卷使用 docker volume 命令,数据卷是容器数据持久化的一个组件。其中:

    • docker volume ls :可以查看本机的全部数据卷
    • docker volume rm :删除不需要的数据卷(数据卷与容器的生命周期完全独立,所以容器删除后数据卷并不会删除,时间久了数据卷就会越来越多)
    • docker volume inspect :查看数据卷的详细信息
    • docker volume create :创建一个数据卷
    • docker volume prune :删除所有未使用的卷

    REFERENCE 启动镜像并且创建匿名Volume

    $docker run --name test_volume -it  -v /home/miracle/mydata d131e0fa2585  /bin/bash
    

    Volume用于容器/主机数据的管理、共享、与传输等。这里,不能用 docker exec 来进入已有的容器,只能从镜像启动时指定。启动之后,你会发现容器中有 /home/miracle/mydata 这个目录。这里,使用 --name 指定生成的容器名称为 test_volume, 便于后续查看管理。

    检查挂载的volume在host主机中的路径

    $docker inspect test_volume
    .....
            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90",
                    "Source": "/var/lib/docker/volumes/3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90/_data",
                    "Destination": "/home/miracle/mydata",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
            ],
    ......
    

    由上可见,容器中的 /home/miracle/mydata 其实是对应了主机中的 /var/lib/docker/volumes/3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90/_data 的,实际操作中,在容器中,或者在主机中进行对该目录的操作(添加删除文件),在容器和主机的对应路径中都会体现出来。

    REFERENCE 创建有名Volume并在启动镜像时挂载到容器中

    $docker volume create test_volume2
    test_volume2
    $sudo ls /var/lib/docker/volumes
    [sudo] miracle 的密码: 
    0b66e301bdab3edcab10ba390aa522dedd5b2dedbf49273f0ca0aa33c71d59bf  metadata.db
    3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90  test_volume2
    $docker run --name test_volume2 -it -v test_volume2:/home/miracle/volume2 d131e0fa2585 /bin/bash
    $docker inspect test_volume2
    ......
            "Mounts": [
                {
                    "Type": "volume",
                    "Name": "test_volume2",
                    "Source": "/var/lib/docker/volumes/test_volume2/_data",
                    "Destination": "/home/miracle/volume2",
                    "Driver": "local",
                    "Mode": "z",
                    "RW": true,
                    "Propagation": ""
                }
    ......
    

    这里,首先使用 docker volume create 创建一个 test_volume2 的volume,然后通过 docker run 将其挂载到容器的 /home/miracle/volume2 目录中,启动之后,我们可以发现,在容器中的 /home/miracle/volume2 对应挂载了主机中的 /var/lib/docker/volumes/test_volume2/_data

    REFERENCE 启动镜像的时候将主机中一个目录挂载到容器中

    $docker run --name test_mount -it -v /home/miracle/tmpTrans:/home/miracle/tmpTrans d131e0fa2585 /bin/bash
    

    这里, /home/miracle/tmpTrans:/home/miracle/tmpTrans 冒号前面是主机的路径,冒号后面是容器的路径。这样执行之后,你会发现,容器中会创建相应的路径,并将主机中相应的路径挂载进来。

    注:使用 docker exec -v xxx 是不行的。主机的路径名一定要是绝对路径或者 ~/xxx 否则会被当成volume挂载。这个方式依赖主机的目录结构,所以可以移植性不如前面volume的方式。

    其它

    更多学习参考: Docker实践

    实践尝试

    重启宿主机之后容器停止,重新启动容器数据仍在

    使用 docker exec -it <id> /bin/bash 进入容器之后,再 C-d 退出,发现 docker ps 容器仍旧在运行。

    docker ps 发现有运行的容器之后,重启机器,会发现 docker ps 没有运行的容器了,但是 docker ps -a 会有Exit的容器。

    重启机器后, docker start <id> 会启动之前的容器,并且使用 docker exec -it <id> /bin/bash 会发现之前创建的文件仍在。

    相关文章

      网友评论

        本文标题:Docker实践

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