docker的常用命令行:
1.常用的帮助命令
1.1.查看docker的信息以及版本号
docker info 查看docker的信息
docker version 查看docker的版本号
1.2.docker的启动,重启,停止,状态
service docker start/restart/stop/status
2.镜像的常用命令
2.1.什么是镜像
docker中的镜像并不只是一个你们想想系统(window,centos,OS X...),
而且这些镜像是只读的,可以通过镜像(相当于iso文件)来创建多个容器
也可以通过容器来制作镜像
2.2.列举出所有的本地镜像
docker images
所拥有的参数:
--no-trunc:显示完整的镜像信息
-a:列举出本地的所有镜像(包含不完整镜像和损坏镜像)
-q:只显示镜像的id(只显示完整镜像的id)
-qa:显示所有的镜像id(包含不完整镜像和损坏镜像)
eg:
delete from user where user_id in (
select user_id where user
);
--digests:显示镜像的摘要信息
自己也可以制作镜像上传到dockerhub上,上传的时候会写一些摘要信息
这些摘要信息默认是不显示(也可以选择不写)
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
REPOSITORY:镜像的名称
TAG:镜像的版本号
IMAGE ID:镜像的唯一标识id(相当于数据库中的主键,绝对不允许重复)
CREATED:是从dockerhub中下载下来的时间
VIRTUAL SIZE:镜像所占用的硬盘大小
2.3.搜索镜像
可以从dockerhub上搜索自己想要的镜像
docker search 所要搜索的镜像名
所拥有的参数:
--no-trunc:显示完整的镜像信息
!!!-s:列举出点赞数不小于多少的镜像信息
eg:
找到点赞数不小于20的tomcat的镜像
docker search -s 20 tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
NAME:
镜像的名称
DESCRIPTION:上传镜像到dockerhub所编写的描述,可以选择不写
STARS:镜像的点赞数
OFFICIAL:是官网提供的镜像
AUTOMATED:是喜爱者自己编写的镜像上传(也就是说是非官方提供的镜像)
2.4.拉取(下载)镜像
docker pull 镜像名:版本号
如果拉取镜像的时候不指定版本号,则下载的就是最新版(latest)
如果指定版本号拉取出来的就是对应的版本
2.5.删除镜像
docker rmi
删除单个镜像:
可以根据id删除,也可以根据镜像的名称来删除
docker rmi 镜像的id
这个时候发现当某一个镜像正在被使用的时候,无法删除
docker rmi -f 镜像的id(强制删除,就算打开了也可以直接删除)
删除多个镜像:
docker rmi -f(强制删除) 镜像名 镜像名 镜像名...
删除所有镜像:
eg:
使用SQL语句删除某一张表下的所有数据
如果想要删除所有数据,就必须要先知道所有数据的id主键
delete from user where id in (select id from user);
如果优化SQL语句(至少要5条)
-qa:查看所有镜像的id
再通过镜像的id删除所有的镜像
docker rmi -f $(docker images -qa)
2.6.把docker上已经存在的镜像保存到本机硬盘上(开发完毕之后,把所有的环境制作成镜像,保存到本机硬盘上)
docker save -o centos:6.10(把镜像保存在本机上所显示的名称) seven:6.10(所要保存到本机硬盘的镜像名称)
这个文件就会保存在当前所在目录
2.7.把本机硬盘上的镜像导入到docker中(运维把开发完毕的镜像导入到甲方服务器的docker中)
两种实现方式:
效果一模一样,只是命令不一样(其他的没有任何区别)
1.docker load --input 本机硬盘上的镜像名称(是否可以支持同时导入多个,自己尝试)
2.docker load < 本机硬盘上的镜像名称
3.容器命令(重点,程序员所必须要会的命令)
3.1.通用镜像来创建一个容器(一个镜像可以创建多个容器)
docker run 镜像名称:版本号
所拥有的参数:
--name="":给容器起一个名字(不是必要参数,如果不指定,则docker会随机一个名字)
-d:后台运行(以守护式进程的形式启动)
(下面再聊)
-i:以交互的形式来启动容器(一般不会单独存在,经常和-t连用)
-t:重新打开一个新的终端(一定不会单独存在,一定要和-i连用)
-P:为容器随机端口号
-p:为容器自己指定端口号
笔试题经常会出现一个判断题:
oracle和mysql不区分大小写! 不对
select * from user;
SELECT * FROM USER;
3.2.显示所有正在运行的容器
docker ps
所拥有的参数:
-a:显示所有的容器信息(包含已经停止和正在运行的所有容器)
-q:只显示容器的id
-qa:显示所有容器的id(包含已经停止和正在运行的所有容器)
-l:(最常用的一个命令)
显示出你最近所创建过的一个容器
-n:(最常用的一个命令)
显示最近所创建的第n个容器
docker ps -n 3
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
CONTAINER ID:容器的唯一标识符
IMAGE:这个容器是由哪一个镜像创建的
COMMAND:是一个命令行标识
windows:bat
linux:sh
"bin/bash":是让容器运行的命令行(是固定的,而且只能用于Linux)
CREATED:该容器被创建的时间
STATUS:该容器的状态
PORTS:指的是容器的端口号,如果没有则不显示
NAMES:容器的名称,可以通过--name属性来进行自己指定
3.3.退出容器
退出容器有两种:
exit:退出容器并且停止容器(容器的状态直接从Up-->Exist)
ctrl+p+q:退出容器并且让容器在后台继续运行
3.4.启动容器
启动的情况下要去启动状态已经是Exist的容器
docker start 容器的名字/容器的id
3.5.重启容器
docker restart 容器的名字/容器的id
有两层含义:
如果容器的状态为Exist,则是把关机的容器重新启动起来
如果容器的状态为Up,则是直接重启容器
3.6.停止容器
只能停止当前状态为Up的容器
docker stop 容器的名称/容器的id
3.7.强制停止容器
docker kill 容器的名称/容器的id
不推荐使用,实在太粗暴了!
3.8.删除容器
删除单个容器:
docker rm 容器的名称/容器的id
删除多个容器:
docker rm 容器的id 容器的id..(容器的名称也可以)
删除所有的容器:
也有两种形式:
1.docker rm -f(强制删除) $(docker ps -qa)
2.docker ps -qa | xargs docker rm -f(强制删除)
!!!3.9.以守护式进程启动容器(使用非常广泛)
docker run -d centos:6.10--->只会把这个容器创建出来,但是并不会直接启动
如果不需要的时候,则就不会占用服务器的资源,如果一旦需要了直接启动唤醒即可
使用场景:
咱们的这个团队的项目非常非常大,需要非常多的中间件来把整个项目协调
明白(redis:200台,ES(1000台),zookeeper(171台)),也就是说一共需要1371台服务器才能把整个项目运行起来
这个时候docker就开始不断的创建容器了,当创建到1300台的时候发现服务器的资源被沾满了,剩余71台就无法启动了,可能就会导致整个项目出问题
但是并不是说所有的服务器都必须要处于一个启动状态,以ES为例,比如并发小于5000的时候只需要启动大概100台就够了,所以这个时候我就会把这些所有的容器都以守护式的进程启动,使用到哪一个容器直接唤醒,这么一来的情况下就大大减少了服务器的资源
3.10.查看容器的详细信息(数据卷的时候会使用)
docker inspect 容器的id
!!!!3.11.重新以交互式的形式进入到容器里面(1.容器必须要是Up状态,2.必须是在后台已经成功启动,也就是说使用docker ps直接可以查看到)
1.docker exec -it 容器的id(一般情况下,简单的查看命令使用这个命令)
他并不会直接打开一个新的终端,而是直接返回你想要的结果
需求:
查看centos6.10 id为d0c3c1d827db容器中根目录下是否有文件夹
cd /
ll(这个命令并不是centos自带的,是一些插件包所提供) ls ls -l
如果安装的是一个非常纯净的centos系统,则没有这个命令(ls -l代替)
docker exec -it d0c3c1d827db(容器的id) ls -l
docker exec -it d0c3c1d827db(容器的id):
进入到这个容器里面
ls -l:所需要在容器中执行的操作
!!!2.docker attach 容器的id
进入容器,重新以新的终端打开(可以让你直观的直接去操作)
4.docker的实例(实际运行)
4.1.运行tomcat
-P:docker随机端口号
-p:指定端口号
4.1.1.从dockerhub中拉取tomcat8.5的镜像到本地仓库
docker pull tomcat:8.5
4.1.2.从tomcat镜像中启动容器
docker run -it -P tomcat:8.5
docker run -it -p 8081:8080 tomcat:8.5
4.2.通过容器创建镜像(通过容器去创建一个镜像(好久没有操作了,下周讲springcloud的时候讲这个))
docker commit -a="作者的名字" -m="这个镜像的描述" 容器的id 通过该容器所生成的镜像名称:版本号
5.数据卷(其实他的用处非常大)
什么是数据卷?
把容器中的数据自动的持久化到本机硬盘上,称之为数据卷(也称之为数据共享)
需求:
在本机Linux上有一个文件夹(/home/hostData)
在docker中的centos6.10也有一个文件夹(/home/containerData)
现在我要做的是让hostData和containerData做数据共享
!! 以上的所有操作都不需要手动创建 !!
/**5.1.运行docker中centos6.10系统
docker run -it centos:6.10 */
5.2.直接执行命令实现数据共享
docker run -it -v /本机共享文件夹的路径(/home/hostData):/容器中共享文件夹的路径(/home/containerData) 镜像名:版本号
5.3.检测配置是否成功
docker inspect 8948a38d5bf1
这里有面试题:(高频面试题)
如果我现在把容器停掉,去修改主机上的共享文件夹数据,容器再次启动的时候容器中共享文件夹是否会去改变数据?
会
这里使用的是双向监听:
主机会去一直监听容器的状态,当监听到容器宕机之后,这个时候去修改主机上数据(主机会记录我的数据已经改变),当主机再次监听到容器重启了,(在发送数据之前,先去检测容器中的数据和主机中的数据是否一致)这个时候会主动的发送数据给容器
验证:
1.停止容器
exit
2.去修改主机上的数据
vim 123.txt--->111111
3.重新启动容器
docker start 8948a38d5bf1
4.以新的终端重新进入容器
docker attach 8948a38d5bf1
6.带权限的数据共享
这个权限只能限制容器,不能限制主机
适用场景:
经常适用于读写分离
(看图!)
让centos6.10这个新创建的容器(containerData1)对于主机上的hostData1这个目录只有读,没有写的权限
docker run -it -v /主机中共享文件夹的目录(/home/hostData1):/容器中的共享文件夹的目录(/home/containerData1):ro 镜像的名称:版本号
检测是否配置成功:
docker inspect 容器的id(1e911123a76b)
看到以下信息为false说明权限配置成功:
"VolumesRW": {
"/home/containerData1": false
}
7.docker实例
7.1.使用docker部署mysql
7.1.1.从dockerhub上把mysql5.7拉取下来
docker pull mysql:5.7
7.1.2.通过mysql:5.7镜像去创建容器,并且把数据持久化到本机硬盘上(数据卷)
最终会持久化mysql配置相关的数据
-v /home/mysql/conf:/etc/mysql/conf.d
指定主机上/home/mysql/conf和容器中/etc/mysql/conf.d目录做数据共享
-v /home/mysql/logs:/logs
-v /home/mysql/data:/var/lib/mysql
docker run --name=mysql -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
7.2.docker部署redis
7.2.1.先从dockerhub上把redis5.0.3拉取下来
docker pull redis:5.0.3
7.2.2.创建和运行容器,并且持久化配置数据到本机硬盘上(数据卷)
(虽然redis的默认端口号是6379,但是最好不要去使用redis的默认端口号)
(这是开发细节)
docker run --name=redis01 -p 6380:6379 -v /home/redis/data:/data -v /home/redis/conf/redis:/usr/local/etc/redis/redis.conf -d redis:5.0.3
7.2.3.如何检测redis配置成功
docker exec -it 容器的id redis-cli
报错:(记录到笔记本上去)
FATAL: kernel too old(说明内核太老了,需要升级)
1.换系统(centos7.2以上即可)
比较简单,但是需要把之前配置所有的东西全部整一遍(反而更耽误事)
2.给centos6.10升级内核
2.1.首先先更新nss
yum update nss
2.2.重新安装和导入新的RPM秘钥
第一种形式:
使用绿色版进行安装(如果网络不好的时候使用这个安装比较好)
第二种形式:
直接使用rpm版本来进行安装
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
2.3.安装noarch(内核必要的类库)
rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm
2.4.更新内核
2.4.1.升级到最新版(kernel-ml)
虽然是最新版,但是不一定稳定
yum --enablerepo=elrepo-kernel -y install kernel-ml
2.4.2.升级到最稳定的长期支持版本(里程碑版本)(推荐使用)
yum --enablerepo=elrepo-kernel -y install kernel-lt
2.5.更新内核启动顺序
vim /etc/grub.conf
default=1--->0
2.6.重启服务器
reboot