理论
一,简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker是基于容器技术的轻量级虚拟化解决方案,是容器引擎,把linux的cgroup,namespaces等容器底层进行完美的封装,并抽象为用户提供穿件和管理容器的编辑界面
二,三要素
●镜像:一个面向Docker容器引擎的只读模板
●容器:从镜像创建的运行实例
●仓库:集中保存镜像的地方;分公有和私有仓库
三,容器和虚拟机区别
特性 | 虚拟机 | 容器 |
---|---|---|
隔离级别 | 操作系统级 | 进程级 |
系统策略 | Hypervisor | CGroups |
系统资源 | 5~15% | 0~5% |
启动时间 | 分钟级 | 秒级 |
镜像存储 | GB-TB | KB-MB |
群集规模 | 上百 | 上万 |
高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
四,名称空间
UTS hostname and domainname 主机名和域名隔离
User 用户隔离。运行进程的用户和组
Mount 挂载点隔离。即挂载点隔离,主要指根目录
IPC Inter-process-connection 进程间通信隔离。消息队列、共享内容、信号量
Pid Process
ID PID隔离 内核版本:2.6.24
Net Network 网络隔离。网络设备、协议栈、端口
五,三个统一
docker吧容器技术做成了标准化平台,
统一了基础设施环境-----image封装一个简易的操作系统
统一了程序打包------docker镜像
统一了程序部署-------docker容器基于镜像,运行容器
安装部署
网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
[root@localhost ~]# yum -y install docker-ce
启动docker
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
优化网络配置
[root@localhost docker]# vim /etc/docker/daemon.json
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io"],
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"bip": "172.17.50.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-opts": {"max-size":"32M", "max-file":"2"},
"live-restore": true
}
[root@ ~]# mkdir -p /data/docker
[root@localhost docker]# systemctl restart docker
查看网络
登录注册的docker镜像仓库
镜像名称的结构
r
e
g
i
s
t
r
y
n
a
m
e
/
{registry_ name}/
registryname/{repository. name}/
i
m
a
g
e
.
n
a
m
e
:
{image. name}:
image.name:{tag. name}
例如:
docker.io/library/alpine:3.10.1
docker search alpine
docker login docker.io
容器启动过程四个步骤
- Docker客户端联系Docker服务端。
- Docker服务端从Docker中心拉取“hello-world”映像。
- Docker服务端(用新拉的镜像)创建了一个新的容器,该容器运行可执行文件(脚本),生成您当前读取的输出。
- Docker服务端将信息流推到Docker客户端,由客户端展示在你的终端。
镜像的操作
查看docker版本:docker version
●搜索nginx镜像(公有仓库):docker search nginx
●下载nginx镜像:docker pull nginx;下载后存放在/var/lib/docker
●查看镜像列表
docker images #查看下载镜像信息列表
docker inspect nginx:latest #获取镜像详细信息
●为镜像添加新标签
docker tag nginx:latest nginx:web
删除镜像+标签名
docker rmi nginx:web
拉去镜像
[root@localhost docker]# docker pull alpine
对镜像进行打标签和上传镜像到仓库
[root@localhost docker]# docker tag 14119a10abf4 docker.io/shiqiang02/alpine:123
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 123 14119a10abf4 4 days ago 5.6MB
alpine latest 14119a10abf4 4 days ago 5.6MB
shiqiang02/alpine 123 14119a10abf4 4 days ago 5.6MB
[root@localhost docker]# docker push docker.io/shiqiang02/alpine:123
存出镜像并命名为nginx,存到/opt目录下
docker save -o /opt/nginx.tar nginx:latest
●载入镜像
docker load < /opt/nginx
容器的操作
docher ps -a 查看容器
docher ps -aq 只过滤容器id
docher rm -f docher -aq
docher create -it nginx:latest /bin/bash
docher start 容器id 持续运行
docher run centos:7 /usr/bin/bash -c ls / 启动容器,一次性运行
docker stop 容器id
docher run -d centos:7 /usr/bin/bash -c “while ture ;do echo “holle””
docher run -it nginx:latest /bin/bash 进入容器
-i:让容器的标准输入保持打开
-t:让Docker分配一个伪终端
docher exec -it 容器id /bin/bash
docher export 容器id > 文件名 导出
docher import 文件名 centos:7 导入
cat 文件 | docker import - centos:7
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d9dbe3a8473 alpine:123 "/bin/sh" 31 seconds ago Exited (130) 11 seconds ago tender_davinci
[root@localhost docker]# docker run -it alpine:123
四种高级操作
第一种:映射端口
docker run -p 容器外端口:容器内端口
[root@localhost docker]# docker run --rm --name mynginx -d -p81:80 shiqiang02/nginx:12
f859641e2ab613cf43fec7024bdfb23e8b57bfe0354337bc64398c6f798db52f
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f859641e2ab6 shiqiang02/nginx:12 "/docker-entrypoint.…" 42 seconds ago Up 41 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp mynginx
f95087550adf alpine:123 "/bin/sh" 11 minutes ago Exited (0) 11 minutes ago distracted_roentgen
9d9dbe3a8473 alpine:123 "/bin/sh" 15 minutes ago Exited (130) 15 minutes ago tender_davinci
第二种:挂载数据券
docker -v 容器外:容器内
[root@localhost html]# docker run -d --name nginx_baidu -p82:80 -v/root/html:/usr/share/nginx/html shiqiang02/nginx:12
20103a4cfd16e0fd23fb002f79ca086cc4d61dbb40bc2a5d4a02e5542932243e
[root@localhost html]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20103a4cfd16 shiqiang02/nginx:12 "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:82->80/tcp, :::82->80/tcp nginx_baidu
第三种:传参环境变量
docker run -e 环境变量key=环境变量vlue
第四种,容器内下载工具
yum/apt-get/get
容器网络
Docker网络模式 | 配置 | 说明 |
---|---|---|
host模式 | –net=host | 容器和宿主机共享Network namespace。 |
container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | –net=bridge | (默认为该模式) |