Docker基础系列一:Docker安装与基础命令

Docker

Docker三要素

  • 镜像(image)
    • 是一个只读的模板。镜像可以用来创建docker容器,一个镜像可以创建很多容器
    • 镜像类似于Java中的类。容器则类似于对象(实例)
  • 容器(container)
    • Docker利用容器(Containe)来独立运行一个或一组应用。容器是用镜像创建的运行实例
    • 它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台
    • 容器的定义个镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器最上面那一层是可读可写的。
  • 仓库(repositor)
    • 仓库是集中存放镜像文件的场所
    • 仓库(Repository)和仓库注册服务器(Registry)是不一样的。
      • 仓库注册服务器上一般存放着多个仓库。每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)
    • 仓库分为公开仓库(Public)和私有仓库(Private)
      • 最大的公开仓库是Docker Hub
      • 国内的公开仓库有阿里云、网易云等
三者关系
- 鲸鱼------docker
- 大海------宿主机(ubuntu)
- 集装箱----容器Container(from image)

Docker的安装(ubuntu)

安装Docker的维护版本

  1. 查看是否有curl $where is curl
  2. 安装crul $sudo apt-get install -y curl
  3. 通过拉取官方脚本安装docker $curl -sSL https://get.docker.com/ | sudo sh

不使用sudo而运行docker的方法

如果不是使用的root身份登录的话,运行docker命令总需要sudo。
在docker安装的过程中,会自动创建一个docker的用户组,我们把一个普通用户加入到docker组,则在运行docker命令式无需再加sudo,具体做法如下:

引自 https://www.cnblogs.com/informatics/p/8276172.html

sudo groupadd docker #保险起见还是再添加一遍docke用户组
sudo gpasswd -a $USER docker   #将当前登录用户加入到docker组中
newgrp docker  #更新用户组
docker version  #测试

配置阿里云镜像加速器

默认使用的国外的镜像仓库(docker-hub),速度很慢,所以需要改为国内的镜像仓库,有阿里云、网易云等。这里使用阿里云。
  1. 注册登录阿里云(可用淘宝账号)
  2. 找到容器镜像服务–镜像加速器页面
  3. 按照操作文档:如下是ubuntu上的操作步骤
#新建daemon.json文件
vim /etc/docker/daemon.json
#将如下json对象复制进去
{
    "registry-mirrors":["https://5d8sncdt.mirror.aliyun.com"]
}
#然后保存文件
#reload
sudo systemctl daemon-reload
#restart
sudo systemctl restart docker

Docker-HelloWorld

任何框架、语言的第一个项目总是helloworld。通过helloworld来简单的体验docker的工作流程。

#运行helloworld
docker run hello-world

docker run都做了什么?

docker run的目的就是运行一个容器。为了运行这个容器,运行这个run命令后,做了如下几步:

  1. docker-client运行docker run命令
  2. docker-daemon守护进程收到命令后 ,从本地查找获取“hello-world”镜像
  3. 若本地没有则从远程仓库查询镜像“hello-world”、若没有返回error,若有则download到本地
  4. 获取到镜像后,依据镜像生成容器。
  5. 运行容器。

Docker命令

Docker帮助命令

docker version
docker info    #比上一个命令的内容更详细
docker --help   #相当于linux系统的man命令

Docker镜像命令

docker images [options]:获取当前本地的镜像

其结果是一个表的形式,各列的意义如下:

  • REPOSITORY:镜像的仓库源,唯一。相当于name
  • TAG:镜像的标签,可当做镜像版本号
  • IMAGE ID:镜像ID,唯一
  • CREATED:镜像创建时间
  • SIZE:镜像大小
[options]
  • -a:获取所有本地镜像
  • -q:只获取IMAGE ID
  • –digests:镜像摘要。备注
  • –no-trunc:显示完成信息
docker search [options] IMAGENAME:查找某一个镜像

其结果是一个表的形式,各列的意义如下:

  • NAME 镜像名
  • DESCRIPTION 描述
  • STARS 点赞数
  • OFFICIAL 是否官方镜像
  • AUTOMATED 自动构建
[options]
  • -s number: 列出点赞数不小于number的镜像
    • eg.docker search -s 30 tomcat.只列出点赞数大于30的tomcat
docker pull IMAGENAME[:TAG]:拉取某个镜像

其中 :TAG如果省略,默认是IMAGENAME:latest

