Docker概述
Docker是什么?
是一种轻量级的“虚拟机”
在Linux容器里运行应用的开源工具
Docker与虚拟机的区别
虚拟机
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 ,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。虚拟系统和传统的虚拟机(Parallels Desktop ,Vmware,VirtualBox,Virtual pc)不同在于:虚拟系统不会降低电脑的性能,启动虚拟系统不需要像启动windows系统那样耗费时间,运行程序更加方便快捷;虚拟系统只能模拟和现有操作系统相同的环境,而虚拟机则可以模拟出其他种类的操作系统;而且虚拟机需要模拟底层的硬件指令,所以在应用程序运行速度上比虚拟系统慢得多。
Docker的使用场景
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
如果你有选择恐惧症,还是资深患者。Docker 帮你 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
总结
Docker 相比于传统虚拟化方式具有更多的优势:
Docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动。
Docker 需要的资源更少。Docker 在操作系统级别进行虚拟化,Docker 容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor 层与内核层的虚拟化。
Docker 更轻量。Docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署。
高可用和可恢复性。Docker 对业务的高可用支持是通过快速重新部署实现的。
特点:
服务彼此之间相互独立 服务间的解耦 解耦:便于管理,防止数据过多积累在一个文件中
服务可以灵活迁移(跨平台)docker引擎 即docker-ce环境
Docker的使用场景
打包应用程序简化部署 (镜像)
可脱离底层硬件任意迁移
例:服务器从腾讯云迁移到阿里·
Docker核心概念
镜像
—个面向Docker容器引擎的只读模板
容器
从镜像创建的运行实例
仓库
集中保存镜像的地方
CentOS安装Docker的两种方式
使用YUM仓库来安装Docker
使用CURL获得Docker的安装脚本进行安装
安装19版Docker-CE
安装之前的操作
关闭防火墙,核心防护
iptables -F
seteforce 0
将backup文件与local.repo做调换
[root@server1 ~]# ls /etc/yum.repos.d/
backup local.repo
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# mv local.repo backup/
[root@server1 yum.repos.d]# cd backup/
[root@server1 backup]# mv C* ..
[root@server1 backup]# cd ..
[root@server1 yum.repos.d]# ll
总用量 28
drwxr-xr-x. 2 root root 24 11月 27 18:37 backup
-rw-r--r--. 1 root root 1664 8月 30 2017 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 8月 30 2017 CentOS-CR.repo
-rw-r--r--. 1 root root 649 8月 30 2017 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 8月 30 2017 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 8月 30 2017 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 8月 30 2017 CentOS-Sources.repo
-rw-r--r--. 1 root root 3830 8月 30 2017 CentOS-Vault.repo
情况yum源,手动建立缓存
[root@server1 yum.repos.d]# yum clean all
[root@server1 yum.repos.d]# yum makecache
//需要查看是否安装阿里云的配置文件的容器(centos基本的镜像源即CentOS-Base.repo,需要存放在/etc/yum.repos.d/下,即使放在内部目录里面也会照成下载失败的原因)
安装依赖包
[root@server1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
附加
#yum-utils提供了yum-config-manager
#device mapper存储驱动程序需要device-mapper-persistent-data和lvm2
#Device Mapper是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,
它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //https:后是阿里云镜像的地址
安装完成之后查看是否存在(即docker-ce.repo)
[root@server1 ~]# ls /etc/yum.repos.d/
backup CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo docker-ce.repo
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
安装docker-ce并设置环境
[root@server1 ~]# yum install docker-ce -y
[root@server1 ~]# systemctl start docker 开启服务
[root@server1 ~]# systemctl status docker 查看服务状态是否为running
[root@server1 ~]# ifconfig 查看到生成一个容器地址(桥接网口)充当使用容器的网关
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
附加(lo:回环口(测试TCP/IP是否生效))(virbr0:桥接网口)
镜像加速
[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
key.json
[root@server1 docker]# tee /etc/docker/daemon.json <<-'EOF'
> {
> "registry-mirrors": ["https://e5rtts40.mirror.aliyuncs.com"]
> }
> EOF
寻找镜像加速码
百度搜索阿里云 进入阿里云搜索镜像加速 官方镜像加速 - 容器镜像服务 ACR 最下方出现容器镜像服务ACR(点击)
出现下图
点击管理控制台
系统参数的重载
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl restart docker
网络优化
[root@server1 docker]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@server1 docker]# sysctl -p //使其生效
net.ipv4.ip_forward = 1
重启网络服务和容器
[root@server1 docker]# service network restart
Restarting network (via systemctl): [ 确定 ]
[root@server1 docker]# systemctl restart docker
查看docker版本(go语言开发的)
[root@server1 docker]# docker version
Docker基础命令
镜像操作
搜索镜像
[root@server1 ~]# docker search nginx //搜索所有的nginx镜像
[root@server1 ~]# docker images //搜索本地的所有镜像(因为没有创建,故没有)
REPOSITORY(镜像仓库) TAG (标签) IMAGE ID (镜像ID) CREATED (创建时间) SIZE(大小)
下载镜像(存放地址为/var/lib/docker)
[root@server1docker]# docker pull nginx //下载nginx镜像
[root@server1 docker]# docker pull tomcat //下载tomcat镜像
附加:AUFS(联合文件系统)若干层下载
下载后存放在/var/lib/docker
下载文件信息/var/lib/docker/image/overlay/repositories.json
删除镜像(两种方法)
删除镜像ID
删除镜像名称(建议删除镜像名称)
[root@server1 docker]# docker images //查看所有镜像信息
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 3 days ago 133MB
tomcat latest e0bd8b34b4ea 8 days ago 649MB
[root@server1 docker]# docker rmi e0bd8b34b4ea //删除镜像(以删除镜像ID的方式)
给镜像设置有效的标签
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 3 days ago 133MB
[root@server1 docker]# docker inspect bc9a0695f571 //查看镜像详细信息
[root@server1 docker]# docker tag nginx:latest nginx:web//设置标签
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 3 days ago 133MB
nginx web bc9a0695f571 3 days ago 133MB
[root@server1 docker]# docker rmi bc9a0695f571 //此时发现通过删除ID无法删除镜像,此时只能删除名称,再通过删除ID或名称来删除镜像(如果镜像有许多标签,只能先删除标签,在删除镜像)
Error response from daemon: conflict: unable to delete bc9a0695f571 (must be forced) - image is referenced in multiple repositories
[root@server1 docker]# docker rmi nginx:latest //删除名称,但镜像仍然存在
Untagged: nginx:latest
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx web bc9a0695f571 3 days ago 133 MB
删除镜像id(注意:只有当镜像id对应标签仅剩一个时,才能使用镜像id的方式进行删除;否则出现如下报错
或者也可以在最后加上-f选项,一次性删除)
附加:删除某一个镜像时,若容器在使用某一个镜像,必须先删除容器,才能删除镜像
删除所有镜像
docker rmi `docker images -q`
载出镜像命名为nginx存在当前目录下
[root@server1 docker]# ls /opt/
containerd rh
[root@server1 docker]# docker save -o /opt/nginx nginx:web
[root@server1 docker]# ls /opt/
containerd nginx rh
载入镜像
将导出的nginx文件重新载入
[root@server1 docker]# docker rmi bc9a0695f571 //删除nginx镜像
[root@server1 docker]# docker load < /opt/nginx //将opt目录中的nginx文件载入回来(本地导入不需要经过仓库)
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx web bc9a0695f571 3 days ago 133MB
上传镜像(共有仓库涉及到翻墙,这里使用私有仓库)
docker push 仓库名称[:标签]
容器操作
创建容器
[root@server1 docker]# docker create -it nginx:web /bin/bash
bf66153d34a5b2e9efef0ea9802bf966494a39582d37dd395e42036ab6f2d2b9 //容器ID号
-i 让容器的标准输入保持打开
-t 让Docket分配一个伪终端
查看容器
[root@server1 docker]# docker ps 查看运行的容器
[root@server1 docker]# docker ps -a 查看所有的容器
CONTAINER ID (容器ID) IMAGE(使用的镜像) COMMAND (指令) CREATED (创建时间) STATUS (状态) PORTS (端口) NAMES(其他的描述信息)
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf66153d34a5 nginx:web "/docker-entrypoint.…" 48 seconds ago Created hopeful
附加:Created创建状态 UP:运行状态
启动容器
[root@server1 docker]# docker start bf66153d34a5
bf66153d34a5(容器ID)
通过run命令启动:
下载没有的镜像,再启动
[root@server1 docker]# docker pull centos:7 //下载centos7系统镜像
[root@server1 docker]# docker run -itd centos:7 /bin/bash //创建容器
此时不需要启动 (创建,启动一体化) d:表示支持它一直开启
进入容器
[root@server1 docker]# docker exec -it 7ff5b22b24cc /bin/bash
[root@7ff5b22b24cc /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@7ff5b22b24cc /]# ifconfig //发现无法查询ip地址,此时需要安装该软件
bash: ifconfig: command not found
[root@7ff5b22b24cc /]# yum install net-tools -y
[root@7ff5b22b24cc /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
查看容器所有的根目录
[root@server1 docker]# docker run nginx:web /bin/bash -c ls /
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@server1 docker]# docker ps -a //此时该容器的状态为退出的(执行完操作后自动释放)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12a0ba536dc9 nginx:web "/docker-entrypoint.…" 36 seconds ago Exited (0) 36 seconds ago gracious_sanderson
7ff5b22b24cc centos:7 "/bin/bash" 22 minutes ago Up 22 minutes distracted_gagarin
bf66153d34a5 nginx:web "/docker-entrypoint.…" 32 minutes ago Up 29 minutes 80/tcp
注意:返回的状态码为0(正常) 异常的状态码为非0值:如下
执行完成会关闭,状态是Exited(容器可以做一次性的处理,处理完就释放资源,做到了最小成本控制
删除centos 7的容器(运行中的容器不能直接关闭,要先停止该容器,在进行删除)
[root@server1 docker]# docker rm 7ff5b22b24cc
Error response from daemon: You cannot remove a running container 7ff5b22b24cc4c989e1c15cb0b3c6eb0d55f5238410936ee0dc0ba8d2d7a2738. Stop the container before attempting removal or force remove
[root@server1 docker]# docker stop 7ff5b22b24cc
7ff5b22b24cc
此时强制退出属于异常退出
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12a0ba536dc9 nginx:web "/docker-entrypoint.…" 6 minutes ago Exited (0) 6 minutes ago gracious_sanderson
7ff5b22b24cc centos:7 "/bin/bash" 28 minutes ago Exited (137) 20 seconds ago distracted_gagarin
bf66153d34a5 nginx:web "/docker-entrypoint.…" 38 minutes ago Up 36 minutes 80/tcp
删除容器(先停止容器,再进行删除)
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12a0ba536dc9 nginx:web "/docker-entrypoint.…" 17 minutes ago Exited (0) 17 minutes ago gracious_sand
bf66153d34a5 nginx:web "/docker-entrypoint.…" 49 minutes ago Up 47 minutes 80/tcp hopeful_thomp
[root@server1 docker]# docker stop bf66153d34a5
bf66153d34a5
[root@server1 docker]# docker rm 12a0ba536dc9
12a0ba536dc9
[root@server1 docker]# docker rm bf66153d34a5
bf66153d34a5
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器持续在后台执行(通过执行死循环)
[root@server1 yum.repos.d]# docker run -d centos:7 /bin/bash -c "while true;do echo hello;done" 65f63938c9eae1eebe14ca1eb517f4d504ae8592f4f21113074e95673b3cea3f
[root@server1 yum.repos.d]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65f63938c9ea centos:7 "/bin/bash -c 'while…" 5 seconds ago Up 3 seconds clever_ptolemy
使用 docker logs 容器id 命令,可以查看容器内的标准输出
退出容器
exit
容器导出
[root@server1 docker]# docker export bf66153d34a5 > /opt/nginx_c
[root@server1 docker]# ls /opt/
containerd nginx nginx_c rh
容器导入(会生成镜像,而不会创建容器)
[root@server1 docker]# cd /opt/
[root@server1 opt]# cat nginx_c | docker import - nginx:web
sha256:223f60a15338593e82c4f995e5352c1f82e97e3f5987af7857e878eb2467e7d9
发现只生成镜像,没有创建容器
[root@server1 opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server1 opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx web 223f60a15338 37 seconds ago 131MB
[root@server1 docker]# docker run -itd centos:7 /bin/bash (当创建没有该镜像的容器时,会先下载镜像,在创建容器)
批量删除容器(删除的是退出状态的容器,run状态的容器不会被删除)
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6119a2c84d79 tomcat:latest "/bin/bash" About a minute ago Created hopeful_cohen
0579f5f82117 nginx:web "/bin/bash" 17 minutes ago Exited (0) 30 seconds ago xenodochial_ellis
4c0c03d915f9 nginx:web "/bin/bash" 18 minutes ago Created graciou
[root@server1 docker]# docker ps -a | awk '{print "docker rm "$1}' | bash
Error: No such container: CONTAINER
6119a2c84d79
0579f5f82117
4c0c03d915f9
[root@server1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
删除容器(容器必须为停止状态)
删除所有容器
docker rm `docker ps -a -q`