Docker介绍

通过比较复杂的代码开发的过程,调用以上三项技术,实现容器的创建,管理,销毁

什么是容器

QQ截图20200512094453.jpg

容器的前世

容器技术最早出现在FreeBSD上叫做jail,将一个进程放入jail中运行,不管这个进程在其中发生怎样的错误都不会影响到系统上其他进程的运行.后来,jail技术在Linux中的实现叫做vserver,vserver所实现的功能体现为chroot以及namespaces实现资源的隔离.容器技术出现的主要目的是为了资源隔离

  • FreeBASE jail : Linux vserver
  • chroot : 完整的根文件系统(FHS)标准的
  • namespaces : UTS Mount IPC PID user network
  • cgroup : 资源的分配和监控

传统虚拟化技术和容器对比

QQ截图20200512095839.jpg

LXC到Docker的历史

LXC,将原来需要手工编码实现的容器技术,进行了封装.实现了,更加方便、快速的容器创建及管理的技术.通过固有"模板",安装并启动容器.将远程的程序包下载到本地,安装并创建好我们需要的容器.确实,LXC已经很大程度上降低了容器管理的难度,但是依然使用一些弊端.有些时候可能需要自定制模板,以及使用LXC中自带的模板,以及大规模创建及复制依然比较麻烦.所以,很难大规模的应用.所以,出现了Docker技术.Docker是在LXC基础上,使用GoLang二次开发的封装版.

Docker的安装

yum源准备

curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 --showduplicates | sort -r
#yum install -y docker-ce

安装docker-ce

yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos.x86_64 docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch

启动Docker服务

systemctl daemon-reload
systemctl restart docker
docker version
docker info

配置镜像加速

阿里云Docker-hub

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://********.mirror.aliyuncs.com"]
}
EOF

腾讯云Docker-hub

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["http://ccr.ccs.tencentyun.com/1997styhome/home"]
}
EOF

重启

systemctl daemon-reload
systemctl restart docker

Doocker体系结构

16956686-c14bcc1289b84523.png

Docker的镜像基础管理

获取镜像

#基本镜像拉取
docker search centos
docker pull centos:6.9
docker pull centos:7.5.1804
docker pull nginx

镜像基本查看

[root@home docker]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              602e111c06b6        2 weeks ago         127 MB
centos              6.9                 2199b8eb8390        14 months ago       195 MB
centos              7.5.1804            cf49811e3cdb        14 months ago       200 MB
[root@home docker]# docker image ls --no-trunc
REPOSITORY          TAG                 IMAGE ID                                                                  CREATED             SIZE
nginx               latest              sha256:602e111c06b6934013578ad80554a074049c59441d9bcd963cb4a7feccede7a5   2 weeks ago         127 MB
centos              6.9                 sha256:2199b8eb8390197d175b1dd57ed79f53ed92ffa58e23826ada54113262237e56   14 months ago       195 MB
centos              7.5.1804            sha256:cf49811e3cdb94cbdfd645f3888d7add06a315449cf2c7ca7b81c312f1e46c63   14 months ago       200 MB
  • REPOSITORY:TAG : 标识镜像唯一性的方法
  • IMAGE ID : sha256:64位的号码,默认只截取12位,查询时加上--no-trunc参数会详细显示全部信息

镜像信息查看

#镜像详细信息查看 根据REPOSITORY:TAG
docker image inspect nginx:latest

#镜像详细信息查看 根据IMAGE ID
docker image inspect 2199b8eb8390

#只查看镜像ID
docker image ls -q

镜像的导入和导出

#导出到/tmp/nginx.tar
docker image save 602e111c06b6 > /tmp/nginx.tar

#删除镜像
docker image rm 602e111c06b6

#强制删除镜像
docker image rm -f 602e111c06b6

#导入镜像
docker image load -i /tmp/nginx.tar

#修改镜像标签
docker image tag 602e111c06b6 nginx:latest
docker image tag 602e111c06b6 1997sty/nginx:latest

容器的管理

交互式容器

#以交互式方式启动容器
docker container run -it 470671670cac

#以交互式方式手工指定容器名启动 i 交互式 t tty,具体查看docker container run --help命令
docker container run -it --name="1997sty_cent81" 470671670cac

#查看启动容器
docker container ls

#查看全部启动容器
docker container ls -a

#查看详细信息
docker container inspect 1997sty_cent81
  • CONTAINER ID : 容器的唯一号码(自动生成的)
  • NAMES : 容器的名字(可以自动,也可以手工指定)
  • STATUS : 容器的运行状态(Exited,Up)

守护式容器

#以交互式方式启动容器
docker container run 602e111c06b6

#以交互式方式手工指定容器名启动
docker container run -d --name="1997sty_nginx1" 602e111c06b6
docker container run -d --name="1997sty_nginx2" nginx:latest

#查看启动容器
docker container ls

#查看全部启动容器
docker container ls -a

#查看详细信息 可以看到该容器的ip地址 可以通过curl访问
docker container inspect 1997sty_nginx2

容器的应用场景

  • 交互式容器: 工具类,开发,测试,临时性的任务
  • 守护式容器: 网络服务
#创建一个交互式容器,退出时删除
docker container run -it --name="1997sty_cent81" --rm 470671670cac

#创建一个守护式容器,将容器的80端口映射到主机的8080端口
docker run -d -p 8080:80 --name="1997sty_nginx80" nginx:1.14

