Docker基本管理
一、Docker概述
1.1 docker概述
■ Docker是什么?
- 是一种轻量级的“虚拟机”
- 在Linux容器里运行应用的开源工具
■ Docker与虚拟机的区别
- 参考案例指导文档表1-1
■ Docker的使用场景
- 打包应用程序简化部署
- 可脱离底层硬件任意迁移
- 例:服务器从腾讯云迁移到阿里云
1.2 容器和虚拟机的区别
虚拟机 | 容器 | |
---|---|---|
资源 | 资源多 | 资源少 |
开启时间 | 30-60秒 | 毫秒 |
安全 | 系统隔离 | 内核共享 |
弹性扩展 | 执行时间长 | 执行时间短 |
二、Docker的核心概念及安装方式
■ Docker核心概念
- 镜像
- 一个面向Docker容器引擎的只读模板
- 容器
- 从镜像创建的运行实例
- 仓库
- 集中保存镜像的地方
■ CentoS安装Docker的两种方式
- 使用CURL获得Docker的安装脚本进行安装
- 使用YUM仓库来安装Docker
三、Docker的镜像创建与操作
3.1 Docker镜像的分层
- Dockerfile中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
- 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效
- 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
- 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件
3.2 Docker镜像的创建
■ Docker镜像
- 应用发布的标准格式
- 支撑一个Docker容器的运行
■ Docker镜像的创建方法
- 基于已有镜像创建
- 基于本地模板创建
- 基于Dockerfile创建(常用)
■ Dockerfile常用操作指令
指令 | 含义 |
---|---|
FROM镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令。 |
RUN命令 | 相当于在创建这个镜像的时候,这个镜像会自动生成一个容器,是在容器当中执行的指令,而不是在宿主机执行的指令 |
CMD | 启动容器的时要被执行的命令或脚本,如果有多个命令,不会报错只会执行最后一条命令 |
EXPOSE端口号 | 容器对外暴露的端口,并不是映射端口(映射端口是宿主机的) |
ADD 源文件/目录 目标文件/目录 | 将源文件(宿主机的文件)拷贝到容器当中 |
COPY 源文件/目录 目标文件/目录 | 只限于容器内部的复制,容器内部的文件复制到容器内部的路径 |
VOLUME | 宿主机的某个目录共享出来,被容器所能直接使用 |
WORKDIR | 相当于在容器内执行了cd |
3.3 构建各类docker镜像服务
■ 案例环境
主机 | 操作系统 | 主机/IP地址 | 主要软件及版本 |
---|---|---|---|
服务器 | Centos7.4 x86-64 | Localhost/20.0.0.21 | Cocker-19.03.8 |
■ 需求描述
- docker安装、网络优化、镜像加速
- docker镜像和容器的操作
- 基于容器(现有镜像)创建镜像服务
- 基于模板创建镜像服务
- 基于Dockerfile 创建常用基础服务
3.3.1 安装docker、镜像加速、网络优化
1、安装依赖包
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
#yum-utils 提供了yum-config-manager
#device mapper 存储驱动程序系统device-mapper-persistent-data 和lvm2
#Device Mapper 是Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构
2、设置阿里云镜像源
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装Docker-CE
[root@localhost ~]# yum -y install docker-ce // 安装docker-ce(ce代表社区版本)
[root@localhost ~]# systemctl stop firewalld // 关闭防火墙
[root@localhost ~]# setenforce 0 // 临时关闭核心防护
[root@localhost ~]# vim /etc/selinux/config // 永久关闭核心防护
SELINUX=disabeld
- 镜像加速
mkdir -p /etc/docker // 没有docker目录的话就先创建docker目录
这个需要去阿里云网站搜索容器镜像服务,然后点击左下角栏的镜像加速,然后就有加速配置文件,每个人都不一样,都用一个人的会很慢
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":["https://ung2thfc.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload // 重新加载配置
systemctl restart docker // 重启docker
- 网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 // 开启路由转发
sysctl -p // -p:从指定的文件加载系统参数
service network restart // 重启网络
systemctl restart docker // 重启docker
docker version // 查看docker版本信息
3.3.2 从docker公网上下载镜像、起别名、删除镜像、导出和导入镜像
docker search nginx // 查找公网上的镜像
docker pull nginx // 根据上面查找的镜像,进行下载
下载后存放在 /var/lib/docker目录下
/var/lib/docker/image/overlay/repositories.json // 下载文件信息
docker images // 查看镜像信息
docker inspect c39a868aad02 //获取镜像信息
///添加新标签(起别名)
改的只是别名,id还是一个。
如果给某个镜像起了 别名,想通过id删除是删不掉的,因为id都一样,需要通过删除别名或者只剩下一个镜像才能删除
docker tag nginx:latest nginx:web //把nginx:latest复制并起一个nginx:web别名
///查看
docker images //查看镜像
///删除镜像
docker rmi nginx:latest //删除nginx:latest镜像
///保存镜像命名为nginx存在当前目录下
cd /opt/ //到opt目录下
docker save -o nginx nginx:web //把nginx:web 镜像命名为nginx保存,-o是导出的意思
ls -lh nginx //查看一下
///载入镜像(恢复镜像)
cd /opt/ //进入到opt目录
方法一:docker load < nginx //把nginx镜像恢复到docker里
方法二:docker --input nginx //不用这种方法!!!
3.3.3 上传镜像
需要注册docker的账号,才可以用!!!
//改标签
docker tag nginx:latest abner/nginx:web //用户名//仓库名:镜像名
//登陆
docker login
Username: docker
password:
Email: xxx@xxx.com
//上传
docker push abner/nginx:web
docker login //照着以下这几条就登录了!!!
username:xxxxx //账号
password:xxxxx //密码
Succeeded
3.3.4 容器的操作
//容器创建
docker create -it nginx:web /bin/bash //创建一个bash环境
-i 让容器的标准输入保持打开
-t 让Docker分配一个伪终端
//查看容器
docker ps -a //-a 列出所有的容器,包括未运行的容器
CONTAINER ID IMAGE COMMAND CRE
b9fe009a3ec2 nginx:web "/docker-entrypoint.…" 8 irch
//启动容器
docker start b9fe009a3ec2 //通过id启动
//查看状态up
docker ps -a //-a 列出所有的容器,包括未运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b9fe009a3ec2 nginx:web "/docker-entrypoint.…" 11 minutes ago Up 2 seconds 80/tcp musing_kirch
3.3.5 进入容器的操作
docker pull centos:7 //下载一个centos7镜像,因为镜像需要
docker create -it centos:7 /bin/bash //将centos7加入到容器里
docker start e0fc78304275 //启动centos7容器
docker exec -it e0fc78304275 /bin/bash //进入到centos7容器里
注意:下载的centos系统都是最小化安装,没有工具,使用ifconfig,需要先安装
yum -y install net-tools //安装ifconfig工具
就能看见docker 0的ip地址 172.17.0.3
exit //退出
docker稳定运行三步骤:
1、先下载镜像
2、借助镜像创建容器
3、启动容器
3.3.6 容器的操作
//启动执行命令查看系统根目录
docker pull paigeeworld/centos7 //下载镜像
docker create -it paigeeworld/centos7 /bin/bash //创建容器
docker start 31c5e232b074 //启动容器
###把centos7容器和镜像删掉在操作下面步骤###
docker run paigeeworld/centos7 /usr/bin/bash -c ls /
//上面这一句话就直接包含了上面三条,下载镜像、创建容器、启动容器。-c是命令的意思,当执行完ls之后就会释放掉!(一次性的运算,可以减轻资源占用)
//执行完成直接关闭状态是Exited
Exited状态:是关闭状态,也可能是执行完后被释放的
//持续在后台执行
docker run centos:7 /bin/bash -c "while true;do echo hello;done" //会持续显示hello,需要另开终端,stop掉容器
//终止运行
docker stop a029cbf81e0c
//显示所有容器信息
docker ps -a
//进入容器
docker start 6c9aabe7b1e5 (一定要是运行状态!!!)
docker exec -it 6c9aabe7b1e5 /bin/bash
exit //退出容器
//容器导出(备份出去,在哪个文件夹)
docker export b9fe009a3ec2 > /opt/nginx_c
//容器导入(会生成镜像,而不会创建容器)
cat nginx_c | docker import - nginx:web
//删除容器
docker rm 4d8dcf51a4ef
//批量删除容器
docker ps -a | awk '{print "docker rm "$1}' | bash
注意:1、删除在容器里的镜像,需要先删除容器在删除镜像
2、批量删除只能删除关闭状态下的容器(留出来的都是up状态的,也是一种优化)
- Docker镜像的创建方法有三种
3.3.7 基于已有的镜像容器进行创建
docker exec -it b80ae2424ae7 bash //登录容器
touch test.txt //创建了一个文件,相当于在现有的容器做了修改
exit //退出
docker commit -m "new" -a "daoke" c83aee844ae0 daoke:test //取刚刚修改过的id,生成daoke:test 镜像名
-m 说明信息
-a 作者信息
-p 生成过程中停止容器的运行
docker images //查看一下镜像信息,就能看到刚刚创建的镜像
3.3.8 基于本地模板创建
此方法使用的少
小技巧:wget的下载模式可以放在迅雷上面下载,更快一些,不然下载太慢了!
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
直接wget下载,或者把包上传上去
cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new
docker images //查看一下镜像信息,就能看到刚刚创建的镜像
3.3.9 Dockerfile文件
mkdir apache //创建一个文件,放Dockerfile的三个重要配置
cd apache //进入目录
vim Dockerfile //创建一个Dockerfile 名字不能写错,固定的名称
#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER The porject <cloud-ops@centos.org> //描述性信息,随便写
#镜像操作指令安装apache软件
RUN yum -y update //更新yum仓库
RUN yum -y install httpd //安装apache
#开启80端口
EXPOSE 80 //暴露容器端口
#复制网站首页文件
ADD index.html /var/www/html/index.html //把宿主机当中的index.html,复制到容器html当中
#将执行脚本复制到镜像中
ADD run.sh /run.sh //把宿主机run脚本,拷到容器当中
RUN chmod 755 /run.sh //并给容器里的脚本执行权限
#启动容器时执行脚本
CMD ["/run.sh"]
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
echo "web test" > index.html
//生成镜像
docker build -t httpd:centos . (注意别忘了末尾有".")
//新镜像运行容器
docker run -d -p 1216:80 httpd:centos //-d:守护进程,让持续不断的执行。-p:指定端口映射到1216端口映射到80端口
docker ps -a //查看容器信息,就能看到映射端口信息0.0.0.0:1216->80/tcp
//测试
http://20.0.0.21:1216/