设为首页 收藏本站
查看: 649|回复: 0

[经验分享] docker镜像与容器(二)

[复制链接]

尚未签到

发表于 2018-5-28 08:38:27 | 显示全部楼层 |阅读模式
docker镜像与容器
docker改变了什么?
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试
面向运维:环境一致性
面向架构:自动化扩容(微服务)

获取镜像
可以使用 docker pull命令来从仓库获取所需要的镜像。
[root@localhost~]# docker pull centos#获取一个centos的镜像
[root@localhost~]# docker images#查看docker的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              a8493f5f50ff        12 days ago         192.5 MB
在列出信息中,可以看到几个字段信息,
来自于哪个仓库,比如centos,
镜像的标记,比如lastest
它的 ID 号( 唯一)
创建时间
镜像大小

dockerrmi + ID#删除镜像,如果这个镜像创建了容器就不能删除
创建并且启动第一个容器
[root@localhost ~]#docker run centos /bin/echo "hehe"
hehe
所有容器都是使用这个参数dockerrun,centos指的是镜像的名称,后面跟的是命令(执行命令)
可以用dockerrun --help查看参数
4.1 docker help
docker command
docker   # docker 命令帮助
Commands:
    attach    Attach to a running container                 # 当前 shell 下 attach连接指定运行镜像
    build     Build an image from a Dockerfile              # 通过 Dockerfile 定制镜像
    commit    Create a new image from a container'schanges # 提交当前容器为新的镜像
    cp        Copy files/folders from the containersfilesystem to the host path
              #从容器中拷贝指定文件或者目录到宿主机中
    create    Create a new container                        # 创建一个新的容器,同run,但不启动容器
    diff      Inspect changes on a container'sfilesystem   # 查看 docker 容器变化
    events    Get real time events from the server          # 从 docker 服务获取容器实时事件
    exec      Run a command in an existingcontainer        #在已存在的容器上运行命令
    export    Stream the contents of a container as a tararchive   
              # 导出容器的内容流作为一个 tar 归档文件[对应import ]
    history   Show the history of an image                  # 展示一个镜像形成历史
    images    List images                                   #列出系统当前镜像
    import    Create a new filesystem image from thecontents of a tarball  
              # 从tar包中的内容创建一个新的文件系统映像[对应export]
    info     Display system-wide information               # 显示系统相关信息
    inspect   Return low-level information on a container   # 查看容器详细信息
    kill      Kill a running container                      # kill 指定 docker 容器
    load      Load an image from a tar archive              # 从一个 tar 包中加载一个镜像[对应save]
    login     Register or Login to the docker registryserver   
              # 注册或者登陆一个 docker源服务器
    logout    Log out from a Docker registry server         # 从当前 Docker registry 退出
    logs      Fetch the logs of a container                 # 输出当前容器日志信息
    port      Lookup the public-facing port which isNAT-ed to PRIVATE_PORT
              #查看映射端口对应的容器内部源端口
    pause     Pause all processes within a container        # 暂停容器
    ps        List containers                               # 列出容器列表
    pull      Pull an image or a repository from thedocker registry server
              #从docker镜像源服务器拉取指定镜像或者库镜像
    push      Push an image or a repository to thedocker registry server
              #推送指定镜像或者库镜像至docker源服务器
    restart   Restart a running container                   # 重启运行的容器
    rm        Remove one or more containers                 # 移除一个或者多个容器
    rmi       Remove one or more images                 
              #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
    run      Run a command in a new container
              #创建一个新的容器并运行一个命令
    save      Save an image to a tar archive                # 保存一个镜像为一个 tar 包[对应load]
    search    Search for an image on the Docker Hub         # 在 docker hub 中搜索镜像
    start     Start a stopped containers                    # 启动容器
    stop      Stop a running containers                     # 停止容器
    tag       Tag an image into a repository                # 给源中镜像打标签
    top       Lookup the running processes of acontainer   # 查看容器中运行的进程信息
    unpause   Unpause a paused container                    # 取消暂停容器
    version   Show the docker version information           # 查看 docker 版本号
    wait      Block until a container stops, then printits exit code   
              # 截取容器停止时的退出状态值
Run 'docker COMMAND --help' for more information on a comman
查看启动的docker
[root@localhost ~]#docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
6daf1bacfa9c        centos              "/bin/echo hehe"    15 minutes ago      Exited (0) 15 minutes ago                       cranky_darwin
参数介绍:
首先是一个容器的ID,然后是镜像,后面是命令(COMMAND),创建的时间,状态,端口,名称(docker有名称库,不指定名字的时候会自动帮我们产生名称)

