Docker镜像和容器
本节内容:
- 安装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
- 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. 导出镜像
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.docker-cn.com/library/centos latest 328edcd84f1b days ago 192.5 MB
[root@node1 ~]# docker save 328edcd84f1b > /opt/centos.tar.gz
7. 导入镜像
比如有些镜像很难下载,别人下载好了,或者之前下载过了,可以导入。
[root@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地址等等。
[root@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。
[root@node1 ~]# docker run -i -t centos /bin/bash
[root@fb316d4c0719 /]# exit;
exit
一退出,容器就停止了。
重新启动已经停止的容器:
docker start [-i] 容器名
-i 以交互的方式来重新启动停止的容器
[root@node1 ~]# docker start -i fb316d4c0719
2. 查看容器
docker ps [-a]
-a 列出所有的容器
不给参数,ps命令返回的是正在运行中的docker容器
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fb316d4c0719 centos "/bin/bash" minutes ago Exited () minutes ago silly_bell
762db863e04a centos "echo 'Hello world'" minutes ago Exited () minutes ago romantic_murdock
CONTAINER ID:docker的守护进程在启动容器时为容器分配的唯一ID。
NAMES:docker守护进程为容器自动分配的名字。也可以在启动容器时手动指定,比如:
[root@node1 ~]# docker run -i -t --name test centos /bin/bash
[root@d985fe8622f7 /]# exit
exit
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d985fe8622f7 centos "/bin/bash" seconds ago Exited () seconds ago test
查看某个容器的详细信息,包括名称、网络配置等信息:
[root@node1 ~]# docker inspect fb316d4c0719
3. 停止容器
docker stop 容器名
docker kill 容器名
- stop命令是发送一个信号给容器,等待容器的停止。
- kill命令会直接停止容器。
容器名可以是container id,也可以是names
4. 删除停止的容器
注意不能删除运行中的容器
docker rm 容器名
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d985fe8622f7 centos "/bin/bash" About an hour ago Exited () About an hour ago test
fb316d4c0719 centos "/bin/bash" hours ago Exited () hours ago silly_bell
762db863e04a centos "echo 'Hello world'" hours ago Exited () hours ago romantic_murdock
[root@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 启动容器时用后台的方式
[root@node1 ~]# docker run -d -i -t --name=test2 centos /bin/bash -c "while true; do echo hello world; sleep 5; done"
6678e5462d023e2ecc90f5bac887326b0b10ed034e51884176028ddcee24d249
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6678e5462d02 centos "/bin/bash -c 'while " seconds ago Up seconds test2
(3)进入容器
docker attach 容器名
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6678e5462d02 centos "/bin/bash -c 'while " seconds ago Up seconds test2
[root@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
[root@node1 ~]# docker start d985fe8622f7
d985fe8622f7
[root@node1 ~]# docker inspect --format "{{.State.Pid}}" d985fe8622f7 [root@node1 ~]# nsenter -t -u -i -n -p
[root@d985fe8622f7 ~]# exit
logout
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d985fe8622f7 centos "/bin/bash" hours ago Up minutes test
可以把这个命令写成脚本,以后用起来也方便:
# vim access_docker.sh
#!/bin/bash
Cname=$
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.
[root@d985fe8622f7 /]#
6. 查看容器日志
docker logs [-f] [-t] [--tail] 容器名
-f --follows=true|false 默认是false 一直跟踪日志的变化,并返回结果
-t --timestamps=true|false 默认是false 在返回的结果上加上时间戳
--tail="all" 返回结尾处多少数量的日志
如果不指定,logs将会返回所有的日志
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d985fe8622f7 centos "/bin/bash" hours ago Up minutes test
[root@node1 ~]# docker logs -tf d985fe8622f7
--17T03::.127155000Z [root@d985fe8622f7 /]# exit
--17T03::.127493000Z exit
7. 查看容器内的进程
docker top 容器名
[root@node1 ~]# docker top d985fe8622f7
UID PID PPID C STIME TTY TIME CMD
root : pts/ :: /bin/bash
8. 在运行中的容器内启动新进程
虽然docker的理念是一个容器运行一个服务,我们仍就需要在docker中运行多个进程。比如需要对运行中的容器进行维护、监控,或者执行一些管理任务。
# docker exec [-d] [-i] [-t] 容器名 [COMMAND] [ARG...]
如果我们在学习时做实验,可能会启动很多容器,长期下来,残留的容器就会有很多,有个技巧,可以在启动的时候加一个参数,让在退出容器后,自动删除容器。
[root@node1 ~]# docker run --rm centos echo "Hello world"
Hello world
Docker镜像和容器的更多相关文章
- docker镜像和容器的导出导入
本文介绍docker镜像和容器的导入导出,用于迁移.备份.升级等场景.主要用到export.import.save.load四个方法. 原文地址:代码汇个人博客 http://www.codehui. ...
- docker镜像与容器
目录 docker镜像与容器 概述 分层存储 镜像与容器 删除镜像与容器 将容器中的改动提交到镜像 慎用 docker commit--构建镜像推荐使用dockerfile docker镜像与容器 概 ...
- 快速批量删除 docker 镜像或容器
原文:快速批量删除 docker 镜像或容器 点击在我的博客 xuxusheng.com 中查看,有更好的排版哦~ docker 本身并没有提供批量删除的功能,当有大量的镜像或者容器需要删除的时候,手 ...
- docker系列四之docker镜像与容器的常用命令
docker镜像与容器的常用命令 一.概述 docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...
- Docker容器化【Docker镜像与容器相关命令】
# Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用 ...
- docker 入门(docker 镜像 、容器、仓库)
一.关于docker 镜像 .容器.仓库之间的关系 镜像(Image): 类似于虚拟机 的镜像 容器(Container): 类似于操作系统(或者说是独立的软件), 由镜像可以创建大量的容器. 仓库( ...
- 【docker专栏8】使用IDEA远程管理docker镜像及容器服务
使用命令行的方式管理服务器镜像及容器是运维人员最常用的方式,但是有的时候我们不得不远程操作docker或者是面向对docker并不熟悉的技术人员提供能力(配置管理员.测试人员),这种情况下图形界面就有 ...
- 简述Docker镜像、容器、仓库概念
Docker镜像 Docker镜像(Image)类似于虚拟机的镜像,可以将他理解为一个面向Docker引擎的只读模板,包含了文件系统. 例如:一个镜像可以完全包含了Ubuntu操作系统环境,可以把它称 ...
- docker镜像、容器
第一部分:Docker镜像的基本知识 1.1 什么是Docker镜像 从整体的角度来讲,一个完整的Docker镜像可以支撑一个Docker容器的运行,在 Docker容器运行过程中主要提供文件系统视角 ...
随机推荐
- ZABBIX 3.0 监控MongoDB性能【OK】
系统环境: centos7.2 zabbix-3.4 一.原理 通过以下命令查看mongodb的状态: echo "db.serverStatus()" | mongo ad ...
- Linux运维四:文件属性及文件权限
一:文件属性 我们使用ls -lhi命令来查看文件时,会列出一堆的文件属性,如: [root@Gin day7]# ll -hi total 7.8M 260674 -rw-r--r-- 1 root ...
- GO_02:GO语言开篇
Go的发展史 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后 ...
- 1082 线段树练习 3 && 树状数组区间修改区间查询
1082 线段树练习 3 题意: 给定序列初值, 要求支持区间修改, 区间查询 Solution 用树状数组, 代码量小, 空间占用小 巧用增量数组, 修改时在 \(l\) 处 $ + val$ , ...
- windows查找端口占用/ 终结端口占用 ------------windows小技巧
前沿 我是一名小程序员,经常通过一些类似tomcat,jettry 等服务器工具 调试项目.有时候莫名其妙的就会出现 程序关闭不正常的情况!去查端口又死活找不到!最后只能重启电脑 后面,在网上查了一些 ...
- 机器学习算法整理(二)梯度下降求解逻辑回归 python实现
逻辑回归(Logistic regression) 以下均为自己看视频做的笔记,自用,侵删! 还参考了:http://www.ai-start.com/ml2014/ 用梯度下降求解逻辑回归 Logi ...
- CSS3实战之多列
CSS2中如果要设计多列布局,常用的方法有浮动和定位,但是浮动容易错位,定位无法满足模块的自适应能力,以及模块之间的文档流联动的需要.为了解决多列布局的难题,CSS3新增了多列自动布局功能. 利用多列 ...
- Javascript Ajax异步读取RSS文档
RSS 是一种基于 XML的文件标准,通过符合 RSS 规范的 XML文件可以简单实现网站之间的内容共享.Ajax 是Asynchronous JavaScript and XML的缩写.通过 Aja ...
- [php]mysqli操作流程
<?php class SqlTools{ private $con; private $trans; public function __construct($host, $user, $ps ...
- 并发编程(三) IO模型
五 IO模型 常用的IO模型有4种: 阻塞IO 非阻塞IO IO多路复用 异步IO 不常用的有: 驱动信号 5.1 阻塞IO.非阻塞IO 阻塞IO:进程不能做其他的事情 非阻塞IO:等待数据无阻塞 阻 ...