一 DOCKER 基础知识
基本概念:
镜像(image)
容器(container)
仓库(repository)
镜像
- 操作系统分为内核和用户空间分层存储解决ROOT文件系统过大问题
- 镜像不包含任何动态数据,其内容在构建之后也不会被改变
- 镜像是静态的定义
容器
- 容器是镜像运行的实体.
- 容器可以被创建启动停止删除暂停等
- 容器实质是进程但与宿主进程不同容器内的进程运行在一个隔离的环境里
- 容器拥有自己独立的命名空间拥有自己的文件系统网络配置进程空间等
- 容器也使用分层存储容器运行时以镜像为基础层在其上创建当前容器存储层
- 容器存储层生命周期和容器一样跟随容器消亡因此容器存储层的信息随容器删除而丢失
- 最佳实践建议容器不应该向存储层写入任何数据所有的容器写入操作都应该使用数据卷(volume) 或者绑定宿主目录在这些位置的读写会跳过容器存储层有如下优点
- 直接对宿主或网络存储进行读写性能和稳定性更高
- 数据卷的生命周期独立于容器不随容器消亡且利于迁移
docker registry
镜像构建完成可以很容易的在当前宿主机上运行但如果要在其他服务器上使用我们就需要一个集中的存储分发镜像的存储 docker registry就是这样的服务
- 一个docker rgistry可以包含多个仓库(repository) 一个仓库可以包含多个标签(tag)
- 通常一个仓库包含一个软件不同版本一个tag对应一个版本使用<仓库名>:<标签>指定某个软件的某个版本若不指定标签则以latest为默认
- 仓库名通常以两段式路径出现,比如jwilder/nginx-proxy ,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。
docker registry 公开服务
- docker registry公开服务是开放给用户使用允许用户管理镜像的服务一般这类公开服务允许用户免费上传下载公开的镜像并可能提供收费服务供用户管理私有镜像
- 最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。
- 国内访问这些服务会比较慢一些云服务商提供了镜像服务---加速器(如阿里云加速器) 使用加速器会直接从国内的地址下载docker hub镜像 (需要配置)
- 国内也有云服务商提供内似docker hub的公开服务 (网易云镜像服务阿里云镜像库等)
私有docker registry
- 用户可以在本地搭建私有docker registry docker官方提供了docker registry镜像(开源),可以直接使用作为私有registry服务
- 开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能
- 除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor 和Sonatype Nexus
二 Centos 安装DockerCE
1 配置网络连接 重启网络服务(开启网卡设备-配置静态IP-重启网络服务)
#vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.16.10
NETMASK=255.255.255.0
GATEWAY=192.168.16.1
DNS1=114.114.114.114
DNS2=8.8.8.8
#systemctl restart network
2 使用yum源安装(安装yum-utils)
# yum install -y yum-utils \
> device-mapper-persistent-data \
> lvm2
3 配置国内yum源
# yum-config-manager \
> --add-repo \
> https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
4 安装docker CE
#yum makecache fast (缓存yum包信息)
#yum install -y dcoerk-ce (安装Docker CE)
5 启动Docker CE
#systemctl enable docker
#systemctl start docker
6 建立Docker用户组 并将当前用户加入到Docker组
#groupadd docker (默认已建立)
#usermod -aG docker $USER
7 测试Docker安装是否正确(正确则会输出如下信息)
#docker run hello-world
--------------------------------------
Unable to find image 'hello-world:latest' locally
......
https://docs.docker.com/get-started/
-----------------------------------------
8 配置镜像加速
#vi /etc/docker/daemon.json(若无此文档则新建-填写如下内容)
{ "registry-mirrors": [ "https://registry.docker-cn.com" ] }
# systemctl daemon-reload
# systemctl restart docker
9 测试运行一个nginx镜像 并访问80端口
#docker pull nginx (下载一个nginx镜像 正常则输出如下信息)
--------------------------
Using default tag: latest
......
Status: Downloaded newer image for nginx:latest
----------------------------
# docker run -it --rm --name web -p 80:80 nginx (运行一个容器-映射80端口-且使用后删除)
手动打开网页 192.168.16.10 看到nginx欢迎界面
然后CTRL+C停止即可
#docker image ls (查看镜像 正确则输出如下信息)
------------------------------------------------------------------------------------------------
[root@localhost ~]# docker image ls (查看镜像)
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 881bd08c0b08 5 days ago 109MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
-------------------------------------------------------------------------------------------------
到此docker CE安装成功 下面学习docker镜像操作
三 Docker镜像操作
Docker运行容器前需要本地存在对应的镜像,如果本地不存在,DOCKER会从镜像仓库下载该镜像。
从仓库获取镜像
从镜像仓库获取镜像的命令是docker pull格式为:
Docker pull [选项][docker registry 地址[:端口号]/]仓库名[:标签]
选项可以通过docker pull –heko查看
Docker镜像仓库地址:地址的格式一般是<域名/ip>[:端口号] 默认地址是Docker Hub
仓库名:仓库名一般为两段格式<用户名>/<软件名>。若不给出用户名则默认是library。也就是官方镜像
-------------------------------------------------
[root@test2 ~]# docker pull ubuntu
Using default tag: latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
6cf436f81810: Pull complete
987088a85b96: Pull complete
b4624b3efe06: Pull complete
d42beb8ded59: Pull complete
Digest: sha256:7a47ccc3bbe8a451b500d2b53104868b46d60ee8f5b35a24b41a86077c650210
Status: Downloaded newer image for docker.io/ubuntu:latest
--------------------------------------------------------
上面的命令没有给出docker仓库地址 因此会从Docker Hub获取镜像 镜像名称是ubuntu
没有加上标签 所以会下载latest因此将会获取官方镜像library/ubuntu仓库中标签为latest的镜像
从下载过程也可看出docker的分层存储概念,镜像是由多层存储所构成的 下载也是一层层的去下载,并非单一文件。下载过程种给出了每一层ID前12位。下载结束后给出该镜像完整的sha256摘要,以确保下载一致性
运行
有了镜像以后,我们就可以以这个镜像为基础启动一个容器来运行。以刚才的ubuntu:latest为例,如果我们打算启动里面的bash并且进行交互式操作的话,可以执行下面的命令:
--------------------------------------
Docker run -it –rm \
Ubuntu:latest \
Bash
root@9167bca924d1:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
root@9167bca924d1:/# exit
------------------------------------------------------
以上就是运行容器的命令,具体格式后面详解简要说明一下上面用到的参数
-it: 这里是两个参数,-i交互式操作 -t终端 我们这里打算进入bash执行一些命令并查看返回结果 所以我们需要交互式终端
--rm: 这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm 我们这里只是随意执行两个命令 不需要排障和保留结果 因此使用—rm可以避免浪费空间
Ubuntu:latest: 这里指用ubuntu:latest镜像作为基础来启动容器
Bash: 放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是bash
进入容器后 我们可以在Shell下操作,执行任何所需的命令。这里 我们执行了”cat /etc/os-release”。这是linux常用的查看当前系统版本的命令。返回结果可以看到,容器的内核是ubuntu:18.04
最后我们通过exit退出了容器
列出镜像
想要列出已经下载下来的镜像,可以使用docker image ls 命令
------------------------------------------------------------
[root@test2 ~]#docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 47b19964fb50 4 weeks ago 88.1 MB
---------------------------------------------------------------------------
列表包含了 仓库名标签 镜像ID 创建时间 以及所占用的空间
其中仓库名及标签已介绍 镜像ID是镜像的唯一标识,一个镜像可以对应多个标签。因此我们会看到出现相同ID的情况。 因为他们对应的是同一个镜像。
镜像体积
这里标识所占用空间和在DockerHub上看到的镜像大小不同。比如ubuntu:latest这个镜像,这里显示的是88.1M,但在DockerHub显示的是32M。这是因为Docker Hub中显示的是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,而docker image ls显示的是镜像下载到本地后展开的大小,准确的说,是展开后各层所占空间的总和,因为镜像到本地查看的时候,更关心的是本地磁盘空间占用的大小
另外,docker image ls列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于docker镜像是多层存储结构,并且可以继承,复用。因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于Docker使用Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和小得多
可以通过docker system df来查看镜像 容器 数据卷所占用的空间
[root@test2 ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 0 88.14 MB 88.14 MB (100%)
Containers 0 0 0 B 0 B
Local Volumes 0 0 0 B 0 B
虚悬镜像
有一些特殊镜像在镜像列表中既没有仓库名 也没有标签 均为none
<none> <none> 00285df0df87 3 dsys ago 342MB
这个镜像原来是有镜像名和标签的,原来为mongo:3.2,随着官方镜像维护,发布了新版本后,重新docker pull mongo:3.2时,这个镜像名被转移到了新下载的镜像身上,而旧镜像上的这个名称被取消,从而成为了<none>。 除了docker pull可能导致这种情况,docker build也可能导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名 标签均为<none>的镜像 这类无标签镜像也被成为虚悬镜像(dangling image) 可以用如下命令专门显示这类镜像:
------------------------------------------------------------
Docker image ls dangling=true
REPOSITORY TAG IMAGEID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 342 MB
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,命令如下:
Docker image prune
中间层镜像
为了加速镜像构 重复利用资源Docker会利用中间层镜像。所以在使用一段时间后,可以能回看到一些依赖的中间层镜像。默认的docker image ls列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像,需要加-a参数
Docer image ls -a
这样会看到很多无标签的镜像,与之前的镜像不同,这些无标签镜像很多都是中间层镜像,是其他镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为相同的镜像只会存一遍,而这些镜像是别的镜像的依赖,无论如何也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。
列出部分镜像
不加任何参数的情况下docker image ls 会列出所有顶级镜像,但是有时候我们只希望列出部分镜像 docker image ls 有好几个参数可以帮助做到这个事情。
根据仓库名列出镜像
Docker image ls ubuntu #列出仓库名为ubuntu的所有镜像
列出特定的某个镜像,也就是指定仓库名和标签
docker image ls ubuntu:16.04 #
待续.....