容器的启动\关闭\连接

#守护式容器停止
docker container stop 1997sty_nginx80
docker container stop 75adf4430476

#守护式容器启动
docker container start 1997sty_nginx80
docker container start 75adf4430476

#交互式容器停止
docker container stop 1997sty_cent81
docker container stop 6841cf7686c4

#交互式容器启动,交互式容器不添加-i参数 启动后会在后台运行
docker container start 1997sty_cent81
docker container start 6841cf7686c4

#交互式容器启动, 添加-i后 启动后会直接进入容器
docker container start -i 1997sty_cent81
docker container start -i 6841cf7686c4

#交互式容器连接方法
docker container attach 1997sty_cent81
#守护式容器连接方法
docker container exec -it 1997sty_nginx80 /bin/bash

#子进程的方式登录(在已有工作容器中生成子进程,做登录.可以用于进行容器的调试,退出时也不会影响到当前容器)
docker container exec -it 1997sty_cent81 /bin/bash

#强制删除所有容器
docker container rm -f `docker container ls -a -q`

容器的后台及前台运行

  • ctrl + P + Q
  • attach 调用到前台
  • 死循环
  • 让程序前台一直允许(夯在前台,制作守护式容器时,常用的方法)

docker容器的网络访问

指定映射docker会自动添加一条iptables规则来实现端口映射

  • hostPort : 主机端口
  • containerPort : 容器端口
  • -p hostPort:containerPort : 指定容器端口映射到指定主机端口
  • -p ip:hostPort:containerPort : 指定容器端口映射到指定主机IP端口
  • -p containerPort : 指定容器端口映射到指定主机随机端口(随机端口:32768-60999)
  • -p ip::containerPort : 指定容器端口映射到指定主机IP随机端口(随机端口:32768-60999)
  • -p hostPort:containerPort/udp : 指定容器端口映射到指定主机端口,协议为udp
  • -p 81:80 –p 443:443 : 指定多个容器端口映射到多个指定主机端口
#指定容器端口映射到指定主机端口
docker container run -d -p 8080:80 --name='n2' nginx:1.14

#指定容器端口映射到指定主机IP端口
docker container run -d -p 10.0.0.100:8081:80 --name='n3' nginx:1.14

#指定容器端口映射到指定主机随机端口(随机端口:32768-60999)
docker container run -d -p 80 --name='n4' nginx:1.14

#指定容器端口映射到指定主机IP随机端口(随机端口:32768-60999)
docker container run -d -p 172.16.1.200::80 --name='n5' nginx:1.14

容器的其他管理

  • docker container ls -a -q : 查看所有容器CONTAINER ID
  • docker ps -a -q : 查看所有容器CONTAINER ID
  • docker top ba9143bcaf74 : 查看指定容器内进程信息
  • docker container top ba9143bcaf74 : 查看指定容器内进程信息
  • docker logs 75adf4430476 : 查看日志
  • docker logs -tf 75adf4430476 : 查看日志 -t 显示详细时间 -f 持续追踪
  • docker logs --tail 10 75adf4430476 : 查看日志 显示最后10行

docker的数据卷实现持久化存储

手工交互数据

#将文件复制到nginx的目录下
docker container cp index.html 1997sty_nginx80:/usr/share/nginx/html/

Volume实现宿主机和容器的数据共享,可以让数据持久化存储

docker container run -d --name="1997sty_nginx81" -p 8089:80 -v /mnt:/usr/share/nginx/html 602e111c06b6

开启两个nginx容器(90,91),共同挂载一个数据卷,实现静态资源共享

docker container run -d --name="1997sty_nginx90" -p 90:80 -v /mnt:/usr/share/nginx/html 602e111c06b6
docker container run -d --name="1997sty_nginx91" -p 91:80 -v /mnt:/usr/share/nginx/html 602e111c06b6

数据卷容器,如果1个应用需要挂在多个数据卷,可以创建一个容器挂在多个数据卷,再在应用容器中挂在该容器.在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数卷容器进行统一管理

  • 宿主机模拟数据目录
mkdir -p /opt/Volume/a
mkdir -p /opt/Volume/b
touch /opt/Volume/a/a.txt
touch /opt/Volume/b/b.txt
  • 启动数据卷容器
docker run -it --name "nginx_volumes" -v /opt/Volume/a:/opt/a -v /opt/Volume/b:/opt/b 470671670cac

#ctrl+p+q 返回宿主机
  • 使用数据卷容器
docker run -d -p 8095:80 --volumes-from nginx_volumes --name "n8085" nginx
docker run -d -p 8086:80 --volumes-from nginx_volumes --name "n8086" nginx

命令小结

镜像类

  • docker image search : 查询镜像
  • docker image pull : 拉取镜像
  • docker image ls : 查看本地镜像
  • docker image inspect : 查看镜像详细信息
  • docker image rm : 删除镜像
  • docker image save : 导出镜像
  • docker image load : 导入镜像

容器类

  • docker container run : 创建容器并运行一个命令
  • docker container start : 启动容器
  • docker container stop : 停止容器
  • docker container restart : 重启容器
  • docker container kill : 杀死运行的容器
  • docker container attach : 连接容器
  • docker container exec : 在运行的容器中执行命令
  • docker container ls : 查看容器
  • docker container top : 查看容器内进程信息
  • docker container logs : 查看容器日志
  • docker container inspect : 查看容器详细信息