docker 命令学习
- 对于docker的学习以及一些命令的记录
image 镜像常用
- image也就是镜像,可以理解为一个个安装包
docker images
查看所有的镜像docker pull mysql
拉取镜像docker search mysql
搜索镜像docker rmi 镜像名:tag | 镜像id
后面加tag或者镜像id来删除镜像docker rmi -f 镜像名:tag | 镜像id
强制删除以及创建容器的镜像,会将容器和镜像一并删除docker images -a
显示所有镜像docker images -q
查看所有的镜像iddocker rmi -f $(docker images -q)
强制删除所有的镜像$( )
嵌套
container 容器的相关操作
-
docker run
docker run 镜像名:tag | 镜像id
开启运行镜像,由于容器本身具有隔离性,容器内的端口号无法被外界监听,可以开启多个容器与多个端口的映射,多节点部署docker run -p 8080(宿主机端口):8080(容器端口) tomcat:8.0-jre8
宿主机端口与容器中端口进行映射docker run -d -p 8080(宿主机端口):8080(容器端口) tomcat:8.0-jre8
后台运行该容器docker run -d(后台运行) -p 8080:8080(可以书写多个) --name tomcat01(容器名称) tomcat:8.0-jre8(镜像名称:tag)
启动容器 指定名称 后台运行 端口映射docker load -i tar文件名
将打包tar文件导入到自己的docker仓库
-
docker ps
docker ps
查看容器docker ps -a
查看所有容器(包括运行和非运行)docker ps -q
查看正在运行的容器的Iddocker ps -aq
查看所有容器的Id
-
停止 重启
docker start 容器名或者容器Id
开启容器docker restart 容器名或者容器Id
重启容器docker stop 容器名或者容器Id
正常停止容器运行docker kill 容器名或者容器Id
立即停止容器运行
-
删除容器
docker rm 容器Id|容器名称
删除停止的容器docker rm -f 容器Id|容器名称
删除正在运行的容器docker rm -f $(docker ps -aq)
删除所有容器
-
查看日志
docker logs 容器id | 容器名称
查看日志(不会实时更新)docker logs -f 容器id | 容器名称
实时查看日志docker logs -tf 容器id |容器名称
实时查看日志的同时查看时间戳docker top 容器id | 容器名
查看容器内的进程docker exec -it 容器名|容器id bash
进入容器并执行控制台交互exit
退出进入的容器
-
操作系统与容器的文件交互
docker cp 容器id|name :容器内资源路径 操作系统中路径
首先进入容器,将容器内的文件拷贝到操作系统中docker cp 文件|目录名 容器(id,name):/容器内资源路径
从操作系统复制文件到容器
-
查看容器内部细节
docker inspect 容器(name,id)
查看容器内细节
-
数据卷 Volume
- 作用:实现宿主机系统和容器之间的文件共享,可以相互共享一个文件目录等…共享了之后当对宿主机的文件进行修改之后能直接影响到容器,有了数据卷机制之后能将宿主机的文件目录映射到容器的文件目录
- 要在容器启动之前开启数据卷
- 1.自定义数据卷目录:
docker run -d -p 8080:8080 --name tomcat01 -v 宿主机目录:容器内目录 tomcat:8.0-jre
路径必须为绝对路径 docker run -d -p 8080:8080 --name tomcat02 -v /root/apps/:/usr/local/tomcat/webapps tomcat:8.0-jre8
- 2.自动数据卷目录
docker run -d -p 8080:8080 --name tomcat02 -v xx:/usr/local/tomcat/webapps tomcat:8.0-jre8
- 代表一个数据卷的名字,名称可以随便写,docker在不存在时自动创建这个数据卷,同时自动映射宿主机中某个目录
- 同时在启动容器时会将aa对应容器目录中全部内容复制到aa映射目录中
- 就是说会在宿主机中自动创建xx这个目录并且把容器中的数据复制一份到宿主机中,具体在哪不知道,需要去搜索一下
- 该方法在容器中创建redis,mysql使用,这样可以把数据备份到宿主机中,就算容器被删除,在宿主机中的xx还是存在的,我可以开启另一个redis或者mysql容器来挂载到当前的xx数据卷
- 不想对容器中的数据有写操作,可以采用这种数据卷方式,类似一种持久化机制,需要对容器有写操作时,用第一种方式
-
把容器打包成一个镜像
- 部署到容器之后,我们可以把整个容器打包成一个镜像,这样下次可以直接运行这个镜像,这个镜像包含我们之前部署的内容
docker commit -m "描述信息" -a "作者信息" (容器id或者容器名称) 打包的镜像名称:tag
docker commit -m "deploy test project" -a "kelian" 91ddc621sd2f test-tomcat:1.0
docker save 镜像名称:tag -o 文件名
将镜像导出成新的文件名可以进行备份docker save test-tomact:1.0 -o test-tomcat-1.0.tar
把tar包给别人之后可以用load方式load进dockerdocker load -i test-tomcat-1.0.tar
load进docker
-
docker中容器之间的网络配置
- docker 允许通过外部访问容器或容器互联的方式来提供网络服务
-
docker容器与操作系统的通信机制
- 当docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是linux的一个bridge,可以理解为软件交换机。它会挂载到它的网口之间进行转发
当run一个容器的时候,会默认给容器氛围172.17.0.x的ip,这样所有的容器在一个网段里面,当进行相互的通信时,会使网络阻塞
-
一般我们创建一个容器,就对其分配一个网桥
docker network ls
查看默认网桥docker network creat xxx(网桥name)
创建一个网桥docker run -d -p 8081:8080 --network ems --name tomcat03 tomcat
创建容器并且配置容器的默认网桥为ems,一旦在启动容器时指定了网桥,在这个网桥中的任何容器会对容器的IP地址与容器的名字进行映射,我们只需要访问名字就能访问对应的iphttps://tomcat01:8080
docker network rm 网桥name
删除对应的网桥docker inspect ems
查看网桥内的详细信息
-
数据卷详细
docker run -d -p 8081:8080 --name tom03 -v /Users/kelian.li/other:/usr/local/tomcat/webapps:ro tomcat
后面加ro表示readonly,宿主机的改变会影响到容器,但是容器不能有写操作docker volume ls
查看数据卷docker volume prune
删除所有数据卷
-
Dockerfile
- Dockerfile用来帮助我们自己构建一个自定义的镜像,日后用可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行
-
FROM
- 在指定目录下
vim Dockerfile
在第一行写上FROM:centos7
代表该镜像基于centos7构建的 docker build -t mycentos7:01 .(表示构建当前目录中的所有上下文)
-
RUN
- 构建镜像时需要运行的指令
- 在Dockerfilr文件中第二行写入
RUN yum install -y vim
会在centos7中创建vim -
EXPOSE
- 当前容器对外暴露出的端口号
- 在Dockerfile文件中写上
EXPOSE 8080
该镜像暴露的端口,这样之后才能在-p指令中映射对应的端口号 -
WORKDIR
- 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
WORKDIR /work
用docker run -it mycentos7:03
进入centos7容器之后会自动进入WORKDIR的目录,而不是根目录-
ENV
- 用来在构建镜像过程中设置环境变量
ENV BASE_DIR /data/bb
采用映射的方式将/data/bb
作为value,BASE_DIR
作为key,后面的代码中要用到该目录的时候可以直接使用$BASE_DIR
-
ADD
- 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
- 使用与COPY相同但是ADD可以加URL链接
-
COPY
- 类似于ADD,拷贝文件和目录到镜像中,将从上下文目录中<原路径>的文件/目录复制到新的一层的镜像内<目标路径>位置
COPY aa.txt /data/bb
将宿主机中当前dockerfile文件夹中的aa.txt文件一起打包进容器内的/data/bb中-
VOLUME
- 容器数据卷,用于数据保存和持久化工作
VOLUME /data/bb
允许该目录可以使用数据卷挂载-
CMD
- 指定一个容器启动时要运行的指令,Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
docker run mycentos7:17 echo "i love docker"
后面的指令会覆盖掉CMD中的第一条指令-
ENTRYPOINT
- 指定一个容器启动时要运行的命令,ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数
ENTRYPOINT ls
容器启动的时候会自动执行ls
查看指令,CMD和ENTRYPOINT合起来用时,用json结构
-
docker-compose
- 实现对Docker容器集群的快速编排,定位:定义和运行多个Docker容器的应用,同时可以对多个容器进行编排(编排是指容器的执行顺序)
- 项目(project):有多个服务共同组成一个完整业务单元,定义在docker-compose.yml文件中
- 服务(service):一个服务对应一个应用容器,在一个项目中可以存在多个服务
- 创建过程
- 创建一个docker-compose.yml文件
docker-compose up
启动这个项目的所有服务,必须保证运行命令的目录存在docker-compose.yml
- 创建一个docker-compose.yml文件
模版命令
docker-compose.yml
version: " " #设定compose的版本
services: #用来书写当前项目中哪些容器服务
tomcat01: #服务名
images: tomcat #指定使用镜像 image:tag
container_name: tomcat #指定启动时容器名称 --name
ports: #指定容器端口与宿主机端口映射 -p
- "8080:8080"
volumes: #指定容器中哪些路径与宿主机路径进行数据卷映射
- /root/apps: /usr/local/tomcat/webapps
- tomcatwebapps: /usr/local/tomcat/webapps
networks: #指定容器启动后使用哪个网桥
- aa
command: xxxx #用来覆盖容器默认启动命令
envoriment: #用来指定容器启动时环境参数
- MYSQL_ROOT_PASSWORD=root
env_file: #用来将environment环境中配置放入指定配置文件中
- ./mysql.env #必须是以env结尾的文件
depends_on: #当前容器的运行依赖于其他容器,先运行其他容器才能运行当前容器
- tomcat02 #写的是服务名
build: #用来指定Dockerfile所在目录,先根据build中Dockerfile自动构建镜像,自动运行容器
context: ./demo #指定上下文目录dockerfile所在目录
dockerfile: Dockerfile #dockerfile文件名
container_name: ...............
..........
......
volume:
tomcatwebapps:
external:
true
networks:
aa:
external:
true
docker-compose up -d
后台启动docker-compose down
关闭docker-compose中的所有服务,并关闭网络docker-compose exec xxx(yml中声明的服务id) bash
进入compose中的容器docker-compose ps
查看当前docker-compose中运行的容器docker-compose restrat
重启docker-compose rm (服务id)
删除docker-compose start / stop
docker-compose top
查看compose容器内运行的进程docker-compose pause/unpause 服务id
暂停和继续compose中的服务容器
视频链接:https://www.bilibili.com/video/BV1ZT4y1K75K?p=31
完结!!!!!!!