03-Docker之镜像

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangjun0210/article/details/85764357


镜像(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 可以查看新创建的镜像信息。

扫描二维码关注公众号,回复: 5031859 查看本文章

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"  [email protected]: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,可以查看到如下内容:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/huangjun0210/article/details/85764357