1、 Docker概述
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可一致的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。
沙盒也叫沙箱,英文sandbox。在计算机领域指一种虚拟技术,且多用于计算机安全技术。安全软件可以先让它在沙盒中运行,如何含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵循Apachae2.0协议开源。
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的container中,然后发布到任何流行的Linux机器上。
扩展:LXC
LXC是Linux Container的简写。Linux container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
LXC主要通过来之kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。
官方网站:
https://www.docker.com
注:docker服务相当于鲸鱼,container容器就是集装箱
container:集装箱、容器
docker:码头工人
docker源代码:https://github.com/moby/moby
2、 Docker容器技术虚拟机对比
相同点:docker容器技术和虚拟机技术,都是虚拟化技术。
总结:docker相对于VM虚拟机,少了虚拟机操作系统这一层,所以docker效率比虚拟机高。
3、 Docker架构
工作流程:服务器A运行Docker Engine服务,在docker Engine上启动很多容器container,从外网Docker Hub上吧images操作系统镜像下载到本地,放到container容器运行。这样一个容器的实例就运行起来了。
最后,通过Docker Client对docker容器虚拟化平台进行控制。
DockerHub::dockerhub是docker官方的镜像存储点,其中提供了很多常用的镜像供用户下载,如ubuntu,centos等系统镜像。通过dockerhub用户也可以发布自己的docker镜像,为此用户需要注册一个账号,在网站上创建一个docker仓库。
4、 Docker特性
文件系统隔离:每个进程容器运行在一个完全独立的跟文件系统里。
资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup。
网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。
日志记录:Docker将会收集和记录每个进程容器的标准流,用于实时检索或批量检索。
变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。
5、 Docker优点
1) 一些优势和VM一样,但不是所有都一样
比VM小,比VM快。Docker容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分布时间和开销。Docker启动一个容器实例时间短,一两秒就可以启动一个实例。
2) 对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT的发布速度更快。
Docker是一个开放的平台,构建,发布和运行分布式应用程序。
Docker使应用程序能够快速从组建组装和避免开发和生成环境之间的摩擦。
3) 您可以在部署在公司局域网或云或虚拟机上使用它。
4) 开发人员并不关心具体哪个linux操作系统
使用Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。然后,在部署时一切是完全一样的,因为一切都在DockerImage的容器在其上运行。开发人员负责并且能够确保所有的相关性得到满足。
5) Google,微软,亚马孙,IBM等都支持Docker。
6) Docker支持Unix/Linux操作系统,也支持Windows或Mac
6、 Docker局限性
Docker用于应用程序时是最有用的,但并不包括数据。日志,跟踪和数据库等通常应放在Docker容器外。一个容器的镜像通常很小,不合适存大量数据,存储可以通过外部挂载的方式使用。比如使用:NFS、ipsan、MFS等,-V映射磁盘分区。
一句话:docker只用于计算,存储交给别人。
oracle不适合使用docker来运行,太大了,存储的数据太多。
7、 Docker版本简单介绍
1) docker版本的安装方法
Docker最早的版本名是docker和docker-engine,现在名字是docker-ce和docker-ee。
2017年年初,docker公司将原先的docker开源项目改名为moby。
moby是继承了原先的docker项目,是社区维护的开源项目,谁都可以在moby的基础打造自己的容器产品。
docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品。
docker-ee是docker公司维护的闭源产品,是docker公司的商业产品。
注:moby是源代码;docker-ce和docker-ee是容器产品,是rpm包。
所以,现在我们通常使用到的版本就是docker-ce版本。
1、 安装docker环境依赖
[root@xuegod120 ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
2、 安装国内docker的yum源(阿里云)
[root@xuegod120 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、 安装docker-ce
[root@xuegod120 ~]# yum -y install docker-ce docker-ce-cli containerd.io
4、 下载docker镜像
默认docker镜像是从国外的源下载,这样就会造成在pull镜像的时候,经常会因为网络问题,造成pull失败。所以我们配置国内的docker镜像加速源,一般使用阿里云、网易163等常用的网络源。
1) 配置阿里的docker镜像源
https://cr.console.aliyun.com #登录后输入支付宝账号或淘宝账号,找到自己的docker加速地址
2) 配置网易163的加速镜像
https://c.163.com/hub#/m/home/ #需要先注册登录上,才能打开此站点
3) 配置linux本地docker加速镜像
方法1:创建daemon.json文件
[root@xuegod120 ~]# tee /etc/docker/daemon.json << eof
{
"registry-mirrors": ["https://p3rfhvb9.mirror.aliyuncs.com"]
}
eof
方法2:修改docker的启动脚本
[root@xuegod120 ~]# vim /usr/lib/systemd/system/docker.service
在下面内容ExecStart 后加入镜像的链接
[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H fd:// --registry-mirror= https://p3rfhvb9.mirror.aliyuncs.com
推荐使用方法1,使用方法2需要重载daemon和docker服务。
4) 启动docker服务
[root@xuegod120 ~]# systemctl enable docker
[root@xuegod120 ~]# systemctl start docker
5) 显示docker版本和信息
[root@xuegod120 ~]# docker version
[root@xuegod120 ~]# docker info
[root@xuegod120 ~]# docker info
Server:
Containers: 0 #总个数
Running: 0 #运行中的个数
Paused: 0 #暂停的个数
Stopped: 0 #停止的个数
Images: 0 #镜像的数量
Server Version: 19.03.2 #docker的版本嘻嘻
Storage Driver: overlay2
Backing Filesystem: xfs #docker的文件系统格式
………
Name: xuegod120.com #docker宿主机的名称
ID: TAAJ:S7TP:MKNQ:OWEL:DH3D:LF4R:XRLQ:PRJG:6BNQ:5PVP:Z2AG:4JUW
Docker Root Dir: /var/lib/docker #docker的家目录
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://p3rfhvb9.mirror.aliyuncs.com/ #默认的dockerhub镜像源变更为阿里云的源
Live Restore Enabled: false
6) 搜索docker镜像
[root@xuegod120 ~]# docker search centos
7) 下载docker镜像
方法1:从配置的docker镜像地址下载
[root@xuegod120 ~]# docker pull centos
[root@xuegod120 ~]# netstat -antup | grep 443 #查看是否从阿里云的docker镜像下载
方法2:从其他下载站点下载镜像
[root@xuegod63 ~]# docker pull hub.c.163.com/library/tomcat:latest #从163下载
8) 查看下载的docker镜像文件
[root@xuegod120 ~]# docker images
5、 开启动态网络转发功能
[root@xuegod120 ~]# echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
[root@xuegod120 ~]# sysctl -p
net.ipv4.ip_forward = 1
6、 将本地的tar包镜像上传到服务,并加到docker images
[root@xuegod120 ~]# ls
anaconda-ks.cfg docker.io-centos-lastest-image.tar
[root@xuegod120 ~]# docker load -i docker.io-centos-lastest-image.tar
查看上传的镜像
注:之前通过阿里云的镜像下的镜像名称和标签同我们上传的名称和标签一样,所以之前的标签变更为none。
1、 docker的常用参数和语法
语法:docker run -it 镜像名字:标签 命令
-i:已交互式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
-d:后台运行容器,并返回容器ID;
-c:后面跟待完成的命令
例1:启动一个交互式的进程
[root@xuegod120 ~]# docker run -it centos:latest bash
例2:在container中启动一个长久运行的进程,不断向stdin输出hello workd。模拟一个后台运行的服务
[root@xuegod120 ~]# docker run -d centos:latest /bin/sh -c “while true;do echo hello world;sleep 1;done”
加上-d参数后,实例后台运行中,例1的交互式启动,退出后实例自动关闭。
2、 查看容器的日志
[root@xuegod120 ~]# docker logs 9bd8271268e0 #后跟容器ID
注:容器ID可写全,也可以不写全。保持唯一性就行。
3、 查看容器
查看运行中的容器
[root@xuegod120 ~]# docker ps
查看所有容器
[root@xuegod120 ~]# docker ps -a
4、 杀死一个容器
杀死容器,只能是运行中容器,其它状态的,无法杀死。
[root@xuegod120 ~]# docker kill 9bd8271268e0
5、 启动、停止、重启container容器实例
[root@xuegod120 ~]# docker start 9bd8271268e0 #启动容器实例
[root@xuegod120 ~]# docker stop 9bd8271268e0 #停止容器实例
[root@xuegod120 ~]# docker restart 9bd8271268e0 #重启容器实例
6、 删除指定的容器实例
删除运行中的容器实例
[root@xuegod120 ~]# docker rm -f 9bd8271268e0 #加上-f,强制删除,可以先停止在删除
删除休眠或停止的容器实例
[root@xuegod120 ~]# docker rm 5cfa067e7b44
Docker Image的两种制作方法
方法1:docker commit
保存container的当前状态到image后,然后生成对应的image
语法:docker commit 容器实例ID 新image的名称和标签
方法2:docker build
使用Dockerfile文件自动化制作image
语法:docker build -t 父镜像名:镜像的标签 Dockerfile文件所在路径
1、 使用docker commit制作镜像
1) 创建一个安装好apache的容器实例
[root@xuegod120 ~]# docker run -it centos:latest bash
[root@3dc4fe8d7390 /]# yum -y install httpd
[root@aeb1c34ee4c0 /]# exit
2) 查看images镜像列表
[root@xuegod120 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 49f7960eb7e4 15 months ago 200MB
3) 使用commit创建包含apache的镜像
[root@xuegod120 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND EATED STATUS PORTS NAMES
aeb1c34ee4c0 centos:latest “bash” 2 hours ago Up 2 hours unruffled_cannon
[root@xuegod120 ~]# docker commit aeb1c34ee4c0 centos:apache
[root@xuegod120 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos apache 16a7923155b7 10 seconds ago 343MB
centos latest 49f7960eb7e4 15 months ago 200MB
注:centos:apache就是在centos:latest启动容器实例的基础上创建的一个镜像文件
4) 使用新创建的镜像,启动一个实例
[root@xuegod120 ~]# docker run -it centos:apache bash
[root@5ec3243b085b /]# rpm -qa httpd #启动的实例,包含之前创建的apache
httpd-2.4.6-89.el7.centos.1.x86_64
2、 使用docker build创建docker镜像
1) 创建工作目录
[root@xuegod120 ~]# mkdir /docker-build && cd /docker-build/
[root@xuegod120 docker-build]# touch Dockerfile
2) 编辑Dockerfile
[root@xuegod120 docker-build]# vim Dockerfile
FROM centos:latest
MAINTAINER [email protected]
RUN yum -y install httpd
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh
注释:
FROM centos:latest #FROM基于哪个镜像
MAINTAINER [email protected] #MAINTAINER镜像创建者
RUN yum -y install httpd #RUN安装软件用
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh
#ADD将文件拷贝到新产生的镜像的文件系统对应的路径。所有拷贝到新镜像中的文件和文件夹权限为0755,uid和gid为0
CMD /usr/local/bin/start.sh#当docker实例启动成功后,会执行CMD 后面的命令。所以CMD后面一般跟需要开机启动的服务或脚本。一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.
3) 创建脚本内的相关文件
[root@xuegod120 docker-build]# echo “/usr/sbin/httpd -DFOREGROUND” > start.sh
[root@xuegod120 docker-build]# chmod +x start.sh #增加脚本执行权限
[root@xuegod120 docker-build]# echo “docker image build test” > index.html
4) 使用docker build 来创建新的image
[root@xuegod120 docker-build]# docker build -t centos:httpd ./
5) 查看创建的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd 16a7923155b7 10 seconds ago 343MB
centos latest 49f7960eb7e4 15 months ago 200MB
3、 Docker Image的发布
方法1:Save Image To TarBall
方法2:Push Image To Docker Hub
方法1:Save Image To TarBall #导出镜像到本地
保存Image 到tar包
语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签
[root@xuegod120 ~]# docker save -o centos-httpd-image.tar centos:latest [root@xuegod120 ~]# ls
anaconda-ks.cfg centos-httpd-image.tar docker.io-centos-lastest-image.tar
导入镜像到docker
[root@xuegod120 ~]# docker images
REPOSITORY TAG MAGE ID CREATED SIZE
centos latest 1ee86a2b64e4 12 minutes ago 343MB
[root@xuegod120 ~]# docker rmi 1ee86a2b64e4 #删除原镜像
[root@xuegod120 ~]# docker images #发现已经被删除
[root@xuegod120 ~]# docker load -i centos-httpd-image.tar #导入镜像
[root@xuegod120 ~]# docker images #已经导入到docker
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 1ee86a2b64e4 14 minutes ago 343MB
方法2:Push Image To Docker Hub #将镜像发布到外网
1)Signup on docker hub & create repo注册一个帐号
https://hub.docker.com/
2)Login to docker hub
#docker login -u userabc -p abc123 -e [email protected]
3)Push image to docker hub #上传镜像
#docker push centos:httpd
4)Pull image from docker hub #下载镜像
#docker pull userabc/centos:httpd#用户名/镜像名
##后面详细介绍将镜像发布到外网的发布
1、 启动一个容器实例,并将容器实例的80端口映射到宿主机
[root@xuegod120 ~]# docker run -dit -p 80:80 centos:latest bash
[root@xuegod120 ~]# docker ps -a
查看映射的端口
[root@xuegod120 ~]# netstat -antup
tcp6 0 0 :::80 :: LISTEN 21192/docker-proxy
2、 在启动的容器实例上,安装sshd服务,将22端口映射宿主机,通过sshd直接登录容器实例
方法1:将安装sshd容器实例打包成镜像,重新启动实例后进行映射。
[root@xuegod120 ~]# docker commit 6bdaf6247d73 centos-ssh
[root@xuegod120 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-ssh latest e6bfe70dd4e2 10 seconds ago 455MB
centos latest 1ee86a2b64e4 45 minutes ago 343MB
[root@xuegod120 ~]# docker run --privileged --cap-add SYS_ADMIN -dit -p 222:22 centos:ssh-apache /usr/sbin/init
注释:
–privileged:以特权模式运行容器实例
–cap-add:以系统最高权限运行容器实例
[root@xuegod120 ~]# docker exec -it 4287412a620d bash #进入启动后的实例
[root@4287412a620d /]# yum -y install net-tools #安装网络工具
[root@4287412a620d /]# passwd root #给root用户配置密码
使用宿主机登录到容器实例
[root@4287412a620d /]# systemctl start sshd #容器实例必须要用最高权限启动,否则无法运行systemctl命令
[root@4287412a620d /]# netstat -antup | grep 22 #sshd服务已启动
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 88/sshd
测试网络连通性,在宿主机上ping容器实例
使用ssh登录服务器测试
方法2:直接在iptables防火墙中添加nat端口映射
首先查看本机iptables防火墙的NAT的列表
[root@xuegod120 ~]# iptables -t nat --list-rules POSTROUTING
-P POSTROUTING ACCEPT
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 22 -j MASQUERADE
然后仿照上上面的NAT端口映射,添加一条到容器实例IP地址的端口映射
例如将宿主机的8080端口映射到容器实例的80端口,如下:
[root@xuegod120 ~]# iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
再次查看NAT的列表
[root@xuegod120 ~]# iptables -t nat --list-rules POSTROUTING
-P POSTROUTING ACCEPT
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 22 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
进入容器实例,启动httpd服务
[root@4287412a620d /]# systemctl start httpd
[root@4287412a620d /]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 102/httpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 50/sshd
写入测试页面,进行访问测试
[root@4287412a620d /]# echo “hello world xuegod110” > /var/www/html/index.html