1. Docker概述
1.1 云计算框架结构
- OpenStack生态圈
- k8s生态圈
1.2 docker概述
1.2.1 Docker是什么?
- 是一种轻量级的“虚拟机”
- 在Linux容器里运行应用的开源工具
1.2.2 Docker与虚拟机的区别
Docker | 虚拟机 | |
---|---|---|
资源 | 少 | 多 |
启动时间 | 短 秒 | 长 几分钟 |
安全 | 共享内核,不安全 | 系统逻辑隔离,安全 |
服务 | 一个容器只跑一个服务 | 虚拟机可以运行多个服务 |
容器不依赖系统,依赖引擎
1.2.3 Docker的使用场景
- 打包应用程序简化部署
- 可脱离底层硬件任意迁移
- 例:服务器从腾讯云迁移到阿里云
1.3 Docker的核心概念及安装方式
1.3.1 Docker核心概念
- 镜像
- 一个面向Docker容器引擎的只读模板
- 容器
- 从镜像创建的运行实例
- 仓库
- 集中保存镜像的地方
1.3.2 CentOS安装Docker的两种方式
- 使用CURL获得Docker的安装脚本进行安装
- 使用YUM仓库来安装Docker
2.安装Docker
2.1 安装最新版本Docker依赖版本环境
yum install -y yum-utils device-mapper-persistent-data lvm2 #Lvm2提供存储
yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # docker-ce社区板 免费的
2.2 安装Docker并设置为开机自动启动
yum install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
2.3 检查Docker版本查看Docker服务
docker version
3.Docker镜像创建与操作
3.1 docker镜像操作
3.1.1 搜索镜像
docker search关键字
3.1.2 获取镜像
docker pull 仓库名称[:标签]
3.1.3 查看镜像
docker images 仓库名称[:标签]
docker inspect 镜像ID号
3.1.4 添加新标签
docket tag名称[:标签]新名称[:新标签]
3.1.5 删除镜像
docker rmi仓库名称[:标签]
或
docker rmi镜像ID号
3.1.6 存出镜像
docker save o存出文件名 存出的镜像
3.1.7 载入镜像
docker load --input存出文件名
或
docker load <存出文件名
3.1.8 上传镜像
docker push仓库名称[:标签]
3.2 Docker容器操作
3.2.1 创建容器
docker create [选项]镜像运行的程序
- -i 让容器的标准输入保持打开
- -t让Docker分配一个伪终端
3.2.2 查看容器运行状态
docker ps [选项]
- -a列出所有的容器,包括末运行的容器
3.2.3 启动容器
docker start 容器的ID/名称
3.2.4 创建容器并启动执行shell命令
docker run选项镜像运行的程序执行的命令
- -d在后台进行运行
3.2.5 终止容器
docker stop容器的ID/名称
3.2.6 进入容器
docker exec [选项]容器的ID/名称/bin/bash
3.2.7 导出容器
docker export容器的ID/名称>文件名
3.2.8 导入容器
cat文件名| docker import -生成的镜像名称:标签
3.2.9 删除容器
docker rm [选项]容器的ID/名称
4.Docker镜像
4.1 Docker镜像的分层
4.2 Docker镜像的创建
4.2.1 Docker镜像
- 应用发布的标准格式
- 支撑一个Docker容器的运行
4.3 Docker镜像的创建方法
4.3.1 基于已有镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项]容器ID/名称仓库名称:[标签]
- -m说明信息
- -a作者信息
- -p生成过程中停止容器的运行
4.3.2 基于本地模板创建
- 通过导入操作系统模板文件生成新的镜像
- 使用wget命令导入为本地镜像
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
- 导入成功后可查看本地镜像信息
docker images |grep new
4.3.3 基于Dockerfile创建
- Dockerfile是由一组指令组成的文件
- Dockerfile结构四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
- Dockerfile每行支持一条指令, 每条指令可携带多个参数,支持使用以““号开头的注释
4.4 Dockerfile操作指令
指令 | 含义 |
---|---|
FROM镜像 | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一一个镜像就需要一条FROM指令。 |
MAINTAINER名字 | 说明新镜像的维护人信息 |
RUN命令 | 在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD[“要运行的程序",”参数1 , “参数2“] | 指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行 |
EXPOSE端口号 | 指定新镜像加载到Docker时要开启的端口 |
ENV环境变量变量值 | 设置一个环境变量的值,会被后面的RUN使用 |
ADD源文件/目录目标文件/目录 | 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL |
COPY源文件/目录目标文件/目录 | 将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中 |
VOLUME[“目录"] | 在容器中创建一个挂载点 |
USER用户名/UID | 指定运行容器时的用户 |
WORKDIR路径 | 为后续的RUN、CMD、ENTRYPOINT指定工作目录 |
ONBUILD命令 | 指定所生成的镜像作为一个基础镜像时所要运行的命令 |
HEALTHCHECK | 健康检查 |
5. Docker数据管理
5.1 数据管理操作
- 方便查看容器内产生的数据
- 多容器间实现数据共享
5.2 两种管理方式
- 数据卷(容器和宿主之间的数据共享)
- 数据卷容器(容器和容器之间的数据共享)
5.2.1 数据卷
- 数据卷是一个提供容器使用的特殊目录
- 创建数据卷
docker run -d -v /data1 -v /data2 -name web
httpd:centos
- 挂载主机目录作为数据卷
docker run -d -v /var/www:/data -name web-1
httpd:centos
5.2.2 数据卷容器
6.实验
6.1 安装docker
实验步骤
1.先卸载原来版本的docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.需要的安装包
yum install -y yum-utils device-mapper-persistent-data lvm2
3.设置阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引
yum makecache fast
5.安装docker-CE,安装docker相关的 docker-ce社区 ee企业版
yum -y install docker-ce docker-ce-cli containerd.io
6.启动docker
systemctl start docker
7.设置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://sno1b9w3.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
8.使用docker version 查看是否安装成功
docker version
9.网络优化 开启路由功能
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
10.重启网络
service network restart
systemctl restart docker
11.拉取创建
docker run hello-world
12.查看一下下载的这个hello-world是否安装成功
docker images
13.卸载docker
卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
删除资源
rm -rf /var/lib/docker
6.2 docker的增删改查
AUFS(联合文件系统)若干层下载
/var/lib/docker docker的默认工作路径
/var/lib/docker/image/overlay2/repositories.json #下载文件信息
docker version #查看docker版本
docker search nginx #搜寻nginx镜像(公有仓库)
docker pull nginx #下载nginX镜像
docker images #查看下载镜像信息
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
docker inspect image id #获取镜像信息
docker inspect 7e4d58f0e5f3
docker inspect nginx:latest
docker inspect nginx:web
docker tag nginx:latest nginx:web #添加新标签
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
docker images | grep nginx
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
docker rmi ngix:web #删除带标签镜像 冒号分割名称和标签,
#删除容器不加i,删除镜像加i
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 7e4d58f0e5f3 9 days ago 133MB
nginx web 7e4d58f0e5f3 9 days ago 133MB
[root@localhost ~]# docker rmi 7e4d58f0e5f3
Error response from daemon: conflict: unable to delete 7e4d58f0e5f3 (must be forced) - image is referenced in multiple repositories
#当存在两个标签的时候,镜像是删除不掉的,应该先删除一个标签,在删除镜像
#如果一个镜像对应多个标签别名,则要删除多余的标签,然后才能删除镜像,直接删镜像会报错
docker save -o /opt/nginx nginx:latest #镜像导出,备份
docker load < /opt/nginx #导回备份文件
#容器的操作,容器是靠创建出来的
docker ps -a #查看容器列表
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 空的
docker create -it nginx:latest /bin/bash #创建容器
#-i 让容器的标准输入保持打开
#-t 让docker分配一个伪终端
7bcc52df64e2d4778a3bc2f536baffa2ba543da990209a08871d74fcee79ea51
docker ps -a #查看状态 创建状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bcc52df64e2 nginx:latest "/docker-entrypoint.…" 39 seconds ago Created beautiful_pascal
docker start 7bcc52df64e2 #启动容器
docker ps -a #up状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bcc52df64e2 nginx:latest "/docker-entrypoint.…" About a minute ago Up 21 seconds 80/tcp beautiful_pascal
#80端口为你不暴露端口,不是外部端口
ifconfig #创建容器时会自动创建一个网卡,作为所有容器的网关与外部通信,172.17.0.1为内部地址
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
#启动执行命令查看系统更目录
docker pull paigeeworld/centos7
docker create -it paigeeworld/centos7 /bin/bash
docker start e37b665e6baf
docker run centos:7 /bin/bash -c ls / #为centos:7镜像创建一个容器,载入容器后运行bash,指定操作,执行完成直接关闭,状态是Exited
docker images
centos 7 7e6257c9f8d8 5 weeks ago 203MB
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e37b665e6baf centos:7 "/bin/bash -c ls /" 43 minutes ago Exited (0) 43 minutes ago
docker run -d paigeeworld/centos7 /bin/bash -c "while true;do echo hello;done" #持续在后台执行
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba06cd3324fb centos:7 "/bin/bash -c 'while…" 3 seconds ago Up 2 seconds cool_tereshkova
docker stop ba06cd3324fb #终止运行
docker ps -a 显示nginx容器状态
docker start ba06cd3324fb
docker exec -it ba06cd3324fb /bin/bash 进入容器
docker export ba06cd3324fb > /opt/centos7 导出容器
cat /opt/centos7 | docker import -生成镜像的名称:标签
删除容器
docker rm ba06cd3324fb/名称
容器运行时不可被删除,可停止
有容器时,不能删除镜像
没有容器镜像可以删除
只要有容器在,就不能删除镜像,因为有进程被占用
docker镜像操作
搜索镜像 docker search 关键词
获取镜像 docker pull 仓库名称[:标签]
查看镜像 docker images 仓库名称[:标签]
docker inspect 镜像ID号
添加新标签 docker rmi 仓库名称[:标签] 或 docker rmi 镜像ID号
存出镜像 docker save -o 存出文件名 存出的镜像
载入镜像 docker load < 存出文件名
上传镜像 docker push 仓库名称[:标签]
docker容器操作
创建容器 docker create [选项]镜像运行的程序
-i 让容器的标准输入保持打开
-t 让docker分配一个伪终端
查看容器运行状态 docker ps [选项]
-a 列出所有的容器,包括未运行的容器
启动容器 docker start 容器的id/名称
创建容器并启动执行shell命令 docker run [选项]镜像运行的程序 执行的命令
-d 在后台进行运行
终止容器 docker stop 容器的ID/名称
进入容器 docker exec [选项]容器的ID/名称 /bin/bash
导出容器 docker export 容器的ID/名称 > 文件名
删除容器 docker rm [选项]容器的ID/名称
6.3 docker镜像的分层——镜像制作三种方式
6.3.1 基于已有镜像创建
将容器里面运行的程序及运行环境打包生成新的镜像
docker commit [选项] 容器的ID/名称 仓库名称:[标签]
-m 说明信息
-a 作者信息
-p 生成过程中停止容器的运行
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# docker create -it centos:7 /bin/bash
c74040a080d88c953f60f8e373cdacdaff8eee2218cd30fe9b531e749f5b25b1
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c74040a080d8 centos:7 "/bin/bash" 27 seconds ago Created cranky_fermi
[root@localhost ~]# docker start c74040a080d8
c74040a080d8
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c74040a080d8 centos:7 "/bin/bash" About a minute ago Up 4 seconds cranky_fermi
[root@localhost ~]# docker commit -m "new" -a "awei" c74040a080d8 awei:test #创建镜像
sha256:7839f4b842e9877482b1ad50daa5524bb670d4b7c362fe8f87b68ac40bf1aa27
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c74040a080d8 centos:7 "/bin/bash" 4 minutes ago Up 3 minutes cranky_fermi
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
awei test 7839f4b842e9 16 seconds ago 203MB
centos 7 7e6257c9f8d8 5 weeks ago 203MB
6.3.2 基于本地模板创建
通过导入操作系统模板文件生成新的镜像
使用wget命令导入为本地镜像
wget http://download.openvz.org/template/precreates/debian-7.0-x86-minimal.tar.gz
导入成功后可查看本地镜像信息
docker images |grep new
[root@localhost opt]# ls
debian-7.0-x86-minimal.tar.gz
[root@localhost opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - zhou:new #
sha256:c430cd15100e567b4dd77ff9e2c99a86470b7bc66b5efb3f15a9a2b6b8726947
[root@localhost opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhou new c430cd15100e 26 seconds ago 215MB
[root@localhost opt]# docker images | grep new
zhou new c430cd15100e 8 minutes ago 215MB
6.3.3 基于Dockerfile创建
Dockerfile是由一组指令组成的文件
Dockerfile结构四部分
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以#号开头的注释
[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/
[root@localhost apache]# vim Dockerfile
FROM centos:7
MAINTAINER ZHOUWEI
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
ADD index.html /var/www/html/index.html
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
[root@localhost apache]# vim index.html
<h1>this is ky03 web</h1>
[root@localhost apache]# vim run.sh
#!/bin/bash ####一定要加环境
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND
[root@localhost apache]# ls
Dockerfile index.html run.sh
[root@promote apache]# docker build -t httpd:centos .
[root@promote apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd centos d243fc89687b 58 seconds ago 419MB
[root@localhost apache]# docker run -d -p 2000:80 httpd:centos
[root@localhost apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42e62bdd2672 httpd:centos "/run.sh" 5 seconds ago Up 4 seconds 0.0.0.0:2000->80/tcp stoic_easley
访问http://192.168.200.50:2000/
6.4 docker数据卷
docker pull centos
[root@localhost apache]# cd /var/www #宿主机一开始没有这个目录
-bash: cd: /var/www: 没有那个文件或目录
[root@localhost apache]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash #创建一个web1容器,宿主机的/var/www挂载容器中的data1,启用binbash环境
[root@3367c347298c /]# ls
anaconda-post.log data1 etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@3367c347298c /]# cd data1/
[root@3367c347298c data1]# ls
[root@3367c347298c data1]# touch abc.txt
[root@localhost ~]# cd /var/www/
[root@localhost www]# ls
abc.txt
[root@localhost www]# touch def.txt #在宿主机上创建文件能被容器识别,在容器上创建文件能被宿主机识别
[root@localhost www]# ls
abc.txt def.txt
[root@3367c347298c data1]# ls
abc.txt def.txt
6.5 docker数据卷容器
[root@localhost apache]# docker run --name web100 -v /data1 -v /data2 -it centos:7 /bin/bash #创建容器web100
[root@5ccd3561d2d9 /]# ls
anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var
bin data2 etc lib media opt root sbin sys usr
[root@localhost www]# docker run -it --volumes-from web100 --name web99 centos:7 /bin/bash #创建容器web99挂载到web10上
[root@0c76427f87a8 /]# ls
anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var
bin data2 etc lib media opt root sbin sys usr
[root@5ccd3561d2d9 /]# cd data1 #在容器上创建文件
[root@5ccd3561d2d9 data1]# touch 123
[root@5ccd3561d2d9 data1]# cd ..
[root@5ccd3561d2d9 /]# cd data2
[root@5ccd3561d2d9 data2]# touch 456
[root@0c76427f87a8 /]# cd data1 #另一个容器查看
[root@0c76427f87a8 data1]# ls
123
[root@0c76427f87a8 data1]# cd ..
[root@0c76427f87a8 /]# cd data2
[root@0c76427f87a8 data2]# ls
456
6.6 私有镜像仓库部署
[root@localhost apache]# docker pull registry
[root@localhost apache]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 2d4f4b5309b1 3 months ago 26.2MB #服务端口是5000端口
[root@localhost apache]# vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.200.50:5000"],
}
[root@localhost apache]# systemctl restart docker
[root@localhost apache]# systemctl status docker
Active: active (running) since 二 2020-09-22 12:23:47 CST; 40s ago
[root@localhost apache]# docker create -it registry /bin/bash
5c4ce2d275be76eb48ef889e6182c122c1fe2edf5d612468ec5e0e0afb7043e6
[root@localhost apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c4ce2d275be registry "/entrypoint.sh /bin…" 8 seconds ago Created pedantic_rubin
[root@localhost apache]# docker start 5c4ce2d275be
[root@localhost apache]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry
4bc797565c3e21a53fff72641844b19a72df064659ba48a7227c8cabc6ba3f83
[root@localhost apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bc797565c3e registry "/entrypoint.sh /etc…" 32 seconds ago Up 31 seconds 0.0.0.0:5000->5000/tcp kind_bardeen
[root@localhost apache]# docker pull nginx
[root@localhost apache]# docker tag nginx:latest 192.168.200.50:5000/nginx
[root@localhost apache]# docker images
192.168.200.50:5000/nginx latest 7e4d58f0e5f3 11 days ago 133MB
[root@localhost apache]# curl -XGET http://192.168.200.50:5000/v2/_catalog #获取私有仓库列表
{"repositories":[]}
[root@localhost apache]# docker push 192.168.200.50:5000/nginx #上传镜像
[root@localhost apache]# docker pull 192.168.200.50:5000/nginx #私有仓库下载镜像
[root@localhost apache]# docker run -d -P 192.168.200.50:5000/nginx
2c72b1ebfffe41fb8ce76dc5d624bd18f644b5ab5003fba7fb01eebca7ece94e
[root@localhost apache]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c72b1ebfffe 192.168.200.50:5000/nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:32768->80/tcp condescending_curran
6.7 容器间通信
docker run -itd -P --name web1 centos:7 /bin/bash
docker ps -a
docker run -itd -P --name web2 --link web1:web1 centos /bin/bash //创建并运行容器取名web2,链接到web1和其通信
进web2容器ping web1
[root@promote ~]# docker run -itd -P --name web11 centos:7
387f16eed583e882db28e93e1678dba617b250d3a74aed52488946d0c397c31a
[root@promote ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
387f16eed583 centos:7 "/bin/bash" 10 seconds ago Up 10 seconds web11
[root@promote ~]# docker run -itd -P --name web22 --link web11:web11 centos:7 /bin/bash
9b7cdc5441f5828dc072b1b47f4c1fcd31114d85c00709fe0afc823aa14dc85c
[root@promote ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
9b7cdc5441f5 centos:7 "/bin/bash" 11 seconds ago Up 11 seconds
[root@promote ~]# docker exec -it 9b7cdc5441f5 /bin/bash
[root@9b7cdc5441f5 /]# ping web11
PING web11 (172.17.0.2) 56(84) bytes of data.
64 bytes from web11 (172.17.0.2): icmp_seq=1 ttl=64 time=0.250 ms
64 bytes from web11 (172.17.0.2): icmp_seq=2 ttl=64 time=0.044 ms