Docker 基础知识,看完就会用!!!

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是版本号

可以看见多了一个nginx.tar的压缩包

docker rmi:删除本地镜像

docker load:把压缩的镜像进行加载到本地镜像仓库

docker run:创建并运行容器

docker stop  :停止当前容器,容器还在,不会消失

可以看出nginx这个容器已经被停掉了

docker logs   :查看指定的容器运行的日志

-f 表示追踪日志

docker exec  :进入容器内部使用一些命令

-it 表示加入一个终端,选择一个shell:bash

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

上面的图可以看出,首先创建数据卷,然后查看数据卷html的详细信息

这就是index.html的内容

然后我们再举个例子,这次是挂载到本地,而不用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                      在指定的运行容器中执行命令

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值