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

[经验分享] Docker镜像和容器

[复制链接]

尚未签到

发表于 2017-11-16 20:06:14 | 显示全部楼层 |阅读模式
  本节内容:


  • 安装Docker
  • 卸载docker
  • 镜像基本操作
  • 容器基本操作

一、安装Docker
  Docker 对 Linux 内核版本的最低要求是3.10,如果内核版本低于 3.10 会缺少一些运行 Docker 容器的功能。这些比较旧的内核,在一定条件下会导致数据丢失和频繁恐慌错误。
  CentOS 6:
  操作系统需要升级下内核,升级内核后安装Docker:



# yum install -y docker-io
  CentOS 7:



# yum install -y docker
  我这里用的CentOS 7。启动docker:



# systemctl start docker.service

二、卸载docker



# systemctl stop docker.service
# yum remove docker docker-common docker-selinux docker-engine container-selinux
# rm -rf docker/

三、镜像基本操作


  • 搜索镜像 docker search
  • 获取镜像 docker pull
  • 查看镜像 docker images
  • 删除镜像 docker rmi
  1. 获取镜像



# docker pull centos
  默认是去 docker.io/library/centos 仓库中拉取centos镜像,镜像资源都在国外,所以在国内要获取docker镜像,速度有时会很慢。为了快速访问 Docker 官方镜像都会配置三方加速器,目前常用三方加速器有:网易、USTC、DaoCloud、阿里云。
  现在 Docker 官方针对中国区推出了镜像加速服务。通过 Docker 官方镜像加速,国内用户能够以更快的下载速度和更强的稳定性访问最流行的 Docker 镜像。
  Docker 中国官方镜像加速可通过 registry.docker-cn.com 访问。目前该镜像库只包含流行的公有镜像,而私有镜像仍需要从美国镜像库中拉取。
  可以使用以下命令直接从该镜像加速地址进行拉取:



# docker pull registry.docker-cn.com/myname/myrepo:mytag
  例如:



# docker pull registry.docker-cn.com/library/centos:latest
  注意: 除非修改了 Docker 守护进程的 --registry-mirror 参数 , 否则您将需要完整地指定官方镜像的名称。例如,library/ubuntu、library/redis、library/nginx。
  给Docker守护进程配置加速器:
  如果要配置 Docker 守护进程默认使用 Docker 官方镜像加速。您可以在 Docker 守护进程启动时配置 --registry-mirror参数。
  (1)通过命令行启动Docker



# docker --registry-mirror=https://registry.docker-cn.com daemon
  (2)通过配置文件启动Docker


  • Docker版本在 1.12 或更高
  修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。



{
"registry-mirror": ["https://registry.docker-cn.com"]
}
# systemctl restart docker.service

  • Docker版本在 1.8 与 1.11 之间
  找到 Docker 配置文件,在配置文件中的 DOCKER_OPTS 加入。不同的 Linux 发行版的配置路径不同。
  2. 查看镜像



# docker images
DSC0000.png



  • REPOSITORY:镜像所属的仓库名。
  • TAG:镜像的标签名
  • IMAGE ID:镜像的唯一ID,实际上和磁盘上存储的镜像的文件名是对应的。这是文件名截断显示的结果。
  • CREATED:镜像建立的时间。
  • SIZE:镜像的大小。
  查看镜像的详细信息:



# docker inspect 328edcd84f1b
  3. 镜像标签和仓库


  • REPOSITORY和REGISTRY
  一系列镜像的集合。包含了一系列关联的镜像,比如上图中的Ubuntu,就是个大的仓库,下面的不同镜像就对应这个操作系统的不同版本。这和之前讲到的docker组件中的仓库有很大的区别。REGISTRY提供的是docker镜像的存储服务。所以在REGISTRY仓库中包含了很多REPOSITORY之类的仓库。而在REPOSITORY仓库中包含的是一个一个独立的镜像。


  • TAG 镜像标签
  在仓库中,不同的镜像是以标签来区分的。一个REPOSITORY仓库名和一个标签名就构成了一个完整的镜像名字。我们之前在演示的时候只是指定镜像名Ubuntu,并没有指定标签名。那么在docker中会默认使用latest标签所对应的镜像。
  4. 删除镜像



