1.什么是Docker
我们在部署大型项目的时候,肯定会遇到这种问题,大学项目组件较多,运行环境复杂,部署时会碰到一些问题:例如node、redis、mysql等这些应用都有自己的依赖和函数库。这种复杂的依赖关系很容易出现兼容问题。开发、测试、生产环境如果有差异还会遇到其他问题。为了解决依赖兼容和运行环境不一致的问题,Docker就诞生了。
Docker是如何解决依赖的兼容问题的?
依赖混乱的解决:
将应用的函数库、依赖、配置与应用一起打包,形成可移植镜像
Docker应用运行在容器中,使用沙箱机制,相互隔离。
跨系统的解决:
首先我们需要先了解这些:对于不同的Linux系统,只是上层的应用不同,内核都是Linux,内核是用来操作计算机硬件的。上层应用操作是将内核的命令集合封装起开作为一个函数,多个函数形成一个函数库,通过函数来操作计算机硬件,因为不同的Linux系统(例如:ubuntu、centOS),他们的函数名字不同,自然会产生跨系统报错问题
Docker的解决方案就是将用户程序与所需要调用的系统(比如ubuntu)函数库一起打包,因此可以在任意Linux系统上运行。
简化来说:Docker是一个快速交付应用、运行应用的技术。可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统。运行时利用沙箱机制形成隔离容器,各个应用互不干扰。启动、移除都可以通过一行命令完成,方便快捷。
2.Docker与虚拟机
虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在Windows系统里面运行Ubuntu系统,这样就可以任意运行Ubuntu应用了。 Hypervisor的作用是用来模拟硬件的信息。
Docker与虚拟机的区别
Docker的硬盘占用较小(一般为Mb)、启动较快。是一个系统进程。
虚拟机的硬盘占用较大(一般为Gb)、启动较慢。是在操作系统中的操作系统。
3.Docker的架构
Docker是一个CS架构的程序,由两部分组成:
服务器(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
客户端(client):通过命令或者RestAPI向Docker服务端发送指令,可以在本地或者远程服务器端发送指令。
客户端可以通过docker build命令构建镜像,命令到达DockerServer后会被docker daemon 守护进程接收和处理,根据client提供的数据构建一个镜像。
通过docker pull命令可以拉取镜像,命令到达DockerServer后会通过docker daemon守护进程去Registry里面拉取指定镜像。
通过docker run 命令创建容器,命令到达DockerServer后会通过docker daemon守护进程去创建容器。
4.安装Docker
1.卸载旧的版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
这说明之前没有安装过docker。
2.安装yum-utils工具
sudo yum install -y yum-utils
3.设置镜像仓库
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum
yum makecache fast
5.安装docker社区版
sudo yum install docker-ce docker-ce-cli containerd.io
6.启动docker
#关闭防火墙
systemctl stop firewalld
#禁止开机启动防火墙
systemctl disable firewalld
#启动docker
sudo systemctl start docker
#查看docker状态
sudo systemctl start docker
6.配置镜像
由于docker官方镜像仓库网速较差,我们需要设置国内镜像:
#设置中科大镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
5.Docker基本操作
镜像操作
镜像名称一般分为两部分组成:[repository]:[tag] tag指的是版本,如果没有写版本就是最新版本。
对于镜像的操作无非就是crud:
docker build :构建镜像
docker pull :拉取镜像
docker image:查看镜像
docker rmi :删除镜像
docker push :推送镜像到服务端
docker save :保存镜像为一个压缩包(可以通过U盘copy)
docker save -o nginx.tar nginx:latest
nginx.tar为保存的压缩包的名字,后面跟的是镜像的名字和tag
docker load :可以加载压缩包为镜像
容器操作
docker run :创建容器并运行
命令解读:
docker run:创建并运行一个容器
--name:给容器起一个唯一的名字
-p:将宿主机端口与容器端口映射,冒号左侧是主机端口,右侧是容器端口
因为容器具有隔离性,客户不能直接访问,所以需要映射到宿主的端口,这样的话客户就可以访问。
-d:后台运行容器
docker pause:将运行的容器暂停
docker unpause:将暂停的容器启动
docker stop:将运行的容器停止
docker start:将停止的容器启动
暂停是将进程挂起,内存保留
停止是将进程杀死,内存删除
docker ps 查看所有运行的容器及状态
-a :参数可以查看所有容器,容器如果stop的话docker ps查看不了,加个-a参数就行
docker logs 查看容器运行日志
docker exec :进入容器执行命令
docker exec -it name bash
docker rm :删除指定容器
-f:docker rm 不能移除正在运行的命令,但是通过-f参数可以删除
数据卷(容器数据管理)
因为docker所有文件和数据都和容器耦合在一起:
不便于修改:
当我们要修改Nginx的html内容时,要进入容器内部修改,很放不方便
数据不可复用:
在容器内的修改对外是不可见的,所有修改对新创建的容器都是不可复用的,而且如果修改过多,时间久了你也不知道修改了什么。
升级维护困难:
数据在容器内,如果要升级容器,必然要删除旧的容器,所有的数据也跟着删除了
为了解决上面三个问题,就有了我们的数据卷,数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。Docker主机会管理很多个数据卷,每一个数据卷都会对于,宿主机/var/lib/docker/volumes/的真实的文件目录
拿nginx举例,nginx的静态资源都会放在/usr/share/nginx/html,配置文件会放在/etc/nginx/confg。我们可以让容器内部的这两个文件与数据卷关联。如果修改任何一方,另一方也会同步更新。 数据卷的这种关联特性,可以解决前两个问题,如果需要升级,只需要挂载之前的数据卷就可以了。第三个问题也迎刃而解。
操作数据卷
数据卷操作基本语法如下:
docker volume [COMMAND]
docker volume 命令是数据卷操作,根据命令后跟随的command来确定下一步操作:
create:创建一个volume
inspect:显示一个或多个volume的信息
ls:列出所有的volume
prune:删除未使用的volume
rm:删除一个或多个指定的volume
挂载数据卷
我们在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器目录
docker run --name nginx -p 80:80 -v html:/usr/share/nginx/html -d nginx
通过这个命令我们可以看到nginx的默认页面已经关联到我们宿主机具体的文件夹里面了。如果挂载的数据卷如htlm不存在,会自动创建!
6.Dockerfile自定义镜像
镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。
镜像是一个分层结构,每一层称为一个Layer:
BaseImage层:包含基本系统函数库、环境变量、文件系统
Entrypoint:入口,镜像中应用启动的命令
其他:在BaseImage基础上添加依赖、安装程序,完成整个应用的安装和配置
Dockerfile语法
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建,每一个指令都会形成一层Layer
Dockerfile的常见命令
7.DockerCompose
什么是DockerCompose
Docker Compose可以基于Compose文件帮我们快速部署分布式应用,而无需手动一个个创建和运行容器,DockerCompose的作用是帮我们快速部署分布式应用,无需一个一个微服务去构建镜像和部署
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。语法格式如下:
其实就是将docker run 命令的参数转换成指令
安装DockerCompose
直接在release中下载对应的linux发行版【docker-compose-linux-x86_64】
https://github.com/docker/compose/releases/tag/v2.18.1
下载完后将软件上传至 Linux的【/usr/local/bin】目录下然后重命名:
sudo mv docker-compose-linux-x86_64 docker-compose
授予权限:
sudo chmod +x /usr/local/bin/docker-compose
然后就完事了
卸载
rm /usr/local/bin/docker-compose
docker-compose --version #如果不出现版本信息,则表示卸载成功
常用命令:
# 前台启动, 启动项目中的所有服务。
docker-compose up
# 后台启动, 启动所有服务并在后台运行。
docker-compose up -d
# 停止所有服务。
docker-compose stop
restart
docker-compose restart重启服务容器。
docker-compose restart # 重启工程中所有服务的容器
docker-compose restart nginx # 重启工程中指定服务的容器
start
docker-compose start启动服务容器。
docker-compose start # 启动工程中所有服务的容器
docker-compose start nginx # 启动工程中指定服务的容器
stop
docker-compose stop停止服务容器。
docker-compose stop # 停止工程中所有服务的容器
docker-compose stop nginx # 停止工程中指定服务的容器
# 删除服务容器(容器)
docker-compose down
# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
8.Docker镜像仓库
镜像仓库有公有和私有两种形式:
公共仓库:例如Docker Hub,网易云镜像服务、DaoCloud镜像服务、阿里云镜像服务等。
除了使用公开仓库外,用户还可以本地搭建私有Docker Registry。企业自己的镜像最好采用私有Registry来实现。从而达到保护商业机密的目的
私有镜像仓库的搭建
配置Docker信任地址
vi /etc/docker/daemon.json
添加属性 insecure-registries(192.168.137.1这是我自己电脑的ipv4地址)如果有多个属性记得加”,“
"insecure-registries":["http://192.168.137.1:8080"]
重加载
systemctl daemon-reload
重启docker
然后导入我们写的compose文件:
📎docker-compose.yml
然后运行
docker-compose up -d
输入http://192.168.10.8:8080/查看,启动成功
这样我们的私有镜像仓库就搭建完毕了
在私有镜像仓库里拉取或推送镜像
打包:
docker tag nginx:latest 192.168.10.8:8080/my-nginx:1.0
上传:
拉取: