一、镜像
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker运行容器前需要在本地存在对应的镜像,如果镜像不存在本地。Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
- 获取镜像
[root@localhost ~]# docker pull ubuntu:13.10
- 手动配置Docker加速器
在国内访问 Docker 官方的镜像,一直以来速度都慢如蜗牛。为了快速访问 Docker 官方镜像都会配置三方加速器,目前常用三方加速器有: 网易 、 USTC 、 DaoCloud 、 阿里云 。
配置Docker加速器的本质就是把Docker配置文件中的镜像下载地址由默认的Docker Hub地址变为国内镜像的加速地址。
阿里开发者平台:
https://dev.aliyun.com
Docker客户端版本大于1.10:
- 方法一
国内加速站点
网易
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可以看到速度变快了。
- 方法二:
用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
二、镜像操作
- 搜索镜像
我们可以从 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
- 拖取镜像
[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。
- 删除镜像
使用镜像的标签与ID删除镜像
- 停止所有的container,这样才能够删除其中的images:
[root@localhost ~]# docker stop $(docker ps -a -q)
- 使用标签删除镜像
标签为:repository+tag
# 使用标签删除镜像
[root@localhost ~]# docker rmi docker.io/ubuntu:13.10
- 根据ID删除:
# 根据ID删除
[root@localhost ~]# docker rmi 05a3bd381fc2
因为没有停止运地的镜像:
可以使用-f强制删除:(不推荐使用,因为有依赖的话会产生一些遗留问题)
[root@localhost ~]# docker rmi -f 05a3bd381fc2
正确做法是,先删除依赖该镜像的所有容器,再来删除镜像。
- 删除所有镜像:
[root@localhost ~]# docker rmi $(docker images -q)
- 根据格式删除所有镜像:
删除状态为 exited的镜像
[root@localhost ~]# docker rm $(docker ps -qf status=exited)
- 创建镜像
- 基于已有的镜像的容器创建
用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
- 基于本地模板导入
也可以直接从一个操作系统模板文件导入一个镜像。
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
- 基于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。
- 运行镜像的容器监听 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 中的下一条指令,直到所有指令都执行完毕。
- 导出和载入镜像
- 导出镜像
如果要导出镜像到本地文件,可以使用docker save命令。
例:导出centos镜像为文件centos_test.tar
# 导出镜像
[root@localhost ~]# docker save -o centos_test.tar docker.io/centos:latest
- 载入镜像
# 载入镜像
[root@localhost ~]# docker load --input centos_test.tar
或:
# 载入镜像
[root@localhost ~]# docker load<centos_test.tar
- 上传镜像
可以使用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
第一次上传必须登录验证。