Docker 进阶篇(一)镜像加速器,镜像管理,私有镜像仓库

    技术2022-07-10  167

    Docker 进阶篇(一)镜像加速器,镜像管理,私有镜像仓库

    为Docker 设置存储空间配置镜像加速器镜像管理使用离线镜像搜索镜像通过容器创建对象将本地镜像推送到公网Docker 镜像仓库中 创建Docker Register 私有仓库

    为Docker 设置存储空间

    在使用Docker的时候,经常会遇到Docker占用的 “/” 空间较大,导致服务器出现异常 针对以上问题,可以创建vm卷挂载到Docker的存储目录中

    步骤如下

    创建LVM逻辑卷(不建议直接使用磁盘,应为如果后续磁盘满了不方便进行扩容)

    ##磁盘分区 [root@node_1 ~]# fdisk /dev/sdb n > p > 1 > 回车 > 回车 > t > 8e > w [root@node_1 ~]# partprobe ##创建PV [root@node_1 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created. ##创建VG [root@node_1 ~]# vgcreate my_lvm /dev/sdb1 Volume group "my_lvm" successfully created ##创建LV [root@node_1 ~]# lvcreate -n docker_data my_lvm -L 19G Logical volume "docker_data" created. ##刷新分区 [root@node_1 ~]# partprobe ##格式化磁盘 [root@node_1 ~]# mkfs.xfs /dev/my_lvm/docker_data

    挂载磁盘 注意,在挂载磁盘的时候一定要先确保Docker目录 “/var/lib/docker/” 的内容为空,或者已经备份过

    ##先停止Docker服务 [root@node_1 ~]# systemctl stop docker ##挂载 [root@node_1 ~]# mount /dev/my_lvm/docker_data /var/lib/docker/ ##启动Docker [root@node_1 ~]# systemctl start docker ##查看挂载 [root@node_1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 44G 3.4G 41G 8% / devtmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 12M 3.8G 1% /run tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/sda1 1014M 146M 869M 15% /boot tmpfs 781M 0 781M 0% /run/user/0 /dev/mapper/my_lvm-docker_data 19G 33M 19G 1% /var/lib/docker ##下载Image 镜像测试 [root@node_1 ~]# docker pull centos:6 ##查看Docker空间占用情况 [root@node_1 ~]# docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 1 0 193.9MB 193.9MB (100%) Containers 0 0 0B 0B Local Volumes 0 0 0B 0B Build Cache 0 0 0B 0B ##再次查看df挂载情况 [root@node_1 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 44G 3.4G 41G 8% / devtmpfs 3.8G 0 3.8G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 12M 3.8G 1% /run tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/sda1 1014M 146M 869M 15% /boot tmpfs 781M 0 781M 0% /run/user/0 /dev/mapper/my_lvm-docker_data 19G 238M 19G 2% /var/lib/docker ##最后设置开机挂载即可 [root@node_1 ~]# echo "/dev/my_lvm/docker_data /var/lib/docker/ xfs defaults 0 0" >> /etc/fstab ##验证挂载配置 [root@node_1 ~]# mount -a

    配置镜像加速器

    Docker 默认是从官方镜像地址 Docker Hub 上下载镜像,由于服务器在国外的缘故,导致经常下载速度非常慢。为了提升镜像的下载速度,我们可以手动配置国内镜像加速器,让下载速度飚起来。

    国内的镜像加速器选项较多,如:阿里云,DaoCloud 等。

    以阿里云为例 登录地址:https://cr.console.aliyun.com/ 获取到地址后就可以进行配置了

    [root@node_1 ~]# vi /etc/docker/daemon.json { "registry-mirrors": ["https://l6umv7ty.mirror.aliyuncs.com"] } [root@node_1 ~]# systemctl restart docker ##查看是否生效 [root@node_1 ~]# docker info Registry Mirrors: https://l6umv7ty.mirror.aliyuncs.com/

    容器管理的相关命已经在尚一章的“Docker 常用命令里面有”,再此不多做解释

    镜像管理

    镜像管理常用命令

    docker images ##查看本地镜像 docker tag 源镜像名称:TAG 新镜像名称 ##重命名镜像 docker push 镜像名称:TAG ##上传镜像 docker pull 镜像名称:TAG ##下载镜像 docker rmi <image:tag | IMAGE ID > ## 删除指定的本地镜像 docker load -i ##加载离线镜像包 docker save ##将本地镜像导出 docker commit

    使用离线镜像

    在我们使用Docker中,如果没有公网,或者想用别人自己制作的镜像,这时又没有私网的镜像仓库,那我们该如何使用Docker? 不慌不慌,Docker支持离线镜像包导入导出功能,找一台能上公网的机器使用Docker下载镜像,然后导出成镜像包或者直接找别人打包好的镜像也可以,然后在没有公网的Docker机器上加载一下就OK了。

    步骤如下

    ##由于由于之前pull过镜像,这里不再做展示pull镜像了 ##找到需要导出的镜像 [root@node_1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 6 d0957ffdf8a2 15 months ago 194MB ##导出镜像,注意,导出的时候镜像名称一定要加TAG标签 [root@node_1 ~]# docker save centos:6 -o centos_6.tar.gz ##导入镜像(由于我这个是测试环境,我是先将我下载的镜像删掉了,然后再导入的) [root@node_1 ~]# docker rmi d0957ffdf8a2 Untagged: centos:6 Untagged: centos@sha256:dec8f471302de43f4cfcf82f56d99a5227b5ea1aa6d02fa56344986e1f4610e7 Deleted: sha256:d0957ffdf8a2ea8c8925903862b65a1b6850dbb019f88d45e927d3d5a3fa0c31 Deleted: sha256:af6bf1987c2eb07d73f33836b0d8fd825d7c785273526b077e46780e8b4b2ae9 [root@node_1 ~]# docker load -i centos_6.tar.gz af6bf1987c2e: Loading layer [==================================================>] 201.5MB/201.5MB Loaded image: centos:6 [root@node_1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 6 d0957ffdf8a2 15 months ago 194MB ##在导入后,也可以使用docker tag命令来给镜像重新命名,但是在删除的时候,由于镜像ID 冲突,就必须要使用镜像名称加TAG才能删除了 [root@node_1 ~]# docker tag centos:6 xmtao:centos [root@node_1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 6 d0957ffdf8a2 15 months ago 194MB xmtao centos d0957ffdf8a2 15 months ago 194MB

    搜索镜像

    顾名思义,搜索公网Docker 官当镜像仓库的镜像

    假如,我想要去往上找一个MySQL的镜像或者其他服务镜像,但是我如何知道公网镜像仓库里有没有我想要的呢?,操作如下

    [root@node_1 ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 9689 [OK] mariadb MariaDB is a community-developed fork of MyS… 3525 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 706 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 77 mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 70 centurylink/mysql Image containing mysql. Optimized to be link… 61 [OK] bitnami/mysql Bitnami MySQL Docker Image 43 [OK] deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK] tutum/mysql Base docker image to run a MySQL database se… 35 schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 30 [OK] prom/mysqld-exporter 28 [OK] databack/mysql-backup Back up mysql databases to... anywhere! 25 linuxserver/mysql A Mysql container, brought to you by LinuxSe… 25 centos/mysql-56-centos7 MySQL 5.6 SQL database server 19 circleci/mysql MySQL is a widely used, open-source relation… 19 mysql/mysql-router MySQL Router provides transparent routing be… 16 arey/mysql-client Run a MySQL client from a docker container 14 [OK] fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas… 7 [OK] openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6 genschsa/mysql-employees MySQL Employee Sample Database 5 [OK] devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offici… 3 ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 2 [OK] jelastic/mysql An image of the MySQL database server mainta… 1 widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 0 [OK] monasca/mysql-init A minimal decoupled init container for mysql 0

    以上是搜索结果,如果想要知道这个镜像具体都有哪些版本,可以通过浏览器进入Docker hub 的公网仓库中进行检索 地址 https://hub.docker.com

    通过容器创建对象

    容器是值正在运行在docker上的服务,或者实例

    有时候我们也会遇到这种场景: 在进入到容器里面后,我在里面修改了一些东西,或者安装了一些服务,可是当机器重启,或者容器重新运行后我所做的操作都丢失了为了避免这些事情发生,( 因为在docker 中,镜像是只读的,你在容器里所做的操作,并不会写入到镜像当中去,在容器里所产生的数据也都是临时的,当机器重启,容器rm后,所存储的数据相对应也会被清空 ) 如果想保存你在容器中所做的操作,或者想通过在容器中操作完成好想另存为成自己的镜像,那么请看如下过程

    ##先运行一个容器,以centos6为例 [root@node_1 ~]# docker run -d -it centos:6 /bin/bash [root@node_1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6341cd03de00 centos:6 "/bin/bash" 3 seconds ago Up 2 seconds mystifying_moser ##进入到容器中,安装一个httpd ##之所以加-it 参数和加后面 /bin/bash的原因是 centos6的这个镜像没有指定容器在启动时候所运行的程序,加上-it 和/bin/bash之后 就指定了这个容器在启动的时候执行的命令,否则docker会认为这个容器没有运行程序,则会将此容器自动停止 ##后续会讲解如何定义Docker 容器启动时所跟随启动的脚本或者程序,在此不做过多讲解 [root@node_1 ~]# docker exec -it 6341cd03de00 /bin/bash [root@6341cd03de00 /]# yum -y install httpd [root@6341cd03de00 /]# /etc/init.d/httpd start [root@6341cd03de00 /]# chkconfig --add httpd [root@6341cd03de00 /]# echo "Hello Word" > /var/www/html/index.html [root@6341cd03de00 /]# curl 127.0.0.1 Hello Word ##然后退出容器 (按住Ctrl+d) 生成新的镜像 ##docker commit < 正在运行的容器的ID > < 新镜像的名称:TAG标签 > [root@node_1 ~]# docker commit 6341cd03de00 centos:6-httpd ##查看新生成的镜像 [root@node_1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 6-httpd efaebcd72bb8 About a minute ago 342MB nginx latest 2622e6cca7eb 3 weeks ago 132MB centos 6 d0957ffdf8a2 15 months ago 194MB ##运行测试 [root@node_1 ~]# docker run -d -it -p 80:80 --name httpd centos:6-httpd tail -f /var/log/httpd/access_log [root@node_1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e672e868356c centos:6-httpd "/bin/bash" 3 seconds ago Up 1 second 0.0.0.0:80->80/tcp httpd 6341cd03de00 centos:6 "/bin/bash" 8 minutes ago Up 8 minutes mystifying_moser ##启动容器内的httpd服务 [root@node_1 ~]# docker exec -it httpd /etc/init.d/httpd start Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3 for ServerName [ OK ] ##访问测试 [root@node_1 ~]# curl 127.0.0.1:80 Hello Word

    将本地镜像推送到公网Docker 镜像仓库中

    在有公网的环境下,我在创建好镜像后怕机器发生灾难导致我的镜像丢失,那么可以将自己的镜像推送到公网仓库中,可以用阿里云的镜像仓库,也可以用Docker官方的镜像仓库 不过前提是你得现有镜像仓库的账号

    以Docker hub为例,注册好之后在客户端登录 登录地址: https://hub.docker.com

    ##登录到Docker hub [root@node_1 ~]# 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: xmtao 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 ##给本地的镜像重新打标签 [root@node_1 ~]# docker tag centos:6 xmtao/centos:6 ##推送到仓库中 [root@node_1 ~]# docker push xmtao/centos:6 The push refers to repository [docker.io/xmtao/centos] af6bf1987c2e: Mounted from library/centos 6: digest: sha256:9aae95c8043f4e401178d68006756dc68982ae6d0693b71a714754227ce0abc6 size: 529 ##测试下载,(要想下载你上传的镜像的话,必须要登录,因为你的镜像仓库默认是私有的,如果想不登录想让任何人都能下载的话,需要将仓库等级设置成公共的) [root@node_1 ~]# docker rmi xmtao/centos:6 Untagged: xmtao/centos:6 Untagged: xmtao/centos@sha256:9aae95c8043f4e401178d68006756dc68982ae6d0693b71a714754227ce0abc6 [root@node_1 ~]# docker pull xmtao/centos:6 6: Pulling from xmtao/centos Digest: sha256:9aae95c8043f4e401178d68006756dc68982ae6d0693b71a714754227ce0abc6 Status: Downloaded newer image for xmtao/centos:6 docker.io/xmtao/centos:6

    以阿里云镜像仓库为例 在浏览器中打开登录地址:https://cr.console.aliyun.com

    由于不是Docker 官方的镜像仓库,在上传到第三方仓库时,镜像命名格式一定要正确

    镜像仓库地址/命名空间/镜像名称:镜像标签

    ##上传下载测试 ##登录镜像仓库 [root@node_1 ~]# docker login --username=阿里云的用户名 registry.cn-hangzhou.aliyuncs.com 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 ##从命名镜像 [root@node_1 ~]# docker tag centos:6 registry.cn-hangzhou.aliyuncs.com/meetfate/centos:6 ##上传 [root@node_1 ~]# docker push registry.cn-hangzhou.aliyuncs.com/meetfate/centos:6 The push refers to repository [registry.cn-hangzhou.aliyuncs.com/meetfate/centos] af6bf1987c2e: Pushed 6: digest: sha256:9aae95c8043f4e401178d68006756dc68982ae6d0693b71a714754227ce0abc6 size: 529

    创建Docker Register 私有仓库

    当本地的镜像过多,而有没有公网,或者为了安全性,不想将自己的镜像放置在公网,那么可以自己搭建出一个私有的镜像仓库

    配置过程如下

    ##拉取镜像仓库镜像 [root@node_1 ~]# docker pull registry:latest ##创建镜像存储目录,映射到容器中 [root@node_1 ~]# mkdir /registry_data ##运行容器,加 --restart=always 参数是为了机器异常重启的时候,容器也能够自动启动 [root@node_1 ~]# docker run -d -v /registry_data:/var/lib/registry -p 5000:5000 --name registry --restart=always registry:latest ##重命名镜像,上传测试,我的机器IP是192.168.100.150 [root@node_1 ~]# docker tag centos:6 192.168.100.150:5000/test/centos:6 ##上传时发现有报错 [root@node_1 ~]# docker push 192.168.100.150:5000/test/centos:6 The push refers to repository [192.168.100.150:5000/test/centos] Get https://192.168.100.150:5000/v2/: http: server gave HTTP response to HTTPS client ##此报错原因是镜像仓库必须是https的,但是Docker里面又没有这个私有镜像仓库的https证书 ##解决方法 [root@node_1 ~]# vim /usr/lib/systemd/system/docker.service 在 ExecStart= 后面加上--insecure-registry 192.168.100.150:5000 [root@node_1 ~]# systemctl daemon-reload [root@node_1 ~]# systemctl restart docker ##再次上传测试 [root@node_1 ~]# docker push 192.168.100.150:5000/test/centos:6 The push refers to repository [192.168.100.150:5000/test/centos] af6bf1987c2e: Pushed 6: digest: sha256:9aae95c8043f4e401178d68006756dc68982ae6d0693b71a714754227ce0abc6 size: 529 ##查看仓库中的镜像 [root@node_1 ~]# curl -XGET http://192.168.100.150:5000/v2/_catalog {"repositories":["test/centos"]}
    Processed: 0.033, SQL: 9