一、docker简介
1.docker是什么?
Docker是一款容器软件。
Docker 是一个开源项目,诞生于2013年初,最初是 dotCloud 公司内部的一个业余项目。它基于Goole公司推出的 Go 语言实现。项目后来加入了Linux基金会,遵从了 Apache2.0协议,项目代码在GitHub上进行维护。
Docker 是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何支持docker的机器上运行。容器是完全使用沙盒机制,相互之间不会有任何接口调用。
Docker 的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整地摆放起来。并且各种各样的货物被装在集装箱里,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送熟菜的船和专门运送货物的船了。只要这些货物在集装箱里封装得好好的就行。那我就可以用一艘大船把他们都运走。
docker 就是类似的理念。云计算就好比大货轮。docker 就是集装箱。
2、docker的优点
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正是Docker所能够提供的最大优势。Docker提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无务论新旧服器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。
(1)快
运行时的性能快,管理操作(启动、停止、开始、重启等等)都是以秒或毫秒为单位的。
(2)敏捷
像虚拟机一样敏捷,而且会更便宜,在bare metal (裸机)上部署像点一个按钮一样简单。
(3)灵活
将应用和系统“容器化”,不添加额外的操作系统。
(4)轻量
在一台服务器上可以部署100-1000个Containers容器。
(5)便宜
开源的,免费的,低成本的。
docker-ce:社区版
docker-ee:商业版
3、docker的缺点
所有容器共用 linux kernel 资源,资源能否实现最大限度利用,所以在安全上也会存在漏洞。
4、Docker与虚拟机的比较
在云时代,开发者创建的应用必须要能很方便地在网络上传播,也就是说应用必须脱离底层物理硬件的限制;同时必须满足“任何时间任何地点”可获取可使用的特点。因此,开发者们需要一种新型的创建分布式应用程序的方式,快速分发部署,而这正是Docker所能够提供的最大优势。Docker提供了一种更为聪明的方式,通过容器来打包应用、解耦应用和运行平台。这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无务论新旧服器是否是同一类别的平台。这无疑帮助我们节约了大量的宝贵时间,并降低部署过程出现问题的风险。
5.docker与虚拟化
Docker以及其他容器技术,都属于操作系统虚拟化范畴,操作系统细腻化最大的特点就是不需要额外的supervisor支持。Docker虚拟化方式之所以有众多优势,跟操作系统虚拟化技术自身的设计和实现分不开。
传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器时在操
作系统层面实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。
二、安装部署docker
下载链接:https://www.docker.com/products/docker-desktop
windows :
mac
linux
docker分为两个版本:
docker-ce : 社区版
docker-ee :企业版
linux 3.10的内核 有BUG
1、升级系统内核
[root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.167-1.el7.elrepo.x86_64.rpm #下载内核 [root@localhost ~]# wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.167-1.el7.elrepo.x86_64.rpm #下载内核拓展包 # 安装 [root@localhost ~]# yum localinstall -y kernel-lt* # 启动时自动选择最新的系统版本 [root@localhost ~]# grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg # 查看最新的系统内核启动版本 [root@localhost ~]# grubby --default-kernel # 重启生效 [root@localhost ~]# reboot # 检测 [root@localhost ~]# uname -a
2、安装依赖包
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
3、添加软件源信息
[root@localhost ~]# sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、更新并安装Docker-CE
[root@localhost ~]# sudo yum makecache fast [root@localhost ~]# sudo yum -y install docker-ce-19.03.9 k8s支持的最新的版本,也是最稳定的版本是19
5、启动Docker
[root@localhost ~]# systemctl start docker
6、检测docker
[root@localhost ~]# docker info
7、加速docker(登录阿里云——产品——容器与中间件——容器镜像服务ACR--管理控制台——镜像工具——镜像加速器——选centos的镜像加速器)
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://8mh75mhz.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 检测是否成功加速:执行docker info 看下是否有aliyun的镜像
三、docker的概念和基本使用
1.docker三大核心概念

(1)镜像 :镜像是启动容器的模板
(2)容器 :是对外提供服务的实例
(3)仓库(Harbor) :存放镜像的地方
官方仓库:hub.docker.com
第三方:阿里云、华为云
docker login [URL]
docker login registry.cn-hangzhou.aliyuncs.com
2.镜像
镜像是启动容器的模板,同一个镜像启动的所有的容器完全相同
2.1下载镜像
docker pull [仓库的URL]/[命名空间]/[镜像名称]:[版本号] 例:docker pull nginx docker info查看: 默认的仓库URL:https://index.docker.io/v1/ 默认的命名空间:library 默认的版本号:latest index.docker.io/library/nginx:latest等同于下载nginx,因为有默认值
2.2、查看本机镜像列表
[root@localhost ~]# docker images [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f6987c8d6ed5 6 days ago 141MB 仓库名 版本 镜像ID 创建距离现在的时间 大小
2.3 查看镜像的详情
docker inspect [镜像名称|ID]
例:docker inspect nginx
2.4 镜像tag(别名)
docker tag [镜像ID] [新的名称]
例:docker tag f6987c8d6ed5 xiaodocker
2.5 登录仓库(镜像上传到仓库需要先登录仓库)
docker login [仓库的URL地址] 默认的仓库地址:hub.docker.com 例:[root@localhost ~]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. 输入用户名,密码(需要https://hub.docker.com/注册才可以登录哦) vim /root/.docker/config.json #里面保存了用户登录的地址和密码TOKEN值,第二次来不需要登录
2.6、上传镜像
第一步:打tag(要写全了,不写全了使用默认的) [root@localhost ~]# docker tag f6987c8d6ed5 alvinos/nginx:v2 查看docker images 多一条数据
第二步:上传 [root@localhost ~]# docker push alvinos/nginx:v2
2.7 删除镜像(rmi是rm image的缩写)
docker rmi [镜像的名称|ID] [root@localhost ~]# docker rmi alvinos/nginx:v2 注:docker镜像只能创建和删除,不能修改。 docker的ID全宇宙唯一
3.容器
对外提供服务的实例。
3.1.容器生命周期
容器内的进程至少有一个进程运行在前台。
3.2、启动一个容器(镜像是启动容器的模板,所以启动镜像的时候要加上镜像的名称或者id)
docker run [参数] [镜像名称|ID] [启动命令] 例:docker run centos(没有的话会下载) docker run nginx #启动容器最简单的命令 参数:(docker run --help) -d : 以守护进程方式运行 --rm : 当容器生命周期结束时,立即删除该镜像 --name : 指定容器名称 -e : 指定容器内部的环境变量 -h : 指定容器的主机名 -p : 端口映射(固定) #要在互联网访问,需要端口映射 -P : 端口映射(随机) -i : 打开标准输出(将容器内部的标准输出接入到命令行中,正常与-t组合使用) -t : 创建一个命令行(伪终端) -v : 添加一个目录映射 --link --network
例:[root@localhost ~]# docker run -d nginx #后台运行容器 [root@localhost ~]# docker run --rm nginx 当容器生命周期结束时,立即删除该镜像 [root@localhost ~]# docker run -d --name nginx nginx # --name 指定容器名称 [root@localhost ~]# docker run -d --name nginxv1 -e NGINX_NAME=nginx nginx #-e 指定容器内部的环境变量 [root@localhost ~]# docker run -d --name nginxv2 -e NGINX_NAME=nginx -h hostnames nginx # -h 指定容器的主机名 [root@localhost ~]# docker run -d --rm --name nginxv3 -p 30000:80 nginx #,要在互联网访问,需要-p端口映射,此时可访问192.168.15.105:30000 64064393f87b5f2018142e014bdd020890c4310605c0c0cd97ce6c29a54b2b4d [root@localhost ~]# docker run -d --rm --name nginxv4 -P nginx 3a86c4d34bdf8a2f1f3a2e8948c831c3c58c22443690fa2132fdbbdbf6599cbd [root@localhost ~]# docker run -it --rm centos #将容器内部的标准输出接入到命令行 [root@localhost ~]# ll /tmp total 0 [root@localhost ~]# docker run --rm -d --name nginxv6 -P -v /tmp/:/usr/share/nginx/html nginx [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 510f2a49b418 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:4001->80/tcp nginxv6 [root@localhost ~]# echo "Hello word" >> /tmp/index.html [root@localhost ~]# docker exec nginxv6 cat /usr/share/nginx/html/index.html Hello word [root@localhost ~]# yum install pip3 [root@localhost ~]# pip install django [root@localhost ~]# django-admin startproject linux [root@localhost ~]# cd linux/ [root@localhost linux]# django-admin startapp application [root@localhost linux]# python3 manage.py runserver 0.0.0.0:8000 此时访问http://192.168.15.105:8000/ 会出现django 界面 那么,如何在容器里面做呢,首页映射到容器里 [root@localhost linux]# cd .. [root@localhost ~]# docker run --name django -it --rm -p 8000:8000 -v /root/linux/:/opt/ python:3.6 bash root@379a06657ab0:/# cd /opt root@379a06657ab0:/opt# ls application linux manage.py root@379a06657ab0:/opt# pip install django root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000 此时访问http://192.168.15.105:8000/ 会出现django 界面 [root@localhost ~]#cd linux/ [root@localhost linux]# cd application/ [root@localhost application]# ll [root@localhost application]# vim views.py def index(request): return HttpResponse("hello world") [root@localhost application]# cd .. [root@localhost linux]#cd linux/ [root@localhost linux]#vim urls.py path("",views.index) root@379a06657ab0:/opt# python3 manage.py runserver 0.0.0.0:8000 此时访问192.168.15.105:8000,出现hello world
docker start : 启动一个容器
docker stop :停止一个容器
docker create :创建一个容器
docker run 和 docker create 之间有两个区别
1、docker run创建容器并立即启动,而docker create 只是创建
2、docker run创建的容器时up状态,而docker create创建的容器是create
3.3、查看本机运行的容器列表
docker ps -a : 显示本机上的所有的容器 -q : 只显示ID 例: docker ps #查看本机上运行的容器 docker ps -a #显示机器上的所有容器 docker ps -a -q #显示机器上所有容器的id
3.4在容器内部执行命令
docker exec [容器名称] [命令] [root@localhost ~]# docker exec nginxv1 printenv #打印nginxv1的环境变量 进入容器: docker exec -it [容器名称] bash [root@localhost ~]# docker exec -it hungry_wright bash
3.5 删除容器
docker rm [容器ID或名称] -f : 强制删除 [root@localhost ~]# docker rm -f 379a06657ab0 #删除某个容器 [root@localhost ~]# docker rm -f $(docker ps -a -q) #删除所有容器



3.6 保存容器和镜像
3.61 直接将容器保存成本地镜像
docker commit docker commit --help Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 参数: -a : 作者 -m : 提交时解释信息 -p : 保存容器时,是否暂停运行容器 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7390f1d18977 nginx "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 80/tcp hungry_wright [root@localhost ~]# docker commit -a "Linux" -m 'init' -p hungry_wright test:v1
3.62 、将本地的容器保存成镜像压缩包
1、保存容器为镜像压缩包
docker export -o, --output string Write to a file, instead of STDOUT [root@localhost ~]# docker export -o nginx.tar hungry_wright
2、解压容器压缩包成镜像
docker import [root@localhost ~]# docker import nginx.tar test:v2 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test v2 152d9c19a28f 8 seconds ago 140MB
3.63、将本地的镜像保存成镜像压缩包
1.保存镜像为镜像压缩包
docker save Options: -o, --output string Write to a file, instead of STDOUT [root@localhost ~]# docker save -o nginxv1.tar python:3.6 nginx:latest
2.解压镜像压缩包为镜像
docker load Options: -i, --input string Read from tar archive file, instead of STDIN -q, --quiet Suppress the load output [root@localhost ~]# docker load -i nginxv1.tar
3.64 save 和 export之间的区别
1、针对的对象不一样
2、save保存的镜像更加完善
虚悬镜像是仓库名和标签为none