创建一个指定名字的容器
[root@localhost ~]#docker run --name mydocker -t -i centos /bin/bash
参数介绍:
--name是指定docker的名字,-t 是让系统分配一个伪终端tty,-i表示让这个容器的标准输入保持打开的状态(打开之后就可以登进去)(-t-i要一起使用),最后是?bin/bash表示执行一个命令,这个命令是/bin/bash.-h指定容器系统的主机名
[root@94ba510e3127 /]# ps -ef#可以查看这个容器运行了什么进程
UID        PID PPID  C STIME TTY          TIME CMD
root         1    0  0 10:43 ?        00:00:00 /bin/bash(这个进行是我启动容器的时候让他执行的)
root        13    1  9 10:48 ?        00:00:00 ps -ef
[root@localhost yum]#docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
94ba510e3127       centos             "/bin/bash"         7minutes ago       Up 7 minutes                            mydocker
可以看到docker的主机名跟容器的ID是一样的
当我们执行dockersrun的时候的流程:首先docker会检测本地有没有一个叫centos的镜像,如果没有他就会从公共的仓库(dockerhub)去下载,第二他就利用centos的镜像启动了一个容器
可以用exit推出这个容器
[root@localhost ~]#docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
94ba510e3127        centos              "/bin/bash"         12 minutes ago      Exited (0) 7 seconds ago                        mydocker
6daf1bacfa9c        centos              "/bin/echo hehe"    32 minutes ago      Exited (0) 32 minutes ago                       cranky_darwin

镜像操作的几个命令:
搜索镜像:dockersearch
获取镜像:dockerpull
查看镜像:dockerimages
删除镜像:dockerrmi
启动容器:dockerrun --name -hhostname
停止容器:docker stopCONTAINER ID
查看容器:dockersps-a-L(加了-a会显示所有的容器进程)
进入容器:dockerexec|dockerattach ID
删除容器:dockerrm
停止后启动容器:dockerstart ID
[root@localhost ~]#docker start 94ba510e3127
94ba510e3127
[root@localhost ~]#docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
94ba510e3127        centos              "/bin/bash"         28 minutes ago      Up 11 seconds                           mydocker
[root@localhost~]# docker attach  94ba510e3127#进入容器
[root@94ba510e3127 /]#ps aux
USER       PID %CPU %MEM    VSZ  RSS TTY      STAT START   TIME COMMAND
root         1 0.0  0.1  11768 1880 ?        Ss   11:12  0:00 /bin/bash
root        13 0.0  0.1  47440 1668 ?        R+   11:13  0:00 ps aux
用sttach进入的话有问题:如果你再开个窗户再进去的话他的显示是同步的,而且exit退出后这个容器就停了(因为我们退出了bash)
可以用nsenter来进入(不过需要知道进程的PID)(如果没有这个命令的话可以用yuminstall util-linux来安装)
查看PID
[root@localhost ~]# docker inspect --format"``.`State`.`Pid`" 94ba510e3127(ID或者容器名)
20979
[root@localhost~]# nsenter -t 20979 -u -i -n -p#进入容器
[root@94ba510e3127 ~]#
[root@localhost ~]#nsenter -t 20979 -u -i -n -p
[root@94ba510e3127 ~]#nsenter --help

用法:
nsenter [options] <program>[<argument>...]

Run a program withnamespaces of other processes.

选项:
-t, --target <pid>     要获取名字空间的目标进程
-m, --mount[=<file>]   enter mount namespace
-u, --uts[=<file>]     enter UTS namespace (hostname etc)
-i, --ipc[=<file>]     enter System V IPC namespace
-n, --net[=<file>]     enter network namespace
-p, --pid[=<file>]     enter pid namespace
-U, --user[=<file>]    enter user namespace
-S, --setuid <uid>     set uid in entered namespace
-G, --setgid <gid>     set gid in entered namespace
     --preserve-credentials do not touch uidsor gids
-r, --root[=<dir>]     set the root directory
-w, --wd[=<dir>]       set the working directory
-F, --no-fork          执行 <程序> 前不 fork
-Z, --follow-context   set SELinux context according to --targetPID

-h, --help    显示此帮助并退出
-V, --version 输出版本信息并退出
可以把查找PID和登录容器的命令写成脚本
[root@localhost ~]# vins.sh
#!/bin/bash
PID=$(docker inspect--format "``.`State`.`Pid`" $1)
nsenter -t $PID -u -i-n -p
这样子就只要传入一个容器IP就可以登陆了
[root@localhost ~]#./ns.sh 94ba510e3127
[root@94ba510e3127 ~]#
[root@94ba510e3127~]# docker run --rm centos /bin/echo "hehe"#执行容器并且删除容器
hehe
删除所有的容器
dockerkill $(docker ps -a -q)
[root@94ba510e3127 ~]# docker ps -a -q#只列出PID
94ba510e3127
6daf1bacfa9c
  

在ubuntu容器的基本操作:
ubuntu@ubuntu-virtual-machine:~$docker run ubuntu echo "hello word"
hello word

启动交互式容器:
docker run -i -t IMAGE /bin/bash
-i--interactive=true |fasle 默认是fasle
-t --tty=true|fasle 默认是fasle

