1.初识docker
docker是一种容器技术,它解决容器环境迁移问题。
1.1安装docker
# 1、yum 包更新到最新
yum update
# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4、 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本,验证是否验证成功
docker -v
1.2镜像加速器
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
创建/etc/docker/daemon.json文件,添加如下内容:
{
"registry-mirrors": ["https://你的ID.mirror.aliyuncs.com"]
}
1.3docker架构
![docker架构](https://i-blog.csdnimg.cn/blog_migrate/fe4011b14106142d20e53fc30f7780b8.png)
- docker使用客户端-服务器端(C/S)架构模式,使用远程API来管理和创建docker容器。
- docker容器通过docker镜像来创建。
- 容器与镜像的关系类似于面向对象中的对象与类。
2.docker命令
2.1进程相关命令
- 启动docker服务
systemctl start docker
- 停止docker服务
systemctl stop docker
- 重启docker服务
systemctl restart docker
- 查看docker服务状态
systemctl status docker
- 设置开机启动docker服务
systemctl enable docker
2.2镜像相关命令
- 查看镜像
docker images
docker images -q //查看所有镜像id
- 搜索镜像
docker search 镜像名
- 拉取镜像
docker pull 镜像名/ 镜像名:版本
- 删除镜像
docker rmi 镜像id
docker rmi `docker images -q` //删除所有本地镜像
2.3容器相关命令
- 查看容器
docker ps //查看正在运行的容器
docker ps -a //查看所有容器
- 创建并启动容器
docker run 参数
参数说明:
-i:保持容器运行,通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容
器自动关闭。
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。
-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容
器不会关闭。
-it:创建的容器一般称为交互式容器。
-id:创建的容器一般称为守护式容器。
--name:为创建的容器命名。
注意:交互式容器,exit后容器会自动关闭,守护式容器会在后台执行。
- 进入容器
docker exec 参数 容器id/name
- 停止容器
docker stop 容器名称
- 启动容器
docker start 容器名称
- 删除容器
docker rm 容器名称
- 查看容器信息
docker inspect 容器名称
3.docker容器的数据卷
思考:
docker容器删除后,容器中产生的数据还在吗?
docker容器和外部机器可以直接交换文件吗?
容器之间怎么进行数据交互?
3.1数据卷概念
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
3.2数据卷作用
- 容器数据持久化
- 外部机器和容器间通信
- 容器之间数据交换
3.3配置数据卷
- 创建启动容器时,使用-v参数设置数据卷
docker run ... -v 宿主机目录/文件:容器内目录/文件
容器目录必须是绝对路径,如果目录不存在会自动创建,可以挂载多个数据卷。
3.3.1一个容器挂载多个数据卷
docker run -it --name=c \
-v ~/data1:/root/data1 \
-v ~/data2:/root/data2 \
centos:7
3.3.2多个容器挂载同一个数据卷
- 在一个容器中修改文件,另一个容器也会更新
docker run -it --name=c1 -v /root/data:/root/data_container centos:7
docker run -it --name=c2 -v /root/data:/root/data_container centos:7
3.4配置数据卷容器
- 创建启动数据卷容器
docker run -it --name=c3 -v /volume centos:7
- 创建启动容器,使用 --volumes-from 参数设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7
docker run -it --name=c2 --volumes-from c3 centos:7
4.docker应用部署
端口映射:
- 容器内的网络服务和外部机器不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上,外部机访问宿主机的端口,从而间接访问容器的服务。
docker部署应用
5.dockerfile
思考:
- docker 镜像本质是什么?
是一个分层文件系统
- docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其它镜像层。
- docker 中一个tomcat镜像为什么有600MB,而一个tomcat安装包只有70多MB?
由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小为600多MB。
5.1操作系统组成部分
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 文件管理子系统
- 网络通信子系统
- 作业控制子系统
5.2linux文件系统
linux文件系统由bootfs和rootfs两部分组成:
- bootfs:包含bootloader(引导加载程序)和 kernel(内核)
- rootfs:root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
- 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
![linux文件系统](https://i-blog.csdnimg.cn/blog_migrate/366d2a3f968a54f0bb00fdec5c5bf4c2.png)
5.3docker镜像原理
- docker镜像是由特殊的文件系统叠加而成;
- 最底层是bootfs,并使用宿主机的bootfs;
- 第二层是rootfs;
- 再往上可以叠加其它的镜像文件;
- 统一文件系统技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的
视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统;
- 一个镜像可以放在另一个镜像上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像;
- 当从一个镜像启动容器时,docker会在最顶层加载一个读写文件系统作为容器。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/975aa86913829dacf743f9eb6c53b96a.png)
6.镜像制作
6.1容器转镜像
- 容器转镜像
docker commit 容器id 镜像名称:版本号
- 压缩镜像
docker save -o 压缩文件名称 镜像名称:版本号
- 加载镜像
docker load -i 压缩文件名称
6.2dockerfile
- dockerfile是一个文本文件
- 包含了一条条的指令
- 每一条指令构建一层镜像,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过dockerfile文件构建一个新的镜像开始工作
- 对于运维人员:在部署时,可以实现应用的无缝移植
docker hub
![参数](https://i-blog.csdnimg.cn/blog_migrate/1526f82ef3da012c9d90c145bda1a52a.png)
6.2.1发布springboot项目
FROM java:8 //定义父镜像
MAINTAINER zhy <zhy@qq.com> //定义作者信息,可省略
ADD springboot.jar app.jar //将jar添加到容器,并重命名
CMD ["java","-jar","app.jar"] //定义容器启动执行的命令
通过dockerfile构建镜像 -f 文件路径,-t 镜像名称:版本 .(注意空格点,寻址)
docker build -f ./dockerfile文件 -t 指定镜像名称 . .
docker run -id -p 9000:8080 --name=指定容器名称 镜像名称
7.docker compose
docker compose是一个编排多容器分布式部署的工具,提供命令集中管理容器化应用的完整开发周期,包括服务
构建,启动和停止。使用步骤:
- 利用dockerfile定义运行环境镜像;
- 使用docker-compose.yml定义组成应用的各服务;
- 运行docker-compose up 启动应用;(down关闭)
7.1安装docker compose
安装docker compose
7.2 编排nginx+springboot
1.创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
2.编写docker-compose.yml文件
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
3.创建./nginx/conf.d目录,在该目录下编写app.conf文件
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080/hello;
}
}
4.在~/docker-compose目录下启动容器
docker-compose up
8.docker私有仓库
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉
取镜像 到本地,也可以把我们自己的镜像推送上去。但是,有时候我们不希望将自己的镜 像放到公网当中,
那么这时我们就需要搭建自己的私有仓库来存储和管理自己的镜像
8.1搭建私有仓库
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库搭建成功
# 4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["私有仓库服务器ip:5000"]}
{"insecure-registries":["192.168.220.12:5000"]}
# 5、重启docker 服务
systemctl restart docker
docker start registry
8.2将镜像上传到私有仓库
# 1、标记镜像为私有仓库的镜像
docker tag centos:7 192.168.220.12:5000/centos:7
# 2、上传标记的镜像
docker push 192.168.220.12:5000/centos:7
8.3从私有仓库拉取镜像
#拉取镜像
docker pull 192.168.220.12:5000/centos:7