一、概念

理念:容器化,把应用打包

定义: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架构图

docker 查看 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 语法

docker 查看 docker启动命令 查看docker启动日志_校招_02

from    base镜像
maintainer  作者
run   执行命令
copy  把文件拷贝到镜像中
add   添加文件
expose  暴露端口号
copy能拷贝命令和 文件夹,add可以添加远程的文件,比如ftp上的
entrypoint 容器入口
workdir  指定路径
env      设定环境变量
user     指定用户

2、docker存储 :镜像分层

dockerfile中每一行都产生一个新层

docker 查看 docker启动命令 查看docker启动日志_docker_03

已经存在的镜像:只读

运行起来,就是可读可写的层

分层技术,在有层共享的时候,存储压力会小很多

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即可