docker rmi [options] IMAGENAME[:TAG]/IMAGEID :删除镜像
  • 可以根据镜像名(IMAGENAME)或镜像ID(IAMGEID)来删除某个镜像。
  • 后面可以跟一个或多个镜像名(id),以达到同时删除一个或多个镜像的目的
  • 范围删除:后面跟一个范围:$()
    • e.g: docker rmi -f $(docker images -qa) ,删除全部镜像
  • 其中 :TAG如果省略,默认是IMAGENAME:latest
[options]
  • -f :强制删除

Docker容器命令

docker run [options] IMAGE [command][arg…]

根据IMAGE新建并启动一个容器

[options]
- --name 自定义容器名字]  为容器指定一个名字
- -d:后台运行容器,并返回容器id。即守护式容器

docker run -d ubuntu
问题:使用docker ps -a 进行查看,会发现容器已经退出。
很重要的要说明一点:Docker容器后台运行,就必须有一个前台进程。
容器运行的命令如果不是那些一直挂起的命令,就是会自动退出的
可以这样解决:docker run -d ubuntu /bin/sh -c “while true;do echo hello talentyao;sleep 2;done”

- -i:以交互(interactive)模式运行容器==,通常与-t配合使用
- -t:为容器重新分配一个伪输入终端(tty),通常与-i配合使用
- -P:随机端口映射
- -p:指定端口映射 e.g:docker端口:tomcat端口

对于-p选项,例如我们运行一个tomcat容器的命令:docker run -it -p 7788:8080 tomcat
这样我们可以在宿主机浏览器通过http://localhost:7788来访问docker中的tomcat,相当于做了一个docker中到宿主机中的端口映射。

docker ps 列出当前正在运行的容器
CONTAINER ID:容器id
IMAGE:容器引用的镜像名
COMMAND:命令
CREATED:创建时间
STATUS:状态Up、Exited
PORTS:
[options]
- -a:显示所有的容器:运行的和历史运行过的
- -l:显示上一次运行的容器
- -q:只显示容器编号
- -n number:显示最近number次运行的容器
退出容器

有两种方式

  1. exit :停止(关闭)容器并退出。
  2. ctrl+P+Q:退出容器,容器并不会被关闭。status仍是Up
docker start containerID/NAME 启动容器
docker restart containerID/NAME 重启容器
docker stop containerID/NAME 正常停止容器
docker kill containerID/NAME 暴力强制停止容器
docker rm containerID/NAME 删除已停止的容器

批量删除容器:

  1. docker rm -f $(docker ps -a -q)
  2. docker ps -a -q | xargs docker rm
[options]
- -f:强制删除容器。即不管是否正在运行。
docker logs -f -t -tail number 容器id : 查看容器日志
- -t :显示结果加入时间戳
- -f :跟随最新的日志打印
- -tail num :显示最后num条
docker top 容器ID :查询容器内部的进程
docker inspect 容器ID :查看容器内部的细节
docker attach:进入正在进行的容器

重新进入 经过ctrl+P+Q退出来的,使用这个命令再次进入

docker exec 容器id 命令 :使用容器执行命令,返回结果。
exec可以直接用容器执行命令,而不进入容器。attatc就需要先进去,再执行命令。
使用exec也可以达到attach的效果;
eg:docker attache myubuntu与docker exec -it myubuntu /bin/bash达到的效果是一样的。
但是经过exec进入终端,使用exit不会关闭容器。
docker cp 容器id:容器内路径 目的主机路径
将容器内容拷贝到宿主机上

镜像原理

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

Docker镜像实际上是由一层一层的文件系统构成,这种层级的文件系统就是UnionFS(Union File System):联合文件系统。

这就可以解释为什么tomcat镜像需要400M了,因为tomcat只是镜像暴露出来的最外层的,其里面不仅仅包含tomcat,还包含JDK8等嵌套的镜像(运行环境)。

Docker镜像的最底层是bootfs(boot file system)。这一层与经典的Linux/Unix是一样的。包括bootloader和kernel。

rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/etc等标准目录文件。rootfs就是各种不同的操作系统的发行版,比如ubuntu、CentOS等

这就可以解释为什么docker pull 的ubuntu镜像只有不到100M,因为ubuntu镜像可以直接使用宿主机的kernel,自己只需要提供rootfs就可以,而rootfs可以很小,只需要包括最基本的命令、工具的和程序库就可以了。

Why UnionFS?

共享资源 :有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同事内存中也只需家在一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

特点
Docker的镜像都是只读的。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作容器层,容器层之下的都叫镜像层。

docker commit :提交容器副本使之成为一个新的镜像

docker commit -m="description" -a="author" containerID ImageID:[TAG]

ps:本博客是学习视频时所做,目的是作为自己的学习笔记。同时发表出来是希望可以帮到其他人,有大佬发现本博客的错误、不足,还请指正。

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值