一、概念
理念:容器化,把应用打包
定义:docker是一个开源的应用容器引擎,可以把任何应用以及他们的依赖包打包到一个 轻量级、可移植的容器中,然后发布到流行的Linux机器上,实现虚拟化。
VM和docker区别:
VM结构:server-》host OS -》hypervisor -> Guest OS -> Bins/libs ->app
docker : server-》host OS -》-> docker engine ->bins/libs ->app
从以上结构可以看出,hostOS直接安装一个docker engine,就可以从远程仓库【Registry】只中下载对应软件的docker镜像【images】,然后docker镜像运行起来就是一个容器【Containers】,这个容器像一个正常的操作系统一样,可以读写文件 并且运行起来的docker镜像,在删除和迁移的时候,也非常方便。
二、docker架构图
hostOS在安装完docker之后,会启动一个docker守护进程【docker daemon】,这个守护进程相当于docker命令行的解释器【类似于shell】,用户只要在hostOS的shell中执行docker对应的命令,就可以完成相应的操作。
三、docker命令
现在假设你已经安装好docker了。
1、验证是否安装成功
$ docker info
2、docker需要有自己的守护进程才能运行自己的命令,如果你没有的话,可以这样启动
用systemctl 或者service启动
$ sudo systemctl start docker
$ sudo service docker start
3、列出本机所有的docker images
$ docker images
4、下载并运行自己的镜像,假设我们现在下载一个hello-world
$ docker image pull hello-world #下载
$ docker run -d -p 8080:80 hello-world #运行 -p 端口映射 -d守护进程
$ docker run -it ubuntu /bin/bash # -i 交互模式 -t 终端 使用Ubuntu镜像启动一个容器
5、查看在运行的container
$ docker ps
6、运行失败,要删除原来的container,重新运行
$docker rm hello-world
$docker rmi [imagesName] #刪除鏡像文件
$docker container kill [containerID] #手動停止容器
可以先在 Docker官方仓库 docker hub中搜索一下想要用的images https://hub.docker.com ,获取他对应的文件名称路径,然后在用 pull 下载
7、把host主机中的文件和容器相互拷贝
$docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
$docker cp 宿主机的相应路径 容器名:要拷贝的文件在容器里面的路径
8、服务运行之后,产生的文件需要保存下来,但是直接停止container,一般来说是不会在容器中保存产生的文件的。这时候需要先commit,把文件保存下来,生成新的镜像
$docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
-a 提交镜像作者
-m 提交时说明文字
a404c6c174a2 原imagesID
四、查看docker日志
注意:docker有关的命令都要有管理员权限,可以把用户添加到管理员组,或者每次都接sudo
1、直接进入该容器,找到对应日志
$ sudo docker exec -it a95cee23942d /bin/bash #在镜像a95cee23942d中执行/bin/bash
root@a95cee23942d:/# ls
bin boot dev etc home lib lib64 logs media mnt opt proc requirements.txt root run sbin srv sys tmp usr var
#进入该container之后,就直接找到 /var/logs查看了
docker logs是根据containers而创建的
2、在主机中 ,实时查看docker容器日志
$sudo docker logs -f -t --tail 行数 容器名[containerID]
-f 按日志输出
-t 显示时间戳
3、在主机中 ,docker容器的日志目录
1、查看容器详细信息
$docker inspect 7a20f9671dbd
2、通过详细信息找到LogPath,那么它就在主机的目录结构下面
"LogPath": "/var/lib/docker/containers/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c-json.log"
3、用less 或者cat查看日志
$ sudo less /var/lib/docker/containers/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c/7a20f9671dbd972d1e94355c15b74236e36a9eb72da4636cb7e996e1a9cdd40c-json.log
五、定制镜像,并推送到 Registry --> dockerfile
定义: Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
1、dockerfile 语法
from base镜像
maintainer 作者
run 执行命令
copy 把文件拷贝到镜像中
add 添加文件
expose 暴露端口号
copy能拷贝命令和 文件夹,add可以添加远程的文件,比如ftp上的
entrypoint 容器入口
workdir 指定路径
env 设定环境变量
user 指定用户
2、docker存储 :镜像分层
dockerfile中每一行都产生一个新层
已经存在的镜像:只读
运行起来,就是可读可写的层
分层技术,在有层共享的时候,存储压力会小很多
3、dockerfile 创建一个 images
$docker build -t hello:tag .
# hello:tag 容器名:标签; . 是上下文,把该路径里面的所有东西打包成hello【images】
4、推送到远程registry,公共【Docker hub】或私人【需要另外购买】
首先得先注册,然后在登录,最后推送
$docker login
# 输入用户名和密码即可
$docker push hello/ubuntu:v2.4
#添加tag是为了在镜像分层上传时候,只要上传新增加的就可以了,如果想上传全部镜像层,不添加tag即可