# docker rmi 328edcd84f1b
  5. 推送镜像
  pull镜像到本地后,我们在具体的业务场景中,可以会自己修改镜像,制作镜像,完成后可以把镜像push到Docker Hub(https://registry.hub.docker.com),或者自建的registry中。这个在后面的博客中会写到。
  6. 导出镜像



[iyunv@node1 ~]# docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
registry.docker-cn.com/library/centos   latest              328edcd84f1b        13 days ago         192.5 MB
[iyunv@node1 ~]# docker save 328edcd84f1b > /opt/centos.tar.gz
  7. 导入镜像
  比如有些镜像很难下载,别人下载好了,或者之前下载过了,可以导入。



[iyunv@node1 ~]# docker load < /opt/centos.tar.gz

四、容器基本操作


  • 启动容器 docker run
  • 停止容器 docker stop
  • 查看容器 docker ps
  • 进入容器 docker exec | docker attach
  • 删除容器 docker rm
  1. 启动容器



docker run IMAGE [COMMOND] [ARG...]
   run 启动一个容器并在容器中执行命令
   IMAGE 启动容器所使用的操作系统镜像
  当运行docker run这个命令的时候,docker会检测本地是否有相应名字的镜像,如果没有,会去公共的仓库下载。然后利用该镜像启动一个容器,包括分配文件系统,ip地址等等。



[iyunv@node1 ~]# docker run centos echo "Hello world"
Hello world
  但是在启动容器并完成命令后,实际上这个容器已经停止了。这只是执行单次命令的容器。这是docker中最基本的容器运行方式。
  启动交互式容器



docker run -i -t IMAGE /bin/bash
      -i --interface=true|false 默认是false      #告诉docker的守护进程为容器始终打开标准输入
      -t --tty=true|false 默认是false  #告诉docker要为创建的容器分配一个伪tty终端
  这样新创建的容器就可以提供一个交互式的shell。



[iyunv@node1 ~]# docker run -i -t centos /bin/bash
[iyunv@fb316d4c0719 /]# exit;
exit
  一退出,容器就停止了。
  重新启动已经停止的容器:



docker start [-i] 容器名
-i 以交互的方式来重新启动停止的容器


[iyunv@node1 ~]# docker start -i fb316d4c0719
  2. 查看容器



docker ps [-a]
     -a 列出所有的容器
     不给参数,ps命令返回的是正在运行中的docker容器


[iyunv@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[iyunv@node1 ~]# docker ps  -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
fb316d4c0719        centos              "/bin/bash"            17 minutes ago      Exited (0) 17 minutes ago                       silly_bell
762db863e04a        centos              "echo 'Hello world'"   20 minutes ago      Exited (0) 20 minutes ago                       romantic_murdock
  CONTAINER ID:docker的守护进程在启动容器时为容器分配的唯一ID。
NAMES:docker守护进程为容器自动分配的名字。也可以在启动容器时手动指定,比如:



[iyunv@node1 ~]# docker run -i -t --name test centos /bin/bash   
[iyunv@d985fe8622f7 /]# exit
exit
[iyunv@node1 ~]# docker ps  -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
d985fe8622f7        centos              "/bin/bash"            7 seconds ago       Exited (0) 4 seconds ago                        test
  查看某个容器的详细信息,包括名称、网络配置等信息:



[iyunv@node1 ~]# docker inspect fb316d4c0719
DSC0001.png

  3. 停止容器



docker stop 容器名
docker kill 容器名

  • stop命令是发送一个信号给容器,等待容器的停止。
  • kill命令会直接停止容器。
  容器名可以是container id,也可以是names
  4. 删除停止的容器
  注意不能删除运行中的容器



docker rm 容器名


[iyunv@node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                         PORTS               NAMES
d985fe8622f7        centos              "/bin/bash"            About an hour ago   Exited (0) About an hour ago                       test
fb316d4c0719        centos              "/bin/bash"            2 hours ago         Exited (0) 2 hours ago                             silly_bell
762db863e04a        centos              "echo 'Hello world'"   2 hours ago         Exited (0) 2 hours ago                             romantic_murdock
[iyunv@node1 ~]# docker rm 762db863e04a
762db863e04a
  5. Docker守护式容器
  守护式容器:


  • 能够长期运行
  • 没有交互式会话
  • 适合运行应用程序和服务
  (1)方式一



# docker run -i -t IMAGE /bin/bash
  Ctrl+P Ctrl+Q退出交互式容器的bash,这样容器就会在后台运行
  (2)方式二



docker run -d 镜像名 [COMMAND] [ARG...]
     -d 启动容器时用后台的方式


[iyunv@node1 ~]# docker run -d -i -t --name=test2 centos /bin/bash -c "while true; do echo hello world; sleep 5; done"
6678e5462d023e2ecc90f5bac887326b0b10ed034e51884176028ddcee24d249
[iyunv@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6678e5462d02        centos              "/bin/bash -c 'while "   5 seconds ago       Up 4 seconds                            test2
  (3)进入容器



docker attach 容器名


[iyunv@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6678e5462d02        centos              "/bin/bash -c 'while "   5 seconds ago       Up 4 seconds                            test2
[iyunv@node1 ~]# docker attach 6678e5462d02
hello world
hello world
  使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法执行操作了。nsenter (namespace enter),nsenter 可以访问进程的另外一个名字空间。建议使用nsenter。
  【注意】:nsenter 要正常工作需要有 root 权限。而且nsenter 工具在 util-linux 包2.23版本后才包含。安装方式:yum install util-linux



[iyunv@node1 ~]# docker start d985fe8622f7
d985fe8622f7
[iyunv@node1 ~]# docker inspect --format "{{.State.Pid}}" d985fe8622f7
14526
[iyunv@node1 ~]# nsenter -t 14526 -u -i -n -p
[iyunv@d985fe8622f7 ~]# exit
logout
[iyunv@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d985fe8622f7        centos              "/bin/bash"         3 hours ago         Up 4 minutes                            test
DSC0002.png

  可以把这个命令写成脚本,以后用起来也方便:



# vim access_docker.sh
#!/bin/bash
Cname=$1
Cpid=$(docker inspect --format "{{.State.Pid}}" $Cname)
if ! ps ax | awk '{print $1}' | grep -e "^${Cpid}$" &> /dev/null; then
echo "$Cname is not exist,you cant's enter it.!!!!!!!!!!!!!!!!!!!!!"
else
echo "You will enter the docker containter:$Cname."
nsenter --target $Cpid --mount --uts --ipc --net --pid
fi
  授予脚本执行权限:



# chmod +x access_docker.sh
  如果需要进去docker的某个容器,直接/path/to/access_docker.sh 容器名称或是容器id:



# ./access_docker.sh d985fe8622f7
You will enter the docker containter: d985fe8622f7.
[iyunv@d985fe8622f7 /]#
  6. 查看容器日志



docker logs [-f] [-t] [--tail] 容器名
-f --follows=true|false  默认是false    一直跟踪日志的变化,并返回结果
-t --timestamps=true|false  默认是false  在返回的结果上加上时间戳
--tail="all"  返回结尾处多少数量的日志
  如果不指定,logs将会返回所有的日志



[iyunv@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d985fe8622f7        centos              "/bin/bash"         3 hours ago         Up 4 minutes                            test
[iyunv@node1 ~]# docker logs -tf d985fe8622f7
2017-08-17T03:50:39.127155000Z [iyunv@d985fe8622f7 /]# exit
2017-08-17T03:50:39.127493000Z exit
  7. 查看容器内的进程



docker top 容器名


[iyunv@node1 ~]# docker top d985fe8622f7
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                14526               14506               0                   03:12               pts/1               00:00:00            /bin/bash
  8. 在运行中的容器内启动新进程
  虽然docker的理念是一个容器运行一个服务,我们仍就需要在docker中运行多个进程。比如需要对运行中的容器进行维护、监控,或者执行一些管理任务。



# docker exec [-d] [-i] [-t] 容器名 [COMMAND] [ARG...]
  如果我们在学习时做实验,可能会启动很多容器,长期下来,残留的容器就会有很多,有个技巧,可以在启动的时候加一个参数,让在退出容器后,自动删除容器。



[iyunv@node1 ~]# docker run --rm centos echo "Hello world"
Hello world

运维网声明 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-407686-1-1.html 上篇帖子: cat命令: 下篇帖子: docker-ce-17.09 数据卷和数据卷容器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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