1.Docker的概述
如果要方便的创建运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时 间地点可获取这些资源,这正是 Docker 所能提供的。Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大的提高了工作效率。
Docker 的三大核心概念------镜像,容器,仓库。
1.1Docker的优势
Docker 容器运行速度很快,启动和停止可以在秒级实现,比传统虚拟机要快很多;Docker 核心解决的问题是利用容器来实现类似虚拟机的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。因此,Docker 容器除了运行其中的应用之外,基本不消耗额外的系统资源,在保证应用性能的同时,又减小了系统开销,使得一台主机上同时运行数千个 Docker 容器成为可能。Docker 操作方便,可以通过 Dockerfile 配置文件支持灵活的自动化创建和部署。
Docker 之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的。传统虚拟机需要有额外的虚拟机管理程序和虚拟机操作系统层,而 Docker 容器则是直接在操作系统层面之上实现的虚拟化。图 1.2 是 Docker 与传统虚拟机架构。
2.Docker 镜像
Docker(Docker)镜像除了是Docker的核心技术之外,也是应用发布的标准格式。个完整的Docker (Docker) 镜像可以支撑一个Docker (Docker)容器的运行,在DockerDocker)的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。
2.1Docker镜像结构
镜像不是一个单一的文件,而是有多层构成。可以通过 docker history 命令查看镜像中各层内容及大小,每层对应着 Dockerfile 中的一条指令。Docker 镜像默认存储在var/ib/docker/<storage-driver>目录中。容器其实是在镜像的最上面加了一层读写层, 在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器层。
Docker 镜像是分层的,下面这些知识点非常重要。
(1) Dockerfile 中的每个指令都会创建一个新的镜像层;
(2) 镜像层将被缓存和复用:
- 当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
(4) 某一层的镜像缓存失效,它之后的镜像层缓存都会失效:
(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。
2.2Dockerfile介绍
Dockerfile是Docker的程序解释脚本,dockerfile由多条命令组成每条指令对应Linux 下面的一条命令。Docker 程序将这些Dockerfile 指令翻译成真正的Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的镜像。相比镜像这种黑盒子Dockerfile 这种显而易见的脚本更容易被使用者接受,它明确的表明镜像是怎么产生的。有了Dockerfile,当有定制额外的需求时,只需在 Dockerfile 上添加或者修改指令, 重新生成镜像。
2.2.1 镜像
镜像是创建容器的基础,类似于虚拟机的快照,面向dcoker容器引擎的只读模板。
例如:一个镜像可以是完整的centos操作系统,称为Centos镜像;也可以是安装Mysql应用程序,称为MYSQL镜像。
2.2.2容器
容器是镜像创建的运行的实例,可以被启动,停止,和删除。每个容器都是相互隔离的,互不可见,Docker利用容器运行和隔离应用。
2.2.3 仓库
仓库用来集中保存镜像,创建镜像之后,可以使用push上传到共有仓库(Public)和私有仓库(private)。另外机器上使用镜像时,可以直接从仓库获取。
仓库注册服务器 (Registry) 是存放仓库的地方,其中包含了多个仓库。每个仓库集中存放某类镜像,并且使用不同的标签 (tag) 来区分它们。目前最大的公共仓库是 docker Hub,存放了数量庞大的镜像供用户下载使用。
3.实验部署
1.docker安装
使用ali仓库
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/sysconf/selinux
使用aliyun镜像站安装
step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
Step 4: 更新并安装Docker-CE
sudo yum makecache fast sudo yum -y install docker-ce
添加国内镜像站
mkdir /etc/docker/
/etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://cf-workers-docker-io-8jv.pages.dev"],
"insecure-registries":["192.168.10.106"]
}
开启Docker服务
systemctl restart docker
systemctl enable docker
docker version
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl -p (立即生效+检测语法)
2.Docker 镜像的制作
[root@localhost ~]# docker search lamp 搜索镜像
[root@localhost ~]# docker pull mattrayner/lamp 获取镜像
[root@localhost ~]# docker images 查看镜像
[root@localhost ~]# docker pull centos:7
[root@localhost ~]# docker pull hub.atomgit.com/amd64/nginx:1.25.2-perl
https://atomhub.openatom.cn (浏览器搜索国内网站镜像,amd-nginx)
更改镜像名称
[root@localhost ~]# docker tag hub.atomgit.com/amd64/nginx:1.25.2-perl nginx:v1.23
备注:
hub.atomgit.com/amd64/nginx:1.25.2-perl 旧名称:旧版本
nginx:v1.23 新名称:新版本
删除镜像
[root@localhost ~]# docker rmi nginx:v1.23
导出镜像
[root@localhost ~]# dockr save -o centos7 centos:7
centos7 导出镜像的文件名称
centos:7 镜像名称
导入镜像
[root@localhost ~]# docker load < centos7
创建容器
[root@localhost ~]# docker create -it centos:7
注意:
-i:让容器的输入保持打开状态
-t:让Docker分配一个伪终端
-d:以守护进程的方式运行该容器
[root@localhost ~]# docker start d3 启动 d3是ID号
容器导出
[root@localhost ~]# docker export 6a > centos001
容器导入生成镜像
[root@localhost ~]# docker import centos001 centos02:test
备注:
centos001 容器名称
centos02:test 镜像名称:标签
3.端口映射
(1)随机映射端口
[root@consul ~]# docker run -d -P httpd
-d 守护进程
[root@consul ~]# docker ps -a
(2)指定映射端口
[root@consul ~]# docker run -d -p 49280:80 httpd
[root@ consul ~]# docker ps -a
备注:
49280:是映射到外部的端口,这个端口范围通常是从32768到61000
80:是容器的端口
4.容器互联
(1)创建源容器
[root@consul ~]# docker run -dit --name web01 centos:7
(2)创建接收容器
[root@consul ~]# docker run -dit --name web02 --link web01:web01 centos:7
备注:
--link web1:web1
冒号前的web1,是第一个需要链接的容器的名字
冒号后的web1,是链接到第二个容器后,为第一个容器起的别名
(3)测试容器互联
[root@consul ~]# docker exec -it web02 /bin/bash
[root@71591dd4a58e /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 web01 36411a49ce54
172.17.0.3 71591dd4a58e
[root@71591dd4a58e /]# ping web01
5.docker的数据管理
(1)创建数据卷
[root@localhost ~]# docker run -dit -v /data1 -v /data2 --name web03 centos:7
[root@localhost ~]# docker exec -it web03 /bin/bash
[root@9a398d3ec1f3 /]# cd /data1
[root@9a398d3ec1f3 data1]# cd /data2
(2)数据卷容器
[root@localhost ~]# docker run -dit --volumes-from web03 --name db1 centos:7 /bin/bash
(3)挂载主机目录作为数据卷
案例1
[root@localhost ~]# docker run -dit -p 8080:80 -v /data1:/usr/local/apache2/htdocs --name web04 httpd
[root@localhost ~]# echo "ni hao">/data1/index.html
[root@localhost ~]# curl 192.168.10.101:8080
案例2
[root@localhost ~]# mkdir -p /www/{conf,html}
将编辑好的nginx配置文件拷贝到/www/conf
将网站代码拷贝到/www/html
[root@localhost ~]# docker run -dit -p 9090:80 -v /www/conf/nginx.conf:/etc/nginx/nginx.conf -v /www/html:/www/html --name web05 nginx /bin/bash -c "nginx"
[root@localhost conf]# docker run -d -p 9090:80 -v /www/conf/default.conf:/etc/nginx/conf.d/default.conf -v /www/html:/usr/share/nginx/html -v/www/nginx/log:/var/log/nginx --name web05 nginx