Docker
- 一种轻量级的“虚拟机”
- 在Linux容器里运行应用的开源工具
Docker的使用场景
- 打包应用程序简化部署
- 可脱离底层硬件任意迁移
容器与虚拟机对比
| 虚拟机 | 容器 | |
|---|---|---|
| 占用资源 | 多 | 少 |
| 开启时间 | 30~60秒 | 毫秒 |
| 安全 | 系统隔离 | 内核共享 |
| 弹性扩展 | 执行时间长 | 执行时间短 |
Docker的核心概念
- 镜像:一个面向Docker容器引擎的只读模板
- 容器:从镜像创建的运行实例
- 仓库:几种保存镜像的地方
Centos安装Docker的两种方式
- 使用CURL获得Docker的安装脚本进行安装
- 使用YUM仓库来安装Docker
部署Docker
-
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
解释:
- yum-utils 提供了yum-config-manager
- device mapper 存储驱动程序需要device-mapper-persistent-data和lvm2
- Device Mapper是Linux2.6内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
-
设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -
安装Docker-CE
yum install -y docker-ce
systemctl stop firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
systemctl start docker.service
systemctl enable docker.service
配置镜像加速器
在阿里云上用一个账号找加速地址,填入下方的中括号里。(在阿里云的控制台搜索镜像加速服务,找到镜像加速器一栏即可看到自己的加速地址,并且阿里云给出了添加加速地址的命令模板)
tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”:[“https://xxxxxxxx.mirror.aliyuncs.com”]
}
EOF
systemctl daemon-reload
systemctl restart docker
网络优化:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
service network restart
systemctl restart docker
----------------------------------------------------------
镜像相关操作:
docker version (查看docker版本)
docker search nginx (查找指定镜像,例如nginx)
docker pull nginx (下载镜像,例如nginx)
(AUFS联合文件系统,分层下载,下载后放在/var/lib/docker)
/var/lib/docker/image/overlay/repositories.json (下载文件信息)
docker images 查看镜像信息
docker inspect 镜像ID (获取镜像信息)
docker tag nginx:latest nginx:web (修改镜像信息)
docker images | grep nginx (查看nginx镜像信息)
nginx latest c39a868aad02 4 days ago 133MB
docker里的两种格式文件:json、yaml
docker rmi nginx:web (删除标签为web的nginx镜像)
docker save -o nginx nginx:latest (存出镜像名为nginx放在当前目录下)
载入镜像:
方法一:docker load < nginx
方法二:docker --input nginx
上传镜像(不常用):
docker tage nginx:lastest abc/nginx:web (用户名/仓库名:镜像名)
docker login (登录)
Username::docker (账户)
password:xxxxxx (密码)
Email:[email protected] (邮箱)
docker push abc/nginx:web (上传)
----------------------------------------------------------
容器相关操作:
docker create -it nginx:latest /bin/bash (创建容器,例如创建一个nginx容器,标签是latest)
-i:让容器的标准输入保持打开
-t:让Docker分配一个为终端
docker ps -a (查看容器信息)
-a:列出所有的容器,包括未运行的容器
docker start 容器ID (启动容器)
docker stop 容器ID (停止容器)
容器状态:
up:运行
created:已创建但未启动
exited:停止或执行完指令被释放(其中有个返回值,为0的时候表示执行完后自动结束,非0表示执行异常或在执行过程中让其stop)
启动执行命令查看系统根目录:
docker pull paigeeworld/centos7 (下载镜像)
docker create -it paigeeworld/centos7 /bin/bash (创建容器)
docker start 容器ID (启动容器)
将上面的三步骤用一条命令完成:
docker run paigeeworld/centos7 /usr/bin/bash -c ls (一条命令将三步骤全部完成,如果没有镜像则会先下载,结束后会释放资源。执行完毕直接关闭,状态为Exited)
docker容器三步骤:
1.下载镜像
2.创建容器
3.启动容器
容器持续在后台运行:
docker run -d paigeeworld/centos7 /bin/bash -c “while true;do echo hello;done”
-d:在后台运行
容器导出:
docker export 4613c886e5f9 > nginx_c docker export 容器的ID/名称 > 文件名
容器导入(会生成镜像,但不会创建容器):
cat nginx_c | docker import -nginx:web cat 文件名 | docker import -生成的镜像名称:标签
批量删除容器(删除非运行状态的容器):
docker ps -a | awk ‘{print "docker rm "$1}’ | bash
docker exec 容器的ID/名称 /bin/bash (进入容器,要在容器运行状态下才可以进入)
exit (退出容器)
Docker镜像创建
方法:
- 基于已有镜像创建
- 基于本地模板创建 (不怎么用)
- 基于Dockerfile创建 (制作镜像几乎都是dockerfile,需要用配置文件生成指定镜像)
基于已有镜像创建:
- 将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器ID/名称 仓库名称:[标签]
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
基于本地模板创建:
- 通过导入操作系统模板文件生成新的镜像
- 使用wget命令导入为本地镜像
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz - 导入成功后可查看本地镜像信息
docker images | grep new
基于Dockerfile创建
- Dockerfile是由一组指令组成的文件
- Dockerfile结构四部分
·基础镜像信息
·维护者信息
·镜像操作指令
·容器启动时执行指令 - Dockerfile每行支持一条命令,每条命令可携带多个参数,支持以"#"开头的注释
例:
mkdir apache
cd apache
vim Dockerfile
FROM centos:7 (基于的基础镜像,指定新镜像所基于的镜像,第一条指令必须为FROM,每创建一个镜像就需要一条FROM指令)
MAINTAINER Qian (维护镜像的用户信息)
#基于centos:7镜像上执行命令,并提交到新镜像,安装apache软件
RUN yum -y update
RUN yum -y install httpd
#新镜像加载到Docker时开启80端口
EXPOSE 80
#复制网站首页文件,将源文件复制到目标文件,源文件要与Dockerfile在同一个目录或者是一个URL
ADD index.html /var/www/html/index.html
#复制执行脚本到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh (新镜像中赋予执行权限)
#启动容器时执行脚本 (指令启动容器时要运行的命令或脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行)
CMD ["/run.sh"]
创建运行脚本:
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
写一个主页:
echo “this is web test” > index.html
生成镜像:
docker build -t httpd:centos . (末尾有".",且与centos之间有空格)
新镜像运行容器:
docker run -d -p 1216:80 httpd:centos
在这里做了端口映射:-p指定端口1216
测试访问:
httpd://20.0.0.31:1216