@[TOC]
1Docker简介
- Docker是一个快速交付应用、运行应用的技术:
- Docker允许开发中将应用、依赖、函数库、配置一起
打包
,形成可移植镜像 - Docker应用运行在容器中,使用沙箱机制,相互
隔离
- Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此,可以在任意Linux操作系统上运行
- 启动、移除都可以通过一行命令完成,方便快捷
2 Docker与虚拟机的差异
- docker是一个系统进程,虚拟机是在操作系统中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
3 镜像和容器
- 镜像(Image):Docker将应用程序及其所需要的依赖、函数库、环境、配置等
文件
打包在一起,称为镜像
。即打包的文件就是镜像
。 - 容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。即
隔离的进程是容器
。4 DockerHub
DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。5 Docker基本操作
5.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 docker --help:查看docker命令 docker images --help:查看docker image命令的用法
5.2 容器常见命令
创建容器运行docker run :创建并运行一个容器 docker pause: 暂停(挂起)容器 docker unpause:运行容器 docker stop:停止容器 docker start:重新开始容器 docker ps:查看所有运行的容器及状态 docker ps -a :查看所有容器,包含运行与不运行的 docker logs:查看容器运行日志 docker logs -f containerName :-f -follow跟踪日志 docker exec:进入容器执行命令 docker rm: 删除指定容器 docker rm -f :强制删除容器
命令解读:docker run --name containerName -p 80:80 -d nginx
- docker run :创建并运行一个容器
- --name:给容器起一个名字
- -p:将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
进入容器内部:
命令解读:docker exec -it containerName bash
- docker exec:进入容器内部,执行一个命令
- -it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- containerName:要进入的容器名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
5.3 数据卷的基本操作
- 解决容器与数据耦合的问题,方便操作容器内数据,保证数据安全
- 数据卷(volume):是一个虚拟目录,指向宿主机文件系统中的某个目录。(/var/lib/docker/volumes/数据卷文件名),容器删除后,数据卷不删除。
数据卷操作的基本语法如下:
docker volume命令式数据卷操作,根据命令后跟随的command来确定下一步的操作:docker volume[COMMAND]
docker volume create :创建一个volume docker volume inspect :显示一个或多个volume的信息 docker volume ls :列出所有的volume docker volume prune :删除未使用的volume docker volume rm :删除一个或多个指定的volume
5.4 挂载数据卷
- 如果容器运行时volume不存在,会自动被创建出来
docker run\ # 创建并运行容器 --name containerName\ # 给容器起名 -v html:/usr/share/nginx/html\ # 把html数据卷挂载到容器内的/root/html这个目录中 -p 8080:80 # 把宿主机的8080端口映射到容器内的80端口 nginx:latest\ # 镜像名称
5.5 目录挂载
- -v[宿主机目录]:[容器内目录]
- -v[宿主机文件]:[容器内文件]
容器的配置目录:
容器的数据储存:docker run \ --name myMySql \ -e MYSQL_ROOT_PASSWORD=123456 \ -p 3306:3306 \ -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \ -v /tmp/mysql/data:/var/lib/mysql \ -d \ myslq:laster
6 Dockerfile自定义镜像
6.1 镜像结构
- 镜像结构:镜像是将
应用程序
及其需要的系统函数库
、依赖
、环境
、配置
打包而成。 - BaseImage层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其他:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
6.2 Dockerfile
- Dockerfile就是一个文本文件,其中包含一个个的指令(Instrection),用指令来说明要执行什么操作来构建镜像。每个指令都会形成一层Layer。
*dockerfile的编写
```powershell基础镜像
FROM java:8-alpineauthor
MAINTAINER ruoyi
挂载目录
VOLUME /home/ruoyi
创建目录
RUN mkdir -p /home/ruoyi
指定路径
WORKDIR /home/ruoyi
复制jar文件到路径
COPY ./jar/*.jar /home/ruoyi/ruoyi.jar
暴露端口
EXPOSE 8080
启动应用
ENTRYPOINT ["java","-jar","ruoyi.jar"]
* 步骤一:新建一个空文件夹docker-demo
* 步骤二:拷贝.ruoyi.jar文件到docker-demo这个目录(或者指定目录)
* 步骤三:将上面编写好的Dockerfile拷贝到docker-demo这个目录
* 步骤四:进入docker-demo
* 步骤五:运行命令 `docker build -t javaweb:1.0 .` # -t指的是-tag版本 `.指的是dockerfile所在的目录`
## 6.3 DockerCompose
* Docker Compose可以基于Compose文件帮我们快速的部署`分布式应用`,而无需手动一个个`创建`和`运行容器
* Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
* 部署命令:`docker-compose up -d`
* 查看日志:`docker-compose logs -f`
* 重启服务:`docker-compose restart gateway userservice orderservice`
* DockerCompose就是将docker run命令集合进来的
* 默认容器互联`docker network create some-net`
举例1:
```powershell
version : '3'
services:
mysql: # 容器名称
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD:123456
volumes: .
- /tmp/mysql/data:/var/lib/mysql
- /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf
web: # 容器名称
build: .
ports:
- 8090:8090
举例2:
启动elasticsearch
和kinana
version : '3'
#networks:
# es:
services:
elasticsearch:
container_name: elasticsearch
image: elasticsearch:7.12.1
ports:
- 9200:9200
- 9300:9300
volumes:
- ./es-data:/usr/share/elasticsearch/data
- ./es-plugins:/usr/share/elasticsearch/plugins
environment:
ES_JAVA_OPTS: -Xms512m -Xmx512m
discovery.type: single-node
privileged: true
# networks:
# - "es"
kinana:
container_name: kinana
image: kibana:7.12.1
ports:
- 5601:5601
# networks:
# - "es"
environment:
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
# volumes:
# - ./kibana.yml:/usr/share/kibana/config/kibana.yml
7 Docker镜像仓库
- Docker Hub
- 阿里云镜像服务等
部署私有仓库 - 镜像仓库推送钱需要把仓库地址配置到docker服务的daemon.json文件中,被docker信任
- 推送本地镜像到仓库前都必须重命名(docker tag)镜像,以
镜像仓库地址
为前缀。
推送镜像到私有镜像服务必须先tag - 步骤一:重新tag本地镜像,名称前缀为私有仓库的地址:127.0.0.1:8080/
docker tag nginx:latest 127.0.0.1:8080/nginx:2.0
- 步骤二:推送镜像
docker push 127.0.0.1:8080/nginx:2.0
- 步骤三:拉取镜像
docker pull 127.0.0.1:8080/nginx:2.0
8 修改镜像储存位置
```powershell
wsl --export docker-desktop d:\docker-desktop.tar
wsl --export docker-desktop-data d:\docker-desktop-data.tarstopDocker
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data
wsl --import docker-desktop E:\dockerimages\docker-desktop d:\docker-desktop.tar --version 2
wsl --import docker-desktop-data E:\dockerimages\docker-desktop-data d:\docker-desktop-data.tar --version 2
```