一、Docker的开始
(一)项目部署问题:
- 依赖关系复杂,容易出现兼容性问题
- 开发、测试、生产环境有差异
(二)Docker如何解决问题?
1、依赖兼容问题
- (1)将应用的Libs(函数库)、Deps(依赖)、配置与应用一起打包
- (2)将每个应用放到隔离容器运行,避免相互干扰
2、系统环境问题
- (1)将用户程序与所需要调用的系统函数库共同打包。
- (2)Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行。
(三)Docker与虚拟机
1、应用部署实现原理差异
- Docker通过容器隔离应用并通过Linux内核运行应用,可以任意迁移操作系统。
- 虚拟机通过Hypervisor技术,模拟出计算机硬件,再安装任意适合的环境与应用。(性能较差)
2、Docker与虚拟机性能差异
特性 | Docker | 虚拟机 |
---|---|---|
性能 | 接近原生 | 性能较差 |
硬盘占用 | 一般为 MB | 一般为 GB |
启动 | 秒级 | 分钟级 |
(四)镜像和容器
1、镜像与容器的概念
- 镜像(Image): Docker将应用程序及其依赖、函数库、环境、配置等文件打包在一起,成为镜像。
- 容器(Container): 镜像中的应用程序运行后形成的进程就是容器,只是Docker对容器做隔离,对外不可见。
2、Docker和DockerHub
- DockerHub: DockerHub是一个Docker镜像托管平台(跟github一样)。这样的平台称为Docker Registy(Docker 服务器)。 官方地址:
(五)Docker架构
Docker是一个CS架构程序,由两部分组成:
- 服务端(server): Docker Daemon守护进程,负责处理Docker指令,管理镜像、容器等。
- 客户端(client):通过命令(本地)或RestAPI(远程)向Docker服务端发送指令。
Client常用命令
命令 | 作用 |
---|---|
docker build | 为client指定的服务做一个镜像 |
docker pull | 从DockerHub官方库拉取需要的镜像 |
docker run | 启动镜像 |
二、Docker的基础操作
(一)Docker的安装
1、了解Docker版本的不同
Docker分为 CE 和 EE 两大版本。CE 即社区版(免费,支持7个月),EE 即企业版(强调安全,付费使用,支持周期 24 个月)
2、官方关于安装Linux版Docker的说明
- 要求: Docker CE 支持 64 位版本CentOS 7,并且要求内核版本不低于 3.10,CentOS 7 恰好满足这个要求。
- 官方地址: https://docs.docker.com/desktop/install/linux-install/
3、在CentOS 7 中安装 Docker
新装CentOS系统的朋友们,注意先检查网络畅通状态。
(1)查看网络适配器的VMware Network,看到启用状态就没问题。
(2)查看VMware的客户端的网络连接状态
(3)查看VMware服务,主要是NAT服务,它是虚拟机与主机IP共享的服务,要开起来。
(4)VMware默认不开启网卡服务,所以我们要到/etc/sysconfig/network-scripts/ifcfg-ens33,把ONBOOT=yes
(5)重启网络服务
service network restart
(6)安装Docker
① 卸载旧版Docker(如果安装过Docker,避免版本冲突)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce
② 安装yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken
③ 设置本地镜像源
查看阿里云官方的docker镜像设置:阿里云官方镜像地址
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
sudo yum -y install docker-ce
sudo service docker start
④ 配置镜像加速器
官方地址:Docker镜像加速器
#创建文件夹
sudo mkdir -p /etc/docker
#创建并写入阿里云镜像地址地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://zv9ol6pc.mirror.aliyuncs.com"]
}
EOF
#重新加载文件
sudo systemctl daemon-reload
#重启docker服务
sudo systemctl restart docker
(二)镜像操作
1、镜像名称: [respository]:[tag] (例如mysql:8.0,当tag没有指定时,默认是latest,代表最新版本镜像)
2、镜像操作:
操作 | 说明 |
---|---|
docker build | 构建镜像 |
docker pull | 拉取镜像 |
docker push | 推送镜像 |
docker images | 查看docker里的镜像列表 |
docker rmi | 删除某个镜像 |
docker save | 压缩某个镜像 |
docker load | 加载某个镜像 |
3、拉取最新版本Nginx镜像操作
docker pull nginx
4、压缩一个镜像操作
docker save -o nginx.tar nginx:latest
5、删除已有的镜像
docker rmi nginx:latest
6、加载镜像
docker load nginx.tar
(三)容器操作
操作 | 说明 |
---|---|
docker run | 运行docker容器 |
docker pause | 暂停运行 |
docker unpause | 解除暂停,开始运行 |
docker stop | 停止运行 |
docker start | 开始运行 |
docker rm | 删除容器 |
dcoker exec | 进入容器执行命令 |
docker logs | 查看运行日志 |
docker ps | 查看所有运行的容器及状态 |
容器操作实例
(1)运行一个Nginx容器
# docker run => 创建并运行一个容器
# --name => 给容器命名
# -p => 将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
# -d => 后台运行容器
# nginx => Nginx镜像
docker run --name containerName -p 80:80 -d nginx
启动nginx容器后,可以在浏览器访问 虚拟机ip:80
(2)查看nginx 运行日志
docker logs [-f] 容器名
(3)进入容器执行命令
# docker exec:进入容器内部,执行一个命令
# -it:给当前进入的容器创建一个IO终端,允许与容器交互
# bash:进入容器后执行的命令,bash是linux的交互命令
docker exec -it 容器名 bash
修改nginx首页内容
#先找到nginx的index文件位置
cd /usr/share/nginx/html
#修改index.html文件,退出并保存
# sed -i : 编辑命令
# ' ' :表示修改的内容
# s# xxx #g:表示开头与结尾
# Welcome to ngnix#Nginx容器已启动!:左侧为原内容,右侧为替换内容
# index.html:表示修改文件
sed -i 's#Welcome to nginx!#Nginx容器已启动!#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8">#g' index.html
重新访问浏览器
(4)停止docker容器
docker stop 容器名
(5)重启docker容器
docker start 容器名
(6)删除docker
docker rm 容器名
(四)数据卷操作(文件操作)
由于容器与数据高度耦合,有着不便于修改,数据不可复用,升级维护困难的问题。
1、数据卷是什么?
数据卷(volume),是一个虚拟目录,指向宿主机文件系统中的某个目录。
2、操作数据卷
docker volume [COMMAND]
Commond列表
- create:创建一个volume
- inspect:显示volume的信息
- ls:列出所有volume
- prune:删除未使用的volume
- rm:删除volume
3、示例
需求: 创建一个数据卷,并查看数据卷在宿主机的目录位置
#创建名为 nginxHTML 的数据卷
docker volume create nginxHTML
#查看已有的数据卷
docker volume ls
#查看nginxHTML数据卷存储位置
docker volume inspect nginxHTML
4、数据卷映射容器文件(也称挂载)
通常是在创建容器时挂载数据卷
#docker run:创建并启动容器
#--name:nginxContain:命名容器
#-v nginxHTML:/root/html:将容器中的 /root/html/ 目录与 nginxHTML数据卷映射
#-p 8080:80:宿主机8080端口映射到容器的80端口
#-d nginx:镜像名称
docker run --name nginxContain -v nginxHTML:/usr/share/nginx/html -p 8080:80 -d nginx
查看数据卷位置
docker inspect nginxHTML
命令执行
[
{
"CreatedAt": "2023-07-20T06:27:45-07:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginxHTML/_data", #在这里
"Name": "nginxHTML",
"Options": null,
"Scope": "local"
}
]
修改数据卷的内容,查看是否能影响到容器
vim /var/lib/docker/volumes/nginxHTML/_data/index.html
访问浏览器的ip:8080
三、Dockerfile自定义镜像
(一)镜像结构
镜像是一种分层结构,每一层称为一个 Layer
- BaseImage层:包含基本的系统函数库、环境变量、文件系统
- 其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
- Entrypoint:入口,是镜像中应用启动的命令
(二)Dockerfile 语法
1、DockerFile的概念
Dockerfile是一个文本文件,其中包含一个个指令(Instruction),用指令说明要执行的操作构建镜像。每一个指令都会形成一层Layer。
指令表
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量 | ENV key value |
COPY | 拷贝本地文件都镜像的指定目录 | COPY ./mysql-5.7.rpm /tmp |
RUN | 指定Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定监听端口 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
可参考官方文档:https://docs.docker.com/engine/reference/builder
(三)构建Java项目
Dockerfile
#指定基础镜像
FROM centos:7.0
#配置环境变量——JDK安装目录
ENV JAVA_DIR= /usr/local
#拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
#安装jdk
RUN cd $JAVA_DIR && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_144 ./java8
#配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
#暴露接口
EXPOSE 8090
#入口,java项目启动命令
ENTRYPOINT java -jar /tmp/app.jar
使用docker build 构建一个镜像
#docker build :创建镜像
# -t :镜像
# javaweb:1.0 :镜像名为javaweb,版本号为1.0
# . : 表示镜像存储在docker所在目录
docker build -t javaweb:1.0 .
运行javaweb:1.0 镜像
docker run --name web -p 8090:8090 -d javaweb:1.0
(四)简化镜像构建
1、提取公共部分的镜像内容制作成镜像。
2、引用公共镜像
FROM 公共镜像:TAG
四、集群部署Docker-Compose
(一)什么是DockerCompose?
-
Docker Compose:基于Compose 文件快速部署分布式应用。
-
Compose文件:是一个文本文件,通过指令定义集群的每个容器的运行。
version: "3.8"
services:
#mysql配置
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- /tmp/mysql/data:/var/lib/mysql
- /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf
#javaweb配置
web:
build: .
ports:
- 8090: 8090
参考官方文档:https://docs.docker.com/compose/compose-file/
(二)安装docker-compose
#安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.29.1/docker-compose-`uname -s `-`uname -m` > /usr/local/bin/docker-compose
#修改文件权限
chmod +x /usr/local/bin/docker-compose
#Base自动补全命令
curl -L https://raw.githubsercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
##如果出现错误,则需要修改自己的hosts文件
# echo "199.232.68.133 raw.githubsercontent.com" >> /etc/hosts
五、Docker镜像库
(一)Docker镜像库分为两种:
- 公用库——DockerHub
- 私用库——阿里云镜像库,网易镜像库…
(二)如何搭建自己的镜像库
Docker官方的Docker Registry是一个基础Docker镜像库,具备仓库管理的完整功能,但没有IU界面。
方法一:搭建简易版镜像库
通过以下命令:
docker run -d --restart=always --name registry -p 5000:5000 -v registry -data:/var/lib/registry -d registry
通过访问 http://虚拟机IP:5000/v2/catalog 查看镜像。
方法二:UI版镜像库
它使用的是DockerCompose部署带有界面的DockerRegistry,命令如下
DockerCompose文件
version: '3.0'
services:
registry:
image: registry
volumes:
- ./registry-data:/var/lib/registry
ui:
image: joxit/docker-registry-ui:static
ports:
- 8080:80
environment:
- REGISTRY_TITLE=私有仓库名
- REGISTRY_URL=http://registry:5000
depends_on:
- registry
配置Docker信任地址
#打开文件
vi /etc/docker/daemon.json
#添加内容
"insecure-registries":["http://虚拟机IP:8080"]
#加载
systemctl daemon-reload
#重启docker
systemctl docker
(三)推送自己的镜像到私有仓库
1、重命名本地镜像
docker tag nginx:latest 私有仓库访问地址/nginx:1.0
2、推送镜像
docker push 私有仓库访问地址/nginx:1.0
3、拉取镜像
docker pull 私有仓库访问地址/nginx:1.0