1.概念
1.Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
1.Docker允许开发中将应用,依赖,函数库,配置一起打包,形成可移植镜像
2.Docker应用运行在容器中,使用沙箱机制,相互隔离
2.Docker如何解决开发,测试,生产环境有差异的问题
1.Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行。系统函数库可以绕过应用系统,直接操作Linux内核,所以不受操作系统的限制。
3.Docker与虚拟机
虚拟机:虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在windows系统中运行Ubuntu系统,这样就可以运行任意的Ubuntu应用了
差别:
1.docker是一个系统进程,虚拟机是在操作系统中的操作系统
2.docker体积小,启动速度快,性能好。虚拟机体积大,启动速度慢,性能一般。
4.镜像和容器
镜像(image):Docker将应用程序及其所需的依赖,函数库,环境,配置等文件打包在一起,称为镜像。镜像是只读的,不可改变。一个镜像可以运行多个容器。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
DockerHub:DockerHub是一个Docker镜像的托管平台,这样的平台称为Docker Registry。
Docker架构:Docker是一个CS架构的程序,由两部分组成:
服务端(server):Docker守护进程,负责处理Docker指令,管理镜像,容器等。
客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。
2.Docker安装
1.卸载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
2.安装yum工具
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2 --skip-broken
3.更新本地镜像源
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
3.安装docker
yum install -y docker-ce
4.启动docker
启动前必须关闭防火墙
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
5.配置镜像加速器
3.docker基本操作
1.镜像相关命令
镜像名称一般分为两部分: [repository]:[tag] 如: mysql:5.7 在没有指定tag时,默认是latest,最新版本
docker build: 构建镜像
docker pull: 从远程拉取镜像
docker images: 查看镜像
docker rmi: 删除镜像
docker rmi nginx:latest
docker push: 推送镜像到服务
docker save: 保存镜像为一个压缩包
docker save -o nginx.tar nginx:latest
docker load: 加载压缩包为镜像
docker load -i nginx.tar
2.容器相关命令
docker run:运行容器
docker run --name nginx_hzj -p 80:80 -d nginx
# -d 后台运行
# 左侧端口为宿主机端口,右侧为容器
# 运行成功后返回容器ID
docker pause: 暂停容器运行
docker unpause: 暂停恢复运行
docker stop: 停止容器
docker stop nginx_hzj
docker start: 停止恢复运行
docker start nginx_hzj
docker exec: 进入容器执行命令
docker exec -it nginx_hzj bash
docker logs:查看容器运行日志 添加-f 可以持续查看日志
docker ps: 查看所有运行的容器及状态
docker ps -a
docker rm: 删除指定容器
docker rm -f nginx_hzj
# -f 强制删除运行中的容器
3.数据卷(volume)
数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录。把宿主机上真是存在的文件映射到容器中,实现数据解耦。就像快捷方式一样。
docker volume create: 创建一个volume
docker volume create html
docker volume inspect: 显示一个或多个volume的信息
docker volume inspect html
docker volume ls: 列出所有的volume
docker volume pruse: 删除未使用的volume
docker volume rm:删除一个或多个指定的volume
4.挂载数据卷
创建容器时,通过-v参数来挂载一个数据集到某个容器目录,数据集不存在时会自动创建
docker run --name nginx_volume -p 80:80 -v html:/usr/share/nginx/html -d nginx
5.Dockerfile自定义镜像
1.镜像结构
镜像是将应用程序及其需要的系统函数库,环境,配置依赖打包而成。
基础镜像(BaseImage):应用依赖的系统函数库,环境,配置,文件等。
层(Layer):在BaseImage基础上添加安装包,依赖,配置等,每次操作都形成新的一层。
入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数。
2.什么是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 | 镜像中应用的启动命令,容器运行时调用 | EXTRYPOINT java -jar xx.jar |
# 在dockerfile文件的目录下执行命令 . 代表当前目录
docker build -t javaweb:1.0 .
docker run --name web_hzj -p 8090:8090 -d javaweb:1.0
4.DockerCompose
1.什么是DockerCompose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
version: "3.2" # 脚本版本号
services:
nacos: # 容器名称,自己起, --name
image: nacos/nacos-server # 镜像
environment: # 环境变量
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes: # 挂卷
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice: # 临时构建容器
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
2.Centos7安装DockerCompose
1.下载
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2.修改文件权限
chmod +x docker-compose
3.Base自动补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
如果报错,执行下方命令
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
3.执行DockerCompose文件
compose文件与微服务包上传至服务器
docker-compose up -d
重启指定微服务
docker-compose restart gateway userservice orderservice
5.Docker镜像仓库
1.常见镜像仓库服务
公共仓库:如Docker官方的Docker Hub,国内的网易云,阿里云等
私有仓库:本地搭建
2.私有仓库搭建
1.简化版镜像仓库
Docker官方的 Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。命令如下:
docker run -d \
--restart=always \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
registry
2.带有图形化界面版本
该版本为私人提供,非官方,所以使用DockerCompose部署带有图像界面的DockerRegistry,先进行第3步配置信任,命令如下:
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
结果如下
3.配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:ip地址填自己的
"insecure-registries":["http://192.168.1.52:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
4.在私有镜像仓库推送或拉取镜像
推送镜像到私有镜像服务必须先tag
1.重新tag本地镜像,名称前缀为私有仓库的地址: 192.168.1.52:8080/
docker tag nginx:latest 192.168.1.52:8080/nginx:1.0
2.推送镜像
docker push 192.168.1.52:8080/nginx:1.0
3.拉取镜像
docker pull 192.168.1.52:8080/nginx:1.0