为了解决不同组件部署的冲突问题,docker应运而生。
docker放在linux系统中,可以部署许多的组件如mysql,redis等,每个都有自己的运行环境,不会互相干扰。
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:
Docker中有几个重要的概念:
镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。
systemctl start docker # 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker # 重启docker服务
docker -v 查看版本号
docker pull mysql:5.7 拉取mysql版本为5.7数据库命令
docker images 查看拉取到的镜像
docker ps -a 查看所有运行的容器
docker logs -f -f是持续查看日志
docker save -o nginx.tar nginx:latest 将nginx版本为latest的镜像导出到磁盘中命名为nginx.tar
docker rmi nginx:latest 删除镜像 nginx版本为latest
docker load -i nginx.tar 加载本地文件(导入镜像)
docker run:创建并运行一个容器,处于运行状态 例子:docker run --name containerName -p 80:80 -d nginx
docker run :创建并运行一个容器
--name : 给容器起一个名字,比如叫做mn
-p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d:后台运行容器
nginx:镜像名称,例如nginx
以下命令后面直接跟容器名或者id
docker pause:让一个运行的容器暂停
docker unpause:让一个容器从暂停状态恢复运行
docker stop:停止一个运行的容器
docker start:让一个停止的容器再次运行
docker rm:删除一个容器
docker exec -it mn bash 进入mn中
解释:本来要进入到容器内才能进行操作,现在通过挂载的方式可以不用进入容器就能操作了。
基础命令:
docker volume create:创建数据卷
例子:docker volume create html 创建html数据卷
docker volume ls:查看所有数据卷
docker volume inspect:查看数据卷详细信息,包括关联的宿主机目录位置
docker volume rm:删除指定数据卷
docker volume prune:删除所有未使用的数据卷
我们在创建容器时,可以通过 -v 参数来挂载一个数据卷到某个容器内目录,命令格式如下:
创建容器并挂载数据卷到容器内的HTML目录
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx:1.14.1
这里的-v就是挂载数据卷的命令:
-v html:/usr/share/nginx/html :把html数据卷挂载到容器内的/usr/share/nginx/html这个目录中
冒号左边的是宿主机的,由docker自己管理。
冒号右边的是容器的地址路径;
例:
拉取镜像:
docker pull mysql:5.6
进入tmp目录,创建/tmp/mysql/data和/tmp/mysql/conf
mkdir -p /tmp/mysql/data // 存放生成的数据信息
mkdir -p /tmp/mysql/conf // 存放共享的配置文件信息
将课程资料中的hmy.cnf配置文件拷贝到/tmp/mysql/conf
创建mysql容器,并绑定对应的文件夹和文件:
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3306:3306 \
-d \
-v /tmp/mysql/data:/var/lib/mysql \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/my.cnf \
--privileged \
mysql:5.7
---------------------
docker run \ // 创建容器
--name mysql \ // 给容器起名
-e MYSQL_ROOT_PASSWORD=root \ // 设置root账户密码
-p 3306:3306 \ // 端口映射
-d \ // 后台运行
-v /tmp/mysql/data:/var/lib/mysql \ // 绑定宿主机上的文件夹
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/my.cnf \ // 绑定宿主机上的文件
--privileged \ // 设置超级管理员远程访问权限
mysql:5.7 // 镜像名称
更新详细语法说明,请参考官网文档: Dockerfile reference | Docker Documentation
需求:基于java:8-alpine镜像,将一个Java项目构建为镜像
实现思路如下:
① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile
② 拷贝课前资料提供的项目jar包docker-demo.jar导入到这个目录中
③ 编写Dockerfile文件:
a )基于java:8-alpine作为基础镜像
b )将app.jar拷贝到镜像中
c )暴露端口
d )编写入口ENTRYPOINT
内容如下:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
④ 使用docker build命令构建镜像
docker build -t javaweb:1.0 .
⑤ 使用docker run创建容器并运行
docker run --name web -
p 8090:8090 -d javaweb:1.0
说明:Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!
(1)在任意位置创建一个新目录,将app.jar复制到该目录
(2)在该目录中,新建一个Dockerfile
文件,并编写下面的内
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 9090
ENTRYPOINT ["java","-jar","/tmp/app.jar"]
在刚才的目录中,创建一个docker-compose.yml
文件并填写内容:
version: '3'
services:
web:
build: .
ports:
- "9090:9090"
redis:
image: "redis:6.0"
命令解读:
version:compose的版本
services:服务列表,包括两个服务:
web:自己写的Java项目
build:这个服务镜像是临时构建的,构建目录是当前目录,会利用当前目录的Dockerfile来完成构建。
ports:端口映射,对外开放8080端口
redis:redis服务
将刚刚准备好的文件夹上传到Linux的对应的/docker-compose
目录:
然后执行命令:
docker-compose up -d
通过docker-compose stop
关闭容器
通过docker-compose down
关闭容器并删除