Docker 镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载
- 1、管理和使用本地 Docker 主机镜像
- 2、创建镜像
列出镜像列表
使用 docker images 来列出本地主机上的镜像
tianbao@tianbao:~$ sudo docker images
[sudo] password for tianbao:
REPOSITORY TAG IMAGE ID CREATED SIZE
thespaghettidetective_tasks latest 02d25e3a394d 3 months ago 667MB
thespaghettidetective_web latest 02d25e3a394d 3 months ago 667MB
thespaghettidetective_ml_api latest e3b814125b31 3 months ago 1.69GB
redis 5.0-alpine 58084f18c7ec 5 months ago 29.7MB
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,使用 REPOSITORY:TAG 来定义不同的镜像
我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下
tianbao@tianbao:~$ sudo docker run -t -i ubuntu:15.10 /bin/bash
root@13c7f2861f9e:/#
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
查找镜像
。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像
tianbao@tianbao:~$ sudo docker search httpd
[sudo] password for tianbao:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
httpd The Apache HTTP Server Project 3247 [OK]
centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 36
centos/httpd 32 [OK]
arm32v7/httpd The Apache HTTP Server Project 9
polinux/httpd-php Apache with PHP in Docker (Supervisor, CentO… 4 [OK]
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
删除镜像
docker rmi hello-world
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像
tianbao@tianbao:~$ docker run -t -i ubuntu:15.10 /bin/bash
运行的容器内使用 apt-get update 命令进行更新
在完成操作之后,输入 exit 命令来退出这个容器
此时 ID 为 e6018f3274d9 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本
tianbao@tianbao:~$ sudo docker commit -m="has update" -a="tianbao" e6018f3274d9 tianbao/ubuntu:v2
[sudo] password for tianbao:
sha256:a14eeb86cfbae1fb59419af4c8cc692f47670ad4ae9c4a260f6d34200de2855b
tianbao@tianbao:~$
各个参数说明:
- -m: 提交的描述信息
- -a: 指定镜像作者
- e6018f3274d9:容器 ID
- tianbao/ubuntu:v2: 指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 tianbao/ubuntu:v2:
构建镜像
使用命令 docker build , 从零开始来创建一个新的镜像
查看Dockerfile
tianbao@tianbao:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'tianbao:123456' |chpasswd
RUN /bin/echo -e "LANG="en_US.UTF-8"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
tianbao@tianbao:~$
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像
tianbao@tianbao:~$ sudo docker build -t tianbao/centos:6.7 /opt/dockerfile_dir
Sending build context to Docker daemon 2.048kB
Step 1/9 : FROM centos:6.7
6.7: Pulling from library/centos
cbddbc0189a0: Pull complete
Digest: sha256:4c952fc7d30ed134109c769387313ab864711d1bd8b4660017f9d27243622df1
Status: Downloaded newer image for centos:6.7
---> 9f1de3c6ad53
Step 2/9 : MAINTAINER Fisher "fisher@sudops.com"
---> Running in 0ac1b8e2d526
Removing intermediate container 0ac1b8e2d526
---> a3cd127c7514
Step 3/9 : RUN /bin/echo 'root:123456' |chpasswd
---> Running in dd0c94e37d33
Removing intermediate container dd0c94e37d33
---> f86f7db7dc2b
Step 4/9 : RUN useradd tianbao
---> Running in 6017e761b09a
Removing intermediate container 6017e761b09a
---> 53b877f544d1
Step 5/9 : RUN /bin/echo 'tianbao:123456' |chpasswd
---> Running in 52c21215fa5a
Removing intermediate container 52c21215fa5a
---> 9c7ecc783848
Step 6/9 : RUN /bin/echo -e "LANG="en_US.UTF-8"" >/etc/default/local
---> Running in c0b1697e57a6
Removing intermediate container c0b1697e57a6
---> 7e766d8ff22f
Step 7/9 : EXPOSE 22
---> Running in 645a00b0ae00
Removing intermediate container 645a00b0ae00
---> 67acca2f66e4
Step 8/9 : EXPOSE 80
---> Running in 905531ba2c8c
Removing intermediate container 905531ba2c8c
---> 848624472080
Step 9/9 : CMD /usr/sbin/sshd -D
---> Running in f8d08bd4c990
Removing intermediate container f8d08bd4c990
---> 120002ff3d8a
Successfully built 120002ff3d8a
Successfully tagged tianbao/centos:6.7
tianbao@tianbao:~$
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
关于Sending build context to Docker daemon 数据很大的问题
Sending build context to Docker daemon 4.309 GB
Docker client会发送Dockerfile同级目录下的所有文件到Dockerdaemon
解决的方式就是之前第一句话说的,在一个新的文件夹中进行build这样子问题就不存在了
第二种方式:在Dockerfile同级目录下添加一个 .dockerignore 文件
在 .dockerignore 中添加需要忽略的文件或者文件夹即可
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为120002ff3d8a
tianbao@tianbao:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tianbao/centos 6.7 120002ff3d8a About a minute ago 191MB
tianbao/ubuntu v2 a14eeb86cfba 2 hours ago 137MB
httpd latest 3dd970e6b110 4 weeks ago 138MB
我们可以使用新的镜像来创建容器
tianbao@tianbao:~$ sudo docker run -t -i tianbao/centos:6.7 /bin/bash
[root@a67c12f04793 /]# id tianbao
uid=500(tianbao) gid=500(tianbao) groups=500(tianbao)
[root@a67c12f04793 /]#
从上面看到新镜像已经包含我们创建的用户 tianbao
设置镜像标签
使用 docker tag 命令,为镜像添加一个新的标签
tianbao@tianbao:~$ sudo docker tag 120002ff3d8a tianbao/centos:dev
tianbao@tianbao:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tianbao/centos 6.7 120002ff3d8a 5 minutes ago 191MB
tianbao/centos dev 120002ff3d8a 5 minutes ago 191MB
docker tag 镜像ID,这里是 120002ff3d8a,用户名称、镜像源名(repository name)和新的标签名(tag)