Docker
# Docker
# 1.Docker特性
同一个内核不同系统环境下执行用户程序时,Docker会把用户程序和所需要调用的系统函数库一起打包执行,而这些打包的库函数在同一个内核下是兼容的。
采用沙箱机制来隔离容器,保证不同用户程序的依赖不会互相干扰。
Docker与虚拟机之间的区别:虚拟机是在一个操作系统中模拟硬件设备,运行另一个操作系统。Docker执行则是直接调用自己的操作系统内核,因此性能比虚拟机好。
镜像:Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起称为镜像。镜像是只读的,它是一个分层结构,基础镜像层+layers+入口(程序启动命令) 容器:镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。

# 2.基本操作
关闭防火墙
# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld
2
3
4
通过命令启动docker
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
2
3
4
5
拉取镜像
docker pull
打包保存镜像
docker save -o nginx.tar nginx:latest
读取tar文件解包镜像
docker load -i nginx.tar
查看镜像
docker images
查看容器信息,默认只能查看运行中容器
docker ps
查看所有容器
docker ps -a
运行容器,--name表示容器的名字,-p表示端口映射,把宿主机(外部所访问的地址)的86端口映射到docker80端口,-d表示后台运行加镜像名称,-v表示把数据卷html挂载到容器内/root/html目录(如果数据卷不存在docker会自动创建)。
此外容器目录还可以直接与宿主机目录进行挂载。-v 宿主目录:容器目录
docker run --name containerName -v html:/root/html -p 86:80 -d nginx
进入容器
docker exec -it containerName bash
强制删除容器
docker rm -f containerName
删除镜像
docker rmi imageName
容器暂停和运行
docker stop containerName
docker start containerName
2
# 3.数据卷
数据卷是一个虚拟目录,指向宿主机系统的某个目录。可以基于数据卷进行容器内文件修改,给容器备份。

数据卷操作。其中inspect指令Mountpoint可以获得宿主机挂载地址
docker volume create volumename//创建
docker volume ls //列出数据卷
docker volume rm volumename//删除
docker volume inspect volumename //查看详情
2
3
4
docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 -v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf -v /tmp/mysql/data:/my/own/datadir -d mysql:5.7.25
# 4.自定义镜像&分布式搭建
Dockerfile:自定义创建容器
- from指定基础镜像
- env设置环境变量(路径变量)
- expose指定容器运行时监听的端口,即镜像提供给使用者访问的
- entrypoint镜像的启动命令,容器运行时调用
Docker Compose:快速部署分布式应用,无需一个个创建和运行容器
每个微服务都需要通过build指明自己dockerfile的目录
Docker镜像仓库:首先配置Docker信任地址,然后通过dockercompose配置registry服务
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
推送本地镜像到仓库前需要使用docker tag重命名镜像,以镜像私服仓库的地址为前缀
# 5.根据Jar包配置Dockerfile并部署
将打包好的Jar包传入服务器,通过构建镜像文件运行在docker上
- 步骤
①将打包好的可执行jar包与Dockerfile传入服务器
②编写Dockerfile文件,其中常用指令:
ENV:指定容器启动后,所要执行指令的运行环境,配合外部传入
FROM:指定基础镜像,必须为第一个命令
ADD:将本地文件(jar包)添加到容器中
WORKDIR:配置指定当前工作目录,后续所有指令(CMD)和操作都是把该目录作为相对路径。
EXPOSE:配置镜像暴露的服务端口,一般配合host网络模式使用。(不配置host模式启动容器,会被-p接口映射覆盖)
ENTRYPOINT / CMD:配置容器启动后,调用执行的命令。
# 基础镜像
FROM openjdk:8-jdk-alpine
# 作者
MAINTAINER "phan"
# 时区
ENV TZ=PRC
WORKDIR /usr/local/dockerfile
# 添加应用
ADD api-gateway-engine.jar /api-gateway-engine.jar
# 执行镜像
ENTRYPOINT ["java","-jar","/api-gateway-engine.jar"]
2
3
4
5
6
7
8
9
10
11
③编译Dockerfile文件,生成Docker镜像。其中后面的点表示从当前上下文相对路径获取。
docker build -f ./Dockerfile -t api-gateway-engine:1.0.1 .
④执行镜像,并暴露对应的端口给外部访问
docker run -p 7397:7397 -p 8002:8002 --name api-gateway-engine -d api-gateway-engine:1.0.1
另外,在dockerfile中的ENTRYPOINT使用$JAVA_OPTS占位符,并在运行容器通过-e指定Dockerfile配置的外部运行环境参数,最终拼接到Dockerfile的指令当中:
docker run -p 8003:8003 -p 7398:7398 \
-e PARAMS="
--sever.port=8003
--api-gateway.address=http://192.168.200.200:8080
--api-gateway.groupId=10001
--api-gateway.gatewayId=api-gateway-g4
--api-gateway.gatewayName=电商配送网关
--api-gateway.gatewayAddress=192.168.200.200:7398" \
--name api-gateway-engine2 -d api-gateway-engine:1.0.0
2
3
4
5
6
7
8
9
不使用容器与宿主机的自动映射,启动host网络模式,宿主机EXPOSE暴露的端口会直接使用宿主机对应的端口
docker run --network host --name api-gateway-engine -d api-gateway-engine:1.0.1