查看容器:
docker ps[-a] [-l]
-a 列出所有的容器,-l列出最新创建的容器
docker inspect 可以接容器的ID也可以是名字
会对容器详细的检查,返回配置的信息(包括名称,命令,网络配置等)

自定义容器命名:
docker run --name=container01 -I-t ubuntu /bin/bash

重新启动停止的容器:
docker start [-i] 容器名

删除已经停止的容器(不能删除运行中的)
docker rm ID

守护试容器:
什么是守护试容器:在大多数情况下,我们需要一个能够长期运行的容器来提供服务。
能够长期运行
没有交互式会话
适合运行应用程序和服务
以守护形式运行容器:
1,docker run -i-t IMAGE /bin/bash
Ctrl+p Ctrl +q结束的容器,这样子容器就会在后天运行
首先创建一个容器
buntu@ubuntu-virtual-machine:~$docker run -i -t ubuntu /bin/bash
root@f2d00398e2c4:/#ubuntu@ubuntu-virtual-machine:~$ #Ctrl+p Ctrl +q结束的容器
然后
ubuntu@ubuntu-virtual-machine:~$docker ps
CONTAINERID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f2d00398e2c4        ubuntu:latest       "/bin/bash"         37 seconds ago      Up 31 seconds                           cocky_lalande
发现还在后台运行

怎么结束守护运行容器?
可以附加到运行中的容器:
docker attach 容器名

ubuntu@ubuntu-virtual-machine:~$ docker attach f2d00398e2c4#重新进入容器
root@f2d00398e2c4:/#
root@f2d00398e2c4:/# exit#用exit退出
exit
ubuntu@ubuntu-virtual-machine:~$ docker ps#容器已经不再运行
CONTAINERID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

启动守护式容器2:
docker run -d 镜像名 COMMAND[ARG…]#-d会告诉机器在启动容器时在后台的模式运行,只是以后台的形式运行,在命令结束后依旧会停止
ubuntu@ubuntu-virtual-machine:~$docker run --name dc1 -d ubuntu /bin/bash -c "while true; do echo helloword;sleep 1;done"
00cf672ea018961f73e0ec16f9dbc98750894340190575e1913cf5263576423d
ubuntu@ubuntu-virtual-machine:~$docker ps
CONTAINERID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
00cf672ea018        ubuntu:latest       "/bin/bash -c 'while   12 seconds ago      Up 10 seconds
查看容器内部运行的情况:可以用容器的logs日志命令来查看容器内部运行的情况
查看容器日志:
docker los [-f] [-t] [--tail] 容器名
-f --follow=true|false 默认为false#告诉logs命令一直跟踪日志的变化并返回结果
-t --timestamps=true|false 默认为false#是在返回的结果上加上时间戳
--tail=“all”#选择结尾处多少数量的日志,不指定的话就会返回所有的日志

查看容器内的进程:
可以用:docker top 容器名查看运行中容器运行情况
ubuntu@ubuntu-virtual-machine:~$docker top dc1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                8342                7138                0                   15:02               ?                   00:00:14            /bin/bash -c while true; do echohello word;sleep 1;done

在运行的容器中启动新的进程:
docker exec [-d] [-i] [-t] 容器名 COMMAND[ARG](跟run命令相似)
ubuntu@ubuntu-virtual-machine:~$docker exec -i -t dc1 /bin/bash
root@00cf672ea018:/#ubuntu@ubuntu-virtual-machine:~$ #使用Ctrl+p Ctrl +q
ubuntu@ubuntu-virtual-machine:~$docker top
docker:"top" requires a minimum of 1 argument. See 'docker top --help'.
ubuntu@ubuntu-virtual-machine:~$docker top dc1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                8342                7138                0                   15:02               ?                   00:00:18            /bin/bash -c while true; do echohello word;sleep 1;done
root                12826               7138                0                   16:11               pts/1               00:00:00            /bin/bash
root                12889               8342                0                   16:12               ?                   00:00:00            sleep 1

停止守护式容器:
1,docker stop 容器名#是发送一个信号给容器,等待容器停止
2,docker kill 容器名#直接停止
ubuntu@ubuntu-virtual-machine:~$docker ps
CONTAINERID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
5d3123ba6245        ubuntu:latest       "/bin/bash -c 'while   6 seconds ago       Up 5 seconds                            dc2
00cf672ea018        ubuntu:latest       "/bin/bash -c 'while   13 hours ago        Up 13 hours                             dc1
ubuntu@ubuntu-virtual-machine:~$ docker stop dc2#停止的时候会等待,成功停止后会返回容器的名字
dc2
ubuntu@ubuntu-virtual-machine:~$docker ps
CONTAINERID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
00cf672ea018        ubuntu:latest       "/bin/bash -c 'while   13 hours ago        Up 13 hours                             dc1
ubuntu@ubuntu-virtual-machine:~$docker kill dc1
dc1
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-481984-1-1.html 上篇帖子: docker仓库(手动创建) 下篇帖子: docker核心技术导图分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表