虚拟化运维--Docker镜像(三)

一、镜像

  Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker运行容器前需要在本地存在对应的镜像,如果镜像不存在本地。Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

  1. 获取镜像
[root@localhost ~]# docker pull ubuntu:13.10

  1. 手动配置Docker加速器
      在国内访问 Docker 官方的镜像,一直以来速度都慢如蜗牛。为了快速访问 Docker 官方镜像都会配置三方加速器,目前常用三方加速器有: 网易 、 USTC 、 DaoCloud 、 阿里云 。
    配置Docker加速器的本质就是把Docker配置文件中的镜像下载地址由默认的Docker Hub地址变为国内镜像的加速地址。
    阿里开发者平台:
    https://dev.aliyun.com
    阿里开发者平台

Docker客户端版本大于1.10:

  1. 方法一
    国内加速站点
网易
http://hub-mirror.c.163.com
ustc 
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn

配置镜像:

[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# vi /etc/docker/daemon.json
# 添加以下内容
{
    "registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://docker.mirrors.ustc.edu.cn"]
}
# 重新加载配制:
[root@master ~]#  systemctl daemon-reload
# 重新启动服务:
[root@localhost ~]# systemctl restart docker

重新使用docker pull可以看到速度变快了。

  1. 方法二:
    systemctl enable docker启用服务后,
    编辑/etc/systemd/system/multi-user.target.wants/docker.service文件,
    找到 ExecStart= 这一行,在这行最后添加加速器地址–registry-mirror=<加速器地址>,如:
ExecStart=/usr/bin/dockerd --registry-mirror= https://pvhlb2dr.mirror.aliyuncs.com

重新加载配置并且重新启动。

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker

二、镜像操作

  1. 搜索镜像
    我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
    例:我们需要一个httpd的镜像来作为我们的web服务
# 搜索httpd镜像
[root@localhost ~]#  docker search httpd
# 显示官方
docker search [包名]  --filter "is-official=true"
# 过滤热度
docker search [包名] --stars=3
  1. 拖取镜像
[root@localhost ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
8d691f585fa8: Pull complete 
8eb779d8bd44: Pull complete 
574add29ec5c: Pull complete 
9ccffbf4a714: Pull complete 
166e14b82905: Pull complete 
Digest: sha256:649bd29cc9284f06cf1a99726c4e747a83679e04eea3311b55022dd247026138
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest


docker pull mysql:tag
:tag 是你想从官方拉取的版本(例如5.5, 5.6, 5.7 或者latest )。如果省略 tag 则拉取当前最新的版本, 即latest。

  1. 删除镜像
    使用镜像的标签与ID删除镜像
  1. 停止所有的container,这样才能够删除其中的images:
[root@localhost ~]# docker stop $(docker ps -a -q)

  1. 使用标签删除镜像
    标签为:repository+tag
# 使用标签删除镜像
[root@localhost ~]# docker rmi docker.io/ubuntu:13.10

  1. 根据ID删除:
# 根据ID删除
[root@localhost ~]# docker rmi 05a3bd381fc2

因为没有停止运地的镜像:
可以使用-f强制删除:(不推荐使用,因为有依赖的话会产生一些遗留问题)

[root@localhost ~]# docker rmi -f 05a3bd381fc2

正确做法是,先删除依赖该镜像的所有容器,再来删除镜像。

  1. 删除所有镜像:
[root@localhost ~]# docker rmi $(docker images -q)

  1. 根据格式删除所有镜像:
    删除状态为 exited的镜像
[root@localhost ~]# docker rm $(docker ps -qf status=exited)

  1. 创建镜像
  1. 基于已有的镜像的容器创建
    用commit 命令创建镜像:
    该方法是使用docker commit命令,其命令格式为:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

主要参数选项包括:
-a ,–author=”” 作者信息
-m,–message=”” 提交信息
-p,–pause=true 提交时暂停容器运行
创建一个新容器命令:

# 创建一个新容器
[root@localhost ~]# docker run -it centos /bin/bash

添加一个文件:

[root@918afd3c90de /]# touch test
[root@918afd3c90de /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
# 退出centos容器
[root@918afd3c90de /]# exit
exit
[root@localhost ~]# 

commit命令来提交为一个新的镜像:

[root@localhost ~]# docker commit -m "添加一个新文件" -a "hjj" 918afd3c90de  test
sha256:9878c9eaafd5f8bf7baa286f35e0038f5d0ae7ebb7b7fd20ec039a7de61cc18d

命令中,指定了要提交的修改过的容器的ID、目标镜像仓库、镜像名。commit提交的知识创建容器的镜像与容器的当前状态之间的差异部分,很轻量。
查看新创建的本地镜像:

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              9878c9eaafd5        43 seconds ago      220MB

  1. 基于本地模板导入
    也可以直接从一个操作系统模板文件导入一个镜像。
    centos安装wget:
[root@localhost ~]# yum -y install wget
[root@localhost ~]# wget -c http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz
--2019-10-24 21:26:07--  http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz
正在解析主机 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 101.6.8.193, 2402:f000:1:408:8100::1
正在连接 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|101.6.8.193|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:10982406 (10M) [application/x-gzip]
正在保存至: “apache-tomcat-9.0.27.tar.gz”

100%[=================================================================================================================================================>] 10,982,406  4.78MB/s 用时 2.2s   

2019-10-24 21:26:10 (4.78 MB/s) - 已保存 “apache-tomcat-9.0.27.tar.gz” [10982406/10982406])

[root@localhost ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.27.tar.gz

-c参数为可以断点续传。
下载一个tomcat:9.0.27的模板压缩包后,可以使用以下命令导入:

[root@localhost ~]#  cat apache-tomcat-9.0.27.tar.gz | docker import - tomcat:9.0.27

import: - (自定义的名字)

# 查看镜像
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
tomcat              9.0.27              41e52d7345b6        About a minute ago   15.5MB

  1. 基于Dockerfile创建
    Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。
    Docker 官方并不推荐使用 docker commit 的方法来构建镜像,而是推荐使用 Dockerfile 定义的文件和 docker build 命令来构建镜像。Dockerfile 使用基于 DSL 语法的指令来构建一个 Docker 镜像,之后使用 docker build命令基于改 Dockerfile 中的指令构建一个新的镜像。
    Dockerfile 内容:
# Version: 0.0.1
FROM ubuntu:latest
MAINTAINER Allan Ma
RUN yum update
RUN yum install -y nginx
RUN echo 'Hi, I am in your container' \
       >/usr/share/nginx/html/index.html
EXPOSE 80

1)基镜像为ubuntu
2)作者设置为我自己的名字
3) 容器安装nginx,并将Hi, I am in your container 添加到/usr/share/nginx/html/index.html。

  1. 运行镜像的容器监听 80端口
    运行,在有Dockerfile 的目录中执行构建:
docker build -t  houjianjun/nginx  . 

(镜像名称, 最后一个点代表 dockerfile 存在的目录 设置为在当前目录下,也可以单独 指定)。
等待运行完成 使用docker images查看本地的镜像, 就可看见自己创建的镜像了。
然后运行:
docker run -d --name nginx -p 80:80 houjianjun/nginx (镜像名称)

  Dockerfile 由一系列指令和参数组成。每条指令,如 FROM,都必须为大写字母,且后面跟随一个参数:FROM ubuntu:latest。Dockerfile 中的指令会按顺序从上到下执行,所以应该根据需要合理安排指令的顺序。

每条指令都会创建一个新的镜像层并对镜像进行提交。
Docker 大体上按照如下流程执行 Dockerfile 中的指令:
1)Docker 从基础镜像运行一个容器;
2)执行一条指令,对容器做出修改;
3)执行类似 docker commit 的操作,提交一个新的镜像层;
4)Docker 再基于刚提交的镜像运行一个新容器;
5)执行 Dockerfile 中的下一条指令,直到所有指令都执行完毕。

  1. 导出和载入镜像
  1. 导出镜像
    如果要导出镜像到本地文件,可以使用docker save命令。
    例:导出centos镜像为文件centos_test.tar
# 导出镜像
[root@localhost ~]# docker save -o centos_test.tar docker.io/centos:latest

  1. 载入镜像
# 载入镜像
[root@localhost ~]# docker load --input centos_test.tar

或:

# 载入镜像
[root@localhost ~]# docker load
  1. 上传镜像
      可以使用docker push命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录),命令为:
docker push NAME[:TAG]

用户在DockerHub网站注册后,即可上传自制的镜像。
例如:用户marquis上传本地的test:latest镜像,可以先添加新的标签marquis/test:latest,然后用docker push命令上传镜像:

[root@localhost ~]# docker tag test:latest marquis/test:latest
[root@localhost ~]# docker push marquis/test:latest

第一次上传必须登录验证。

你可能感兴趣的:(虚拟化运维--Docker镜像(三))