穷则思变,变则通,通则达!
Docker简介:
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使用沙盒机制,互相之间不会有任何接口(类似iPhone的APP)几乎没有性能开销,很容易的在机器和数据中心中运行.最重要的是,他们不依赖任何语言,框架或包装系统
沙盒
沙盒也叫沙箱,英文sandbox.在计算机领域指的是一种虚拟技术,且多用于计算机安全技术.安全软件可以先让它在沙盒中运行,如果有恶意行为,则禁止程序的进一步运行,而这不会给系统造成任何危害
Docker是dotCloud公司开源的一个基于LCX的高级容器引擎,源代码托管在github上,基于go语言并遵从Apache2.0协议开源,其官网为:<https://www.docker.com
LCX
LCX是Linux Container的简写,Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性
LCX主要是通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配置和度量.
docker容器技术和虚拟机对比
- 相同点:docker容器技术和虚拟机技术都是虚拟化技术
- 不同点:docker相当于vm虚拟机,但少了虚拟机操作系统这一层,所以docker效率要比vm强
docker架构
工作流程:
服务器A上运行docker engine服务,在docker engine上启动多个container,从外网docker hub上把image操作系统镜像下载下来,放到container容器中运行,这样一个容器的实例就运行起来了.最后通过docker client对docker容器虚拟化平台进行控制
image和container的区别:
image可以理解为一个系统镜像,container是image在运行时的一个状态.如果拿虚拟机作一个比喻的话,image是关机状态下的磁盘文件,container是虚拟机运行时的磁盘文件,包括内存数据
docker hub
是docker官方的镜像存储站点,其中提供了很多常用的镜像供用户下载,如ubuntu,centos等系统镜像,通过docker hub,用户也可以发布自己的docker镜像,为此用户需要注册一个账号,在网站上创建一个docker仓库
docker核心技术:
namespace—–实现container的进程,网络,消息,文件系统和主机名的隔离
cgroup——实现对资源的配额和度量
docker的特性
文件系统隔离:每个进程容器运行在一个完全独立的根文件系统中
资源各类:系统资源,像CUP和内存等可以分配到不同的容器中,使用cgroup
日志记录:docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索
变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用已创建更多的容器,无需使用模板或手工配置
交互式shell:docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互的shell
Docker的优缺点:
优点:
一些优势和 VM 一样,但不是所有都一样。
VM 小,比 VM 快,Docker 容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分发时间和开销。Docker 启劢一个容器实例时间徆短,一两秒就可以启劢一个实例。
对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT 的发布速度更快。
Docker 是一个开放的平台,构建,发布和运行分布式应用程序。
Docker 使应用程序能够快速从组件组装和避免开发和生产环境之间的摩擦。
您可以在部署在公司局域网戒云戒虚拟机上使用它。
开发人员并不关心具体哪个 Linux 操作系统
使用 Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。
然后,在部署时一切是完全一样的,因为一切都在 DockerImage 的容器在其上运行。
开发人员负责并且能够确保所有的相关性得到满足。
Google,微软,亚马逊,IBM 等都支持 Docker。
Docker 支持 Unix/Linux 操作系统,也支持 Windows 戒 Mac
缺点:
1.Docker 用于应用程序时是最有用的,但并丌包含数据。日志,跟踪和数据库等通常应放在 Docker
容器外。一个容器的镜像通常都徆小,丌适合存大量数据,存储可以通过外部挂载的方式使用。比如使用:NFS,ipsan,MFS 等, -v 映射磁盘分区
2.一句话:docker 叧用于计算,存储交给别人。
3.oracle 不适合使用 docker 来运行,太大了,存储的数据太多。
安装docker
在红帽7/centos7上安装
下载docker引擎的rpm安装包
1 | wget https://get.docker.com/rpm/1.7.1/centos-7/RPMS/x86_64/docker-engine-1.7.1-1.el7.centos.x86_64.rpm |
安装docker
1 | rpm -ivh docker-engine-1.7.1-1.el7.centos.x86_64.rpm |
开启docker
1 | systemctl start docker |
设置开机自启
systemctl enable docker
查看docker信息
1 | docker info |
查看所存在的镜像
1 | docker images |
从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像
1 | docker pull ubuntu:12.04 |
这条命令实际上相当于 docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。如果不指定版本的话,那么就去下载最新版的ubuntu
用镜像创建一个容器 -t :指定要创建的目标镜像名
1 | docker run -t -i ubuntu:12.04 /bin/bash |
查看所存在的镜像
1 | [root@localhost ~]# docker images |
docker inspect +IMAGE ID可以查看当前镜像的具体信息
1 | [root@localhost ~]# docker inspect 62b726df5062 |
通过docker rmi ubuntu:版本/id删除镜像
1 | [root@localhost ~]# docker rmi ubuntu:12.04 |
修改镜像的tag(标签)
1 | [root@localhost ~]# docker tag ubuntu:12.04 ubuntu:newtag |
docker下载kali系统
1 | [root@localhost ~]# docker pull kalilinux/kali-linux-docker |
在Docker Hub搜寻镜像
1 | [root@localhost ~]# docker search httpd |
查看docker详细信息
1 | [root@localhost ~]# docker info |
从docker hub搜索所需要的镜像,如果 OFFICIAL 为[ok] ,说明可以放心使用。
1 | [root@localhost ~]# docker search centos |
从docker hub拉取(下载)镜像 pull:拉
1 | [root@localhost ~]# docker pull centos |
pull镜像出错解决方法
错误一
1 | [root@xuegod63 ~]# docker pull docker.io/centos |
法一:换国内源
修改/etc/docker/daemon.json
1 | [root@xuegod63 ~]# vim /etc/docker/daemon.json #改成以下内容 |
法二:把之前下载好的 image 镜像导入 image:
把 docker.io-centos.tar 镜像上传到 linux 上
参数: -i “ docker.io-centos.tar “ 指定载入的镜像归档。
1 | [root@xuegod63 ~]# docker load -i /root/docker.io-centos.tar |
法三:直接下载其他站点的镜像
1 | [root@xuegod63 ~]# docker pull hub.c.163.com/library/tomcat:latest |
查看 images 列表
1 | [root@xuegod63 ~]# docker images #列出本地所有镜像。其中 [name] 对镜像名称进行关键 |
错误二:
如果报以下错误:表示没有开启网络转发功能的话就会报错,默认已自动打开
那么输入以下内容
1 | [root@localhost ~]# echo 1 >/proc/sys/net/ipv4/ip_forward |
或者修改一下文件
1 | [root@xuegod63 ~]# vim /etc/sysctl.conf |
docker实践:
实例1:在实例中执行bash命令
运行一个container并加载centos,运行起来之后,在实例中执行/bin/bash命令
- run:运行
- -i:以交互模式运行容器,通常与-t同时使用
- -t:为容器重新分配一个伪输入终端,通常与-i同时使用
格式:docker run -it 镜像名:tags /bin/bash
1 | [root@localhost ~]# docker run -it centos /bin/bash |
实例2:模拟后台运行服务
例2:在container中运行一个长久运行的进程,不断向stdin输出helloworld,模拟一个后台运行服务
docker常用参数:
- -d:在后台运行容器,并返回容器ID
- -c:后面跟待完成的命令,bash指的是使用bash去执行命令
1 | [root@localhost ~]# docker run -d centos:latest bash -c "while true;do echo hello,world;sleep 1;done" 2822f36cb76defc5923ea509d32eaa3fae165830064484746c97aabbc0339839 |
返回值为容器的ID
也可以使用docker ps查看所有运行的容器,可以发现其容器ID
1 | [root@localhost docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2822f36cb76d centos:latest "bash -c 'while true 11 minutes ago Up 11 minutes goofy_hodgkin |
列所有的容器(包含沉睡/退出状态的容器)
1 | docker ps -a |
从容器中取日志,查看输出内容
语法:docker logs 容器id
1 | [root@localhost ~]# dockerCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2822f36cb76d centos:latest "bash -c 'while true 11 minutes ago Up 11 minutes goofy_hodgkin logs 2822f36cb76defc5923ea509d32eaa3fae165830064484746c97aabbc0339839 |
实例3:kill掉一个容器
首先列出所有的容器
1 | [root@localhost ~]# docker ps -a |
杀死容器docker kill 容器ID
1 | [root@localhost ~]# docker kill c4a213627f1b c4a213627f1b |
关闭容器
1 | [root@localhost ~]# docker stop 2822f36cb76d 2822f36cb76d |
开启容器
1 | [root@localhost ~]# docker start 2822f36cb76d 2822f36cb76d |
删除容器(不能删除正在运行的容器)
1 | [root@localhost ~]# docker rm 2822f36cb76d |
强制删除容器(可以删正在运行的容器)
1 | [root@localhost ~]# docker rm -f 2822f36cb76d |
删除镜像(image)
1 | [root@localhost ~]# docker rmi 9ab5ff067039 |
docker镜像制作方法:
法一:使用docker commit 容器ID(或者镜像名),保存container的当前状态到image后,然后生成对应的image
1
2
3[root@localhost ~]# docker commit 95e796801e15433631bb6cee9e4f101503396db5732f578c4a842ceeb6d82862 centos1:lastest
#docker commit 容器ID 生成的容器名:标签
#也可以直接docker commit 容器ID法二:在Docker file文件下使用docker build自动化制作镜像,Dockerfile有点像源码编译时./configure后产生的Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[root@localhost ~]# cd /
[root@localhost /]# mkdir docker-build
[root@localhost /]# cd docker-build/
[root@localhost docker-build]# touch Dockerfile
[root@localhost docker-build]# vim Dockerfile
#填写以下内容
FROM docker.io/centos:latest #FROM基于哪个镜像
MAINTAINER <mk@xuegod.cn> #MAINTAINER镜像创建者
RUN yum -y install httpd #RUN安装软件
ADD start.sh /usr/local/bin/start.sh #把start.sh启动脚本安装到镜像的/usr/local/bin/start.sh目录下
#把index.html启动脚本安装到镜像的/var/www/html/index.html里
ADD index.html /var/www/html/index.html
#container启动时执行的命令或启动服务,但是一个Dockerfile中只能有一条CMD命令,多条则
CMD echo hello,world或者写入另一个Dockerfile文件
1
2
3
4
5
6
7
8# vim dockefile1
FROM ubuntu
MAINTAINER xxx
RUN echo hello1 > test1.txt
RUN echo hello2 > /test2.txt
EXPOSE 80
EXPOSE 81
CMD ["/bin/bash"]
3、创建 start.sh 脚本启劢 httpd 服务和 apache 默认首页 index.html 文件
1 | [root@localhost docker-build]# echo "/usr/sbin/httpd -DFOREGROUND" > start.sh |
创建 index.html
1 | [root@localhost docker-build]# echo "docker image build test" > index.html |
4、使用命令 build 来创建新的 image
语法:docker build -t 父镜像名:镜像的 tag Dockerfile 文件所在路径
-t :表示 tage,镜像名
例:使用命令 docker build 来创建新的 image,并命名为 docker.io/centos:httpd
1 | [root@localhost docker-build]# docker build -t docker.io/centos:httpd ./ |
注: ./ 表示当前目彔。另外你的当前目彔下要包含 Dockerfile
Docker Image的发布
docker镜像=应用/程序+库
方法一:save image to tarball,保存镜像到tar包
语法:
1 | docker save -o 导出的镜像名.tar 本地镜像名:镜像标签 |
然后导入时使用
1 | docker load -i 导出的镜像名.tar |
方法二:push到docker hub上
1.注册账号:https://hub.docker.com/
2.登陆docker hub
1 | docker login -u 用户名 -p 密码 -e 邮箱地址 |
3.上传镜像
1 | docker image 镜像名:标签 |
4.下载镜像
1 | docker pull 用户名/镜像名 |
docker端口映射
端口映射
-d:设置容器在在后台一直运行
-p:设置端口映射,格式为本地端口:docker容器端口
-c:执行系统命令,这个文件是我本地写好的自动化脚本用来打开HTTP服务
1 | [root@localhost ~]# docker run -d -p 80:80 centos:httpd /bin/bash -c /usr/local/bin/start.sh |
注:当前使用的docker实例运行的网络模式相当于VMware中的NAT模式
查看正在运行的容器
1 | [root@localhost ~]# docker ps |
访问容器实例
docker exec -it
1 | docker exec -it centos:httpd /bin/bash |