1.Docker是什么
Docker 是应用容器的引擎,什么意思?当我们利用Docker安装应用的时候,Docker会自动搜索并下载应用镜像。镜像不仅包含了应用本身,还包含应用运行所需要的环境,配置,系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器。
2.Docker安装MySQL的命令解读
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
- docker run : 创建并运行一个容器,-d是让容器在后台运行
- --name mysql : 给容器起名字,必须唯一
- -p 3306:3306 :设置端口映射;(宿主机端口:容器端口)
- -e key=value : 设置环境变量,每个镜像可能有自己不同的镜像
详细看官方文档:http://hub.docker.com/ 但是这是外网,可能访问不了,得自己想办法。
- mysql : 指定运行的镜像的名字
3.常用命令
docker pull #从远端镜像仓库拉取到本地镜像仓库
docker push #把自己的镜像推送到远程镜像仓库中
docker images #查看本地镜像
docker rmi #删除本地镜像
docker save #将自己打包好的镜像压缩,如下,latest是版本号
docker load #把压缩的镜像进行加载到本地镜像仓库
docker run #创建并运行容器
在执行docker run命令时,使用-v 数据卷:容器内目录 可以完成数据卷挂载
docker stop #停止当前容器,容器还在,不会消失
docker start #启动容器中的进程,不会另外创建容器
docker ps #查看容器中的进程
docker rm #删除容器
docker logs #查看容器运行的日志
docker exec #进入容器内部使用一些命令
docker inspect #查看容器详情
自定义镜像:
1.创建DOCKERFILE文件
2.docker build
docker save:将自己打包好的镜像压缩,如下,latest是版本号
![](https://i-blog.csdnimg.cn/direct/8533a3c815934c5cb34a248db4c59fc8.png)
docker rmi:删除本地镜像
docker load:把压缩的镜像进行加载到本地镜像仓库
docker run:创建并运行容器
docker stop :停止当前容器,容器还在,不会消失
![](https://i-blog.csdnimg.cn/direct/d9da1e10859547d7905e39cf6e03b43f.png)
docker logs :查看指定的容器运行的日志
![](https://i-blog.csdnimg.cn/direct/899c80c2379d426981c8d74a443f9a5e.png)
docker exec :进入容器内部使用一些命令
![](https://i-blog.csdnimg.cn/direct/27de84feb79b4361aa2841dcdcc4ca88.png)
docker rm:删除容器
4.数据卷-volumes
docker volume create #创建数据卷
docker volume ls #查看所有数据卷
docker volume rm #删除指定数据卷
docker volume inspect #查看某个数据卷的详情
docker volume prune #清楚数据卷
什么是数据卷:是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
在docker创建的容器中,每个容器内都有独立的系统,但是这种系统的功能也仅限于容器内镜像所需要的,能使镜像运行的基础命令和文件以及操作等等,这些东西只能满足镜像的运行。所以我们在容器内修改某些文件或做什么操作的时候,就非常困难了。于是数据卷就出现了,如下,假如我创建一个html卷,首先宿主机的/var/lib/docker/volumes/会创建一个html目录以及下的_data目录,我的html卷会映射到_data目录,然后对容器的html目录与数据卷进行挂载,之后docker就会对两者进行双向绑定,如果我修改宿主机的html下的静态资源,那么对应的容器内也会跟着发生同样的变化。
举个例子:我要修改容器内nginx的index.html文件
nginx的静态资源在哪,可以查看官网:https://hub.docker.com/_/nginx
![](https://i-blog.csdnimg.cn/direct/48bf638c9b6c4292a5fe1f3cab5db217.png)
![](https://i-blog.csdnimg.cn/direct/07f2f81a263e47bea4219efdb7885d03.png)
然后我们再举个例子,这次是挂载到本地,而不用volumes:
需求:基于宿主机目录实现MySQL数据目录,配置文件,初始化脚本的挂载
挂载/root/mysql/data到容器内的/var/lib/mysql目录
挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录
挂载/root/mysql/conf到容器内/etc/mysql/conf.d目录
- 在执行docker run命令时,使用 -v 本地目录:容器目录 可以完成本地目录挂载
- 本地目录必须以 "/" 或者 "./"开头,如果直接以名称开头,会被识别为数据卷并非本地目录
docker -d --name mysql -p 3306:3306 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
#此为完整命令
5.自定义镜像
层:
假如我们用Java已经写好了一个程序,这个程序在远程仓库肯定时没有的,这时候就需要自定义镜像了。在Docker中,采用了分层的思想,就是我们打包一个程序,那这个程序肯定得依赖其他的东西才能启动,比如像操作系统,jre,jar包,运行jar包的脚本等等,对于底层的操作系统而言,我们并不需要这个操作系统所有的函数库,而是只需要能把Java程序跑起来所依赖的函数库就可以了,把这样的一个操作系统打包上传到远程仓库,每次需要用的时候(拉取)pull就行,这样以后的Java程序就省去了很多麻烦的操作与空间,这就是分层的大致意思。不过这种操作,可以不需要我们来做,有大佬来做,放在远程仓库。但是我们在远程拉取一个程序服务端的时候,docker是怎么知道这个程序的层是什么,有哪些层,这就归功于Dockerfile了。
Dockerfile
指令 | 说明 | 示例 |
FROM | 指定基础镜像 | FORM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | Env key vlaue |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jrell.tar.gz /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jrell.tar.gz && EXPORTS path=/tmp/jrell:$path |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
详细指令:https://docs.docker.com/reference/dockerfile/
#基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
假如我写了这样的一个dockerfile,那怎么构建这个镜像呢
docker build -t myImage:1.0 .
- -t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认时latest
- . :是指Dockerfile所在目录,如果就在当前目录,则指定为"."
6.网络
docker创建的容器里面都有独立的文件系统和网络等等,而创建的容器的ip地址就是固定在同一个网段内,这个网段范围是 172.17.0.1 16 ~ 172.17.255.254 16,所以容器间可以彼此ping通,如果某天我停掉了某一个容器,那在之后,我又跑起来了另一个容器,那这个容器可能会把停掉的容器的ip地址占用掉,这个ip地址我可能之前和别的程序关联配置过,那就会导致整个程序出现问题。
所以有自定义网络出现了,加入自定义网络的容器可以互相通过容器名互相访问,以下是命令:
命令 | 说明 |
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect | 使指定容器连接加入某网络 |
docker network discount | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
docker network connect 【自己创建的网络名】【容器名】
举个例子:
docker run -d --name store -p 8080:8080 --network zzb-network store
7.DockerCompose
DockerCompose是通过一个单独的docker-compose.yml模板文件(YAML)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。
命令:docker compose [options] [command]
options -f 指定compose文件的路径和名称
-p 指定project名称
commands up 创建并启动所有service容器
down 停止并移除所有容器,网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop/start/restart 停止/启动/重启单个容器
top 查看运行的进程
exec 在指定的运行容器中执行命令