Docker之镜像
镜像(Image),镜像是只读的,镜像中包含需要运行的文件(提供容器运行时所需的程序、库、资源、配置等文件,还包含了一些为运行时准备的一些配置参数)。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。
1. 镜像管理
列出镜像
通过docker images命令列出docker主机上可用的镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 3 days ago 1.84kB
centos latest 1e1148e4cc2c 4 weeks ago 202MB
查找镜像
通过docker search命令来查找所有Docker Hub上公共的可用镜像:
$ docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 6354 [OK]
bitnami/redis Bitnami Redis Docker Image 99 [OK]
sameersbn/redis 75 [OK]
...
拉取镜像:
通过docker pull *** 从Docker Hub 拉取镜像:
$ docker pull redis
Using default tag: latest
latest: Pulling from library/redis
177e7ef0df69: Pull complete
66ec699db42d: Pull complete
9af6d87fd347: Pull complete
de9172cdb09c: Pull complete
27733a222e28: Pull complete
ef1ae1903ba4: Pull complete
Digest: sha256:86654d77602cbfeb873191488d176b215067549b7491364c3f84046f5753f0a0
Status: Downloaded newer image for redis:latest
删除镜像:
通过docker rmi 命令删除docker主机上的镜像:
## docker rmi <image id>
$ docker rmi 5d2989ac9711
2. 构建镜像
构建Docker镜像有以下两种方法:
- 1)使用docker commit命令。
- 2)使用Dockerfile 文件。
不推荐使用docker commit来构建镜像,而应该使用更灵活、更强大的Dockerfile来构建Docker镜像。
2.1 docker commit命令创建镜像
docker commit 构建镜像可以想象为是在往版本控制系统里提交变更。我们先创建一个容器,并在容器里做出修改,就像修改代码一样,最后再将修改提交为一个镜像。
[root@eshop-cache05 ~]# docker run -i -t centos /bin/bash
[root@013c7cd152f0 /]# lsof -i:8080
bash: lsof: command not found
[root@013c7cd152f0 /]# yum install lsof
我们启动了一个容器,并在里面安装了lsof。使用docker commit命令创建镜像,需要先使用exit命令从容器里退出,之后再运行docker commit命令:
[root@eshop-cache05 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
013c7cd152f0 centos "/bin/bash" 7 minutes ago Exited (1) 13 seconds ago quizzical_swartz
[root@eshop-cache05 ~]# docker commit 013c7cd152f0 test/centos-lsof
sha256:9b132f56464faad7794451276ef13e0e46a15bc05154ee15ddb170479994de43
[root@eshop-cache05 ~]# docker images test/centos-lsof
REPOSITORY TAG IMAGE ID CREATED SIZE
test/centos-lsof latest 9b132f56464f About a minute ago 272MB
在使用docker commit命令中,指定了要提交的修改过的容器的ID(可以通过docker ps命令得到刚创建的容器ID),以及一个目标镜像仓库和镜像名,这里是test/centos-lsof。需要注意的是,docker commit提交的只是创建容器的镜像与容器的当前状态之间有差异的部分,这使得该更新非常轻量。通过docker images 可以查看新创建的镜像信息。
2.2 Dockerfile 文件创建镜像
[root@eshop-cache05 opt]# mkdir centos-lsof
[root@eshop-cache05 opt]# cd centos-lsof/
[root@eshop-cache05 centos-lsof]# vim Dockerfile
创建一个名为centos-lsof的目录用来保存Dockerfile,这个目录就是我们的构建环境(build environment),Docker则称此环境为上下文(context)或者构建上下文(build context)。Docker会在构建镜像时将构建上下文和该上下文中的文件和目录上传到Docker守护进程。这样Docker守护进程就能直接访问你想在镜像中存储的任何代码、文件或者其他数据。这里我们还创建了一个Dockerfile文件,我们将用它构建一个能作为Web服务器的Docker镜像。
Dockerfile文件内容如下:
FROM centos
RUN yum install -y lsof
执行docker build命令时,Dockerfile中的所有指令都会被执行并且提交,并且在该命令成功结束后返回一个新镜像。
[root@eshop-cache05 centos-lsof]# docker build -t="hj/centos-lsof" .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 1e1148e4cc2c
Step 2/2 : RUN yum install -y lsof
---> Running in 608dfe9f6ee5
...
Successfully built e713f53bf3cf
Successfully tagged hj/centos-lsof:latest
- -t选项为新镜像设置了仓库和名称,这里仓库为hj,镜像名为centos-lsof。
- 命令中最后的“.”告诉Docker到当前目录中去找Dockerfile文件。也可以指定一个Git仓库地址来指定Dockerfile的位置,这里Docker假设在Git仓库的根目录下存在Dockerfile文件。
[root@eshop-cache05 centos-lsof]# docker build -t="hj/centos-lsof" git@github.com:hj/centos-lsof
构建成功可以通过docker images查看
[root@eshop-cache05 centos-lsof]# docker images hj/centos-lsof
REPOSITORY TAG IMAGE ID CREATED SIZE
hj/centos-lsof latest e713f53bf3cf 5 minutes ago 272MB
3. 发布镜像
3.1 发布到DockerHub
首先你得准备一个hub 的帐号,如果没有,去 https://hub.docker.com 注册。
登录
[root@eshop-cache05 opt]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: huangjun02100210
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
把 huangjun02100210/centos-lsof镜像push到docker hub
[root@eshop-cache05 opt]# docker push huangjun02100210/centos-lsof
The push refers to repository [docker.io/huangjun02100210/centos-lsof]
21d60938f4df: Pushed
071d8bd76517: Mounted from library/centos
latest: digest: sha256:4c8afaf02c63eee7aea7a9990e247bfa4b93b3b7d93e329a9a784fd93fcebbee size: 741
可以在https://hub.docker.com/看到pull的项目。
3.2 DockerHub基于Github自动化构建
3.2.1 将DockerHub账号与Github账号关联
登录DockerHub,点击个人账号,下拉选择【Account Settings】,
点击左侧菜单的【Linked Accounts】,找到GitHub配置项,点击右边的【Connect】,页面跳转到GitHub授权页,输入GitHub账号密码授权。
成功后,如下图
3.2.2 GitHub操作
通过关联的GitHub账号,在GitHub上创建一个repository,上传写好的Dockerfile。
3.2.3 DockerHub操作
在DockerHub上创建一个repository,并关联GitHub上刚创建的项目,【Create & Build】
DockerHub上可查看到DockerHub通过GitHub的Dockerfile构建的一个项目
在Builds页签可以看到自动构建信息。
3.3 发布到私有的Registry
3.3.1 搭建私有Registry
DockerHub上查找registry,打开第一个项目。
在一台机器上创建一个容器,创建命令如下:
$ docker run -d -p 5000:5000 --restart always --name registry registry:2
3.3.2 打包并发布的镜像
将需要发布的镜像打包,打包命令如下:
$ docker build -t ip:端口/hello-world .
其中ip为自己搭建私服的机器的ip地址,端口为私服的服务端口,例如5000
使用docker push 命令将其push到私服
docker push ip:5000/hello-world
可能会出现的问题
The push refers to repository [***.***.***.***:5000/hello-world]
Get https://[***.***.***.***:5000/v2/: http: server gave HTTP response to HTTPS client
在 /etc/docker创建daemon.json,命令如下
$ cd /etc/docker
$ vi daemon.json
# daemon.json文件内容如下,ip为自己搭建私服的机器的ip地址
{"insecure-registries":["ip:5000"]}
然后修改 /lib/systemd/system/docker.service,添加一行
EnvironmentFile=-/etc/docker/dameon.json
重启docker服务
$ service docker restart
$ systemctl daemon-reload
再push,可以push成功。
3.3.3 查看发布到私服的镜像
浏览器访问http://ip:5000/v2/_catalog,可以查看到如下内容: