docker简介
一、docker是什么有什么用
- Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源;
- Docker 可以让开发者打包应用以及依赖包到一个轻量级可移植的容器中,然后发布到 Linux 机器上,也可以实现虚拟化;
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低;
二、docker的基本架构
1、几个基本的概念
- Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板,类比面向对象中的类;
- Docker 容器(Container):容器是独立运行的一个或一组应用,类比面向对象中的对象;
- Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信;
- Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器;
- Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用;
- Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装- Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure;
docker安装(linux)
1、centos安装docker
2、ubuntu安装docker
docker使用
一、镜像管理
1、查找远程仓库的镜像:docker search tomcat
2、选择相应的版本下载到本地:docker pull tomcat:8.0
3、启动相应的镜像并访问:docker run -it --rm -p 8888:8080 tomcat:8.0
4、查看本地镜像和删除本地镜像:docker images;docker rmi docker.io/tomcat:8.0
5、push 和 tag 命令
docker push(镜像提交到远程仓库,先通过 commit 提交一个镜像)
docker tag docker.io/tomcat:8.0 docker.io/mytomcat:8.0(镜像重命名)
6、镜像的制作
- 一种是先下载原始的镜像,修改后 commit(推荐)
- 一种是通过 Dockerfile 文件来创建新的镜像
7、镜像加速的配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hvmf8r55.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
二、容器管理
1、运行镜像:
docker run -dit --privileged -p21:21 -p80:80 --name test haha/demo:latest /usr/sbin/init
-dit:-d 表示在后台运行 -i t 合用表示提供交互接口和伪终端
–privileged :带权限启动容器,这样才可以在容器里进行完整的操作
-p21:21 这里的作用其实就是做端口的映射,主机端口映射到容器端口
–name test:给容器取了个名字
/usr/sbin/init: 表示启动后运行的程序
2、容器的进入和退出:docker exec -it demo /bin/bash(进入);exit(退出)
3、容器的生命周期管理:pause(暂停)/unpause(恢复) start(开始)/stop(停止)
4、查看容器的运行
- 查看所有状态的容器:
docker ps -a
- 查看 run 和 pause 的容器:
docker ps
- 查看某个容器的详细信息:
docker inspect test
5、删除容器操作:
docker rm test
(删除一个);docker rm -f $(docker ps -qa)
(删除所有的容器);- 运行中的容器需要先停止才能删除;
练习:安装 tomcat、nginx、mysql 等常用工具
知识点补充
一、docker命令参考
二、docker 的四种网络模式
1、网络隔离
- Docker使用了Linux的Namespaces技术来进行资源隔离,PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络;
- 一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离;
2、四种模式简介
host 模式
- 不会获得一个独立的Network Namespace,而是和宿主机共用;
- 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口,因此运行镜像的时候无需进行端口的映射;
container 模式
- 新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享;
- 除了网络,其他的资源还是相互隔离的;
none 模式
- Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置;
- 这个Docker容器没有网卡、IP、路由等信息,需要我们自己为Docker容器添加网卡、配置IP等;
bridge 模式
- 为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上;
3、默认 bridge 模式原理
拓扑结构说明
- 当Docker启动时,会在主机上创建一个名为docker0的虚拟网桥,启动的Docker容器会连接到这个虚拟网桥上;
- 在 linux 系统中通过 ifconfig 命令是可以看虚拟网桥 docker0 的,容器的默认网关就是 docker0 的 ip 地址;
通信原理说明
- 容器访问外网需要经由主机,通过 SNAT 将原地址转换为主机地址,对外面来说,看起来这个请求就是从主机发出的一样,而docker容器对外是不可见的;
- 外网要访问容器也是要经由主机,请求到主机后做 DNAT 的转换将请求报文发往目标容器,这个过程中容器对外也是不可见的;
- 以上步骤的转换过程都是通过定义防火墙规则来实现的;
- 关于DNAT 和 SNAT:二者都是修改请求报文的目标地址,但是SNAT是局域网访问互联网,而DNAT则相反;
三、docker 和虚拟机的比较
1、理解虚拟机
2、理解docker
3、二者的比较
- docker 相比虚拟机更加的轻量级,占用的资源更少,性能更好;
- docker能够实现容器与主操作系统隔离,容器与容器之间的隔离;
- 虚拟机能够实现更加彻底的隔离,彻底隔离整个运行环境;
- 如果只是需要实现应用的隔离用 docker 更加合适;