Docker初步探索

Docker概述

同步开发人员的项目环境和项目内容,通过镜像实现。

应用更快的交付和部署

传统: 一堆帮助文件,安装程序。

docker: 打包镜像发布测试,一键部署。

Docker寻找镜像流程:

底层原理

docker的工作原理: docker 是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问,DockerServer接收到的Docker-Client的指令,就会执这个指令。

Docker为什么比VM快?

对比图:

1.Docker有着比虚拟机更少的抽象层。

2.Docker利用的是宿主的内核,而VM需要自己的操作系统。

3.新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载操作系统,分钟级别的,而Docker是利用宿主的操作系统,省略了这个复杂的过程,是秒级的。

Docker的常用命令

帮助命令

docker version --查看docker版本号

docker info --显示docker的系统信息,包括镜像信息

docker --docker的指令信息

保存镜像指令:

docker save -o [保存位置的文件名] [需要保存的镜像]

镜像命令

docker images --查看本地的镜像

PEPOSITORY: 镜像的仓库源。

#解释

TAG: 镜像的标签。

IMAGE ID: 镜像的ID。

CREATED: 镜像的创建时间。

SIZE: 镜像的大小。

#可选项
-a, --all #列出所有的镜像
-q, --quiet #只显示镜像的id



docker search 对应的镜像名 --搜索镜像

--filter=STARS=3000 --搜索出来的镜像就是STARS大于3000的镜像

docker pull 对应的镜像名 [:tag] -- 下载对应的镜像
如果没有加tag信息就会下载最新版本的


docker rmi --删除镜像
docker rmi -f 容器id --删除指定的容器
docker rmi -f 容器id 容器id 容器id -- 删除指定多个的容器
docker rmi -f $(docker images -aq) --删除全部的容器



 

容器命令:

要有镜像才可以创建容器。

新建容器并启动
docker run [可选参数] image

#参数说明
--name="Name"     容器名字 tomcat1,tomcat2, 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进行容器查看内容
-p 指定容器的端口 8080


列出所有在运行的容器
docker ps --列出当前正在运行的容器
-a #列出当前正在运行的容器 + 历史运行过的容器
-n=? #显示最近的运行的容器
-q #显示对应容器的编号


退出容器

exit --直接停止并退出容器
Ctrl + P + Q -- 容器不停止并退出

删除容器

docker rm 对应容器的id #删除指定的容器,不能删除正在运行的容器,如果要强制删除就使用 rm -f
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 #强制停止对应运行的容器

常用的其他命令:

后台启动容器
docker run -d 对应的容器名

#问题docker ps, 发现对应的容器停止了
#docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志
docker logs

-tf #显示日志
-tail number #要显示的日志条数


查看容器内部的进程信息
docker top 对应的容器id

查看镜像的元数据
docker inspect 对应的容器id


进入当前正在运行的容器

docker exec -it 对应的容器id [对应的路径] #路径一般为 /bin/bash
docker attach 对应的容器id [对应的路径] #路径一般为 /bin/bash

#exec和attach的区别:exec指令会进入容器后开启一个新的终端,可以在里面操作(常用),而attach指令则是会进入容器正在执行的终端,不会启动新的进程。


从容器内拷贝文件到主机上

docker cp 对应的容器id:容器内文件的路径 目的主机的路径

 例子1: 安装nginx

1. 搜索nginx的镜像使用 docker search Nginx
2. 下载对应的镜像 docker pull Nginx
3.运行测试 docker run -d --name 自定义的名字 -p 开放的端口号 nginx

-d #后台运行
--name #自定义名字 #指定容器的名称
-p #开放的端口
-P #随机开放一个端口

docker run -it --rm 对应镜像名 #表示用完即删除

端口暴露原理: 

 images找到的是镜像,不是容器,镜像和容器的区别是  利用镜像可以创建多个容器   通俗点理解为你只安装了一个QQ程序,但你可以登录多个账号

我们会发现容器中少了很多的Linux的命令。

原因:阿里云镜像的原因,默认使用最小的镜像,所以不必要的会全部剔除掉,保证最小的可运行环境。

portainer 

安装 portainer

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer 

docker 镜像原理

 镜像: 镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含了运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。

镜像下载到使用的流程图: 

 

Commit镜像

docker commit 提交一个容器成为新的副本

#命令和git相似
docker commit -m="提交的描述信息" -a="作者名" 容器对应的id 目标镜像名:[TAG]

容器数据卷

 其是一种同步技术,实现容器的持久化和同步的操作,容器间实现数据共享。

方法一 :直接使用命令挂载 -v

docker run -it -v 主机的目录:容器的目录
#类似-p 的端口号映射

例子1:

 

测试效果: 

 

 

 其两个文件是相互关联的,但并不是同个文件,所有占用双倍的空间。

例子2: 安装mysql

docker run -d -p 8082:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

 

 通过navicat测试连接

 具名和匿名挂载

#匿名挂载(在-v的时候就只写了容器内的路径,而没有写容器外的路径)

docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有volume的情况

docker volume ls 

#具名挂载(在-v的时候 卷名:对应的路径)

docker run -d -P --name nginx02 -v jvming:/etc/nignx nginx

docker volume inspect 对应的卷名 #查看对应卷的基本信息

匿名挂载结果: 

  具名挂载结果:

 查看对应卷信息:

 所有docker卷在没有指定容器外路径时,其卷信息都会存放在 /var/lob/docker/valumes/xxxxx。

如何区分 匿名挂载,具名挂载,指定路径挂载?

#匿名挂载
-v 容器内部路径
#具名挂载
-v 卷名:容器内部路径
#指定路径挂载
-v /宿主机路径:容器内部路径

拓展: 

DockerFile 

 作用:DockerFile 就是用来构建docker镜像的构建文件,通过对应脚本制作对应的镜像。

DockerFile构建步骤:
1.编写一个DockerFile文件。

2.docker build 构建成一个镜像。

3.docker run 运行镜像。

4.docker push 发布镜像。(docker Hub, 阿里云镜像仓库)

dockerFile构建过程:

1.每个关键字都要大写。

FROM #基础镜像,一切从这里开始
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #构建镜像的时候需要运行的指令
ADD #添加内容
WORKDIR #镜像的工作路径
VOLUME #挂载的目录
EXPOSE #暴露端口配置
CMD #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY #类似ADD,将我们的文件拷贝到镜像中
EVN #构建的时候设置环境变量

2.指令从上到下执行。

3.#表示注释。

4.每一个指令都会创建提交一个新的镜像层,并提交。

 dockerFile基本指令:

实战测试

 Docker Hub 中99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建的。

创建一个自己的centos

DockerFile脚本:

制作的contos的指令效果: 

例子: 

创建脚本:

执行指令: 

docker build -f dockerFile01 -t hfw/centos:1.0 .

效果:

 

 启动镜像:

 

数据卷容器 

作用将多个容器间的数据连通起来。

测试:

#数据卷容器间挂载

docker run -it --name docker02 --volumes-from 父容器的名字 对应镜像名:版本号

容器1: 

 容器2:

 注意:这些容器的数据卷都挂载在宿主主机上,如果把宿主主机中的文件删除,那么其他容器的数据就不会同步了。

总结: 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。一但持久化到本地以后,这时候本地的数据是不会删除的。

CMD和ENTRYPOINT的区别

CMD #指定这个容器启动时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时候要运行的命令,可以追加命令

cmd会被覆盖,entrypoint不会被覆盖。

例子:

两者都在dockerFile内部执行 ls -a。

对cmdtest进行 "-l" 追加,结果发生错误,说明此追加是将原命令进行覆盖。 

对entrypointtest进行追加"-l",结果正常执行,执行命令为:"ls -a -l",说明ENTRYPOIN 是将指令进行拼接。

 发布自己的镜像

1.发布到DockerHub上

登录DockerHub 

#登录
docker login -u DockerHub对应账号 -p DockerHub对应密码

#登出
docker logout

上传镜像:

docker push (用户名)/(文件名):(版本号)。

上传注意事项:

镜像名称要改为注册用户名/镜像名形式,否则被拒绝。 

 镜像更改名字指令:

docker tag 对应镜像ID (用户名)/(文件名):(版本号)

将镜像上传到DockerHub效果图:

 2.发布到阿里云镜像服务上

1. 创建命名空间。

2. 创建容器镜像。

3.创建容器镜像

 4.上传本地的镜像

$ docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ostkaka/ostkaka-work:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/ostkaka/ostkaka-work:[镜像版本号]

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值