底层原理
Docker怎么工作?
Docker为什么比VM虚拟机块?
1.Docker有比虚拟机更少的抽象层
2.docker利用的是宿主机的内核,vm需要是Guest OS
所以说,新建一个容器的时候,docker不需要像虚拟机一样加载一个系统内核,避免引导,虚拟机是加载Guest OS,分钟级别;而Docker是利用宿主机的操作系统,秒级
Docker的常用命令
帮助命令:
docker version;docker info;docker 命令 --help
#官方文档:docs下面的Reference
镜像命令:
查看镜像
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
Options:
-a, --all 列出所有镜像
-q, --quiet 只显示镜像的ID
搜索镜像:
docker search mysql --filter=STARS=5000
下载镜像命令:
这个命令可以把mysql下载下来
docker pull mysql #默认下载latest版本
dcker pull mysql:5.7 #下载指定版本,这个下载过程是分层下载的,所以如果前面下载过mysql 最新版,其实后面再下载其他版本有很多步骤因为重复的会直接找缓存就可以
删除镜像命令:
#通过镜像名称来删
#通过镜像ID来删一个镜像
docker rmi -f 镜像id
#通过镜像ID来删多个镜像
docker rmi -f 镜像id 镜像id 镜像id
#删除全部镜像
docker rmi -f $(docker images -aq)
容器命令:
说明:我们有了镜像才可以创建容器,下载一个centos来测试学习
docker pull centos
新建容器并进入容器
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 如tomcat01,tomcat02,原来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口如
(-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
例子:-p 8080:8080)
-P 随机指定端口
从容器退回主机
exit #容器停止且退出
快捷键ctrl+p+q #退出且容器不停止
列出运行中的容器
docker ps #列出当前运行的容器
docker ps -a #列出当前运行+历史运行过的的容器
docker ps -a -n=? #列出最近运行的容器
删除容器命令
docker rm 容器id # 删除指定容器,但是不能删除正在运行中的容器
docker rm -f $(docker ps -aq) #删除全部容器(包括正在运行的容器)
docker ps -a -q|xargs docker rm #删除所有容器
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
注意区分上面的 这3个命令:
第1个指令:docker run -d centos
坑:centos是我们的容器,docker容器使用后台运行,就必须有一个前台进程,docker发现没有应用,就立刻自动停止;
常用其他命令
查看日志
docker logs -f -t --tail 容器,没有日志
自己编写一段shell脚本:docker run -d centos /bin/sh -c "while true;do echo lingchun;sleep 1;done"
显示日志
docker logs -tf --tail 10 容器ID
说明:
-tf #显示日志
--tail number #要显示日志条数
查看容器中的进程
docker top 容器ID
查看容器信息
docker inspect 容器ID
进入容器中命令(run是创建并进入,exec是直接进入)
docker exec -it 容器ID /bin/bash
docker attach 容器ID
说明:
#docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach 进入容器正在执行的终端,不会启动新的进程
#exit不会停止容器,而attach会停止进程
从容器内拷贝文件到宿主机上
docker cp 容器id:/home/待拷贝文件名 /home
###未来通过-v 卷 技术可以实现自动拷贝
实战 部署Nginx
docker pull nginx #拉取镜像
docker images
docker run -d --name nginx01 -p 3344:80 nginx #类似映射,通过公网的3344访问到docker的80端口
docker ps
curl localhost:3344
启动成功后在公网上访问:http://linux的ip:3344/ 可以访问到nginx的页面,就标志着部署成功了
docker stop 容器id
如果报错记得Linux要开放端口3344
#进入容器
docker exec -it nginx01 /bin/bash
whereis nginx
cd /etc/nginx #这里放了nginx.conf
ls
思考::
我们每次要改动nginx配置文件都需要进入容器内部?十分麻烦,我们要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动更改,那就好了!
-v 数据卷!