一: Docker仓库

在此我们只介绍docker私有仓库

  • 1.0 仓库介绍

Docker hub官方已提供容器镜像registry,用于搭建私有仓库


# 拉取镜像
[root@localhost ~]# docker  pull   registry:latest

  • 2.0 运行容器
[root@localhost ~]# docker  run   --name   "pri_registry"   --restart=always   -d  -p   5000:5000   registry 
  • 3.0 查看容器
[root@localhost ~]# docker ps
  • 4.0 连接容器查看端口状态

# 进入容器
[root@localhost ~]# docker exec -it   6cde00f3c3f4  /bin/sh
  
# 查看端口
netstat -lntp                        //查看5000端口是否开启


# 测试
[root@localhost ~]# curl  -I  127.0.0.1:5000   //参数是大写的i


  • 5.0 仓库功能测试(给镜像打tag——修改配置文件——上传镜像——从仓库中拉取镜像)

# 1.0 上传前必须给镜像打tag  注明ip和端口:
 [root@localhost ~]# docker tag nginx:latest  192.168.255.169:5000/nginx:latest


# 2.0 配置文件修改
 [root@localhost ~]# vim /etc/docker/daemon.json
 添加内容,然后重启
   "insecure-registries":["192.168.255.169:5000"] 
 [root@localhost ~]# systemctl restart docker   

# 3.0 上传配置镜像 
[root@localhost ~]# docker push 192.168.255.169:5000/nginx


# 4.0 查看仓库中有哪些镜像
[root@localhost ~]#curl 192.168.255.169:5000/v2/_catalog


# 5.0 拉取镜像
[root@localhost ~]# docker pull 192.168.255.169:5000/nginx


二 部署Docker-WebUI

docker-webui是管理docker的轻量级图形化工具


# 下载并运行容器
[root@localhost ~]#docker pull uifd/ui-for-docker 
[root@localhost ~]#docker run -it -d --name docker-web -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock  uifd/ui-for-docker 

# 测试访问
http://192.168.255.169:9000

三: 端口转发

创建应用容器的时候,一般会做端口映射,这样是为了让外部能够访问这些容器里的应用。可以用多个-p指定多个端口映射关系。

  • 以下是redis应用随机端口转发

# 简介
选项“-P  ”,Docker 会随机映射一个 30000~49900 的端口到内部容器开放的网络端口。如下:

# 拉取镜像并查看
[root@localhost ~]# docker  pull   redis
[root@localhost ~]# docker images


# 运行镜像
[root@localhost ~]# docker run --name myredis -P -d  redis

# 查看容器
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                         NAMES
7961738f568a   redis     "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   0.0.0.0:32768->6379/tcp, :::32768->6379/tcp   myredis
[root@localhost ~]# 

从上面的结果中可以看出,本地主机的32768端口被映射到了redis容器的6379端口上,
也就是说访问本机的32768端口,即可访问容器内redis端口。


# 返回宿主机,通过映射端口登录
[root@localhost ~]#  yum install -y redis
[root@localhost ~]# redis-cli -h 192.168.255.169 -p 32768
192.168.255.169:32768> set key1 "qqq"
OK
192.168.255.169:32768> get key1
"qqq"
192.168.255.169:32768> 


四: 数据卷

容器卷是容器和宿主机之间的文件共享方式之一

注意:

  • 如果是文件共享,数据不能同步更新

  • 如果共享的是目录,目录中的文件是可以实时同步的

  • 挂载宿主机目录至容器


# 命令:-v  宿主机目录:容器目标目录
[root@localhost ~]# docker run -it --name="voltest" -v /tmp/pzx:/test  centos:5 /bin/bash


[root@localhost ~]# mkdir /tmp/pzx/
[root@localhost ~]# clear
[root@localhost ~]# docker images 
REPOSITORY           TAG       IMAGE ID       CREATED        SIZE
redis                latest    2481edb3016c   2 weeks ago    143MB
registry             latest    53c26cd62311   2 months ago   62.4MB
mysql                5.7       5107333e08a8   2 years ago    501MB
uifd/ui-for-docker   latest    965940f98fa5   9 years ago    8.1MB
centos               5         1ae98b2c895d   9 years ago    285MB
[root@localhost ~]# docker run -it --name="voltest" -v /tmp/pzx:/test centos:5 /bin/bash
[root@087dfa4c18c5 /]# ls 
bin  etc   lib    lost+found  mnt  proc  sbin     srv  test  usr
dev  home  lib64  media       opt  root  selinux  sys  tmp   var
[root@localhost ~]# touch /tmp/pzx/1.txt
[root@localhost ~]# echo "hello world" >> /tmp/pzx/1.txt
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE      COMMAND       CREATED              STATUS              PORTS     NAMES
087dfa4c18c5   centos:5   "/bin/bash"   About a minute ago   Up About a minute             voltest
[root@localhost ~]# docker exec -it 087dfa4c18c5 /bin/bash
[root@087dfa4c18c5 /]# cat /test/.txt
cat: /test/.txt: No such file or directory
[root@087dfa4c18c5 /]# cat  /test/1.txt 
hello world
[root@087dfa4c18c5 /]# 


  • 共享容器数据卷

# 命令:--volumes-from 容器id
[root@localhost ~]# docker run -it --volumes-from b5a9003fea00     centos:5  /bin/bash


[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
087dfa4c18c5   centos:5   "/bin/bash"   6 minutes ago   Up 6 minutes             voltest
[root@localhost ~]# docker run -it --volumes-from 087dfa4c18c5 centos:5 /bin/bash
[root@a25f4383e010 /]# ls 
bin  etc   lib    lost+found  mnt  proc  sbin     srv  test  usr
dev  home  lib64  media       opt  root  selinux  sys  tmp   var
[root@a25f4383e010 /]# cat ./test/1.txt 
hello world
[root@a25f4383e010 /]# 

五: docker数据存储位置

docker目录:建议安装docker时,就修改这个目录。因为image不会移动到新目录

  • 当前 Docker 的根目录是系统默认的 /var/lib/docker,这个目录直接占用系统盘空间,把它修改为自定义目录(比如挂载的数据盘 / 大容量硬盘) 是生产环境、服务器必做的优化配置,好处非常多

查看默认存储位置:

[root@localhost ~]# docker info | grep Root
 Docker Root Dir: /var/lib/docker
[root@localhost ~]# 

修改默认存储位置:


[root@localhost ~]# vim /usr/lib/systemd/system/docker.service
# 主要是添加 --data-root=/data这个部分内容
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/data


# 生效配置并重启
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker

# 查看是否生效
[root@localhost ~]# docker info | grep Root


六: 优化centos7镜像

CentOS7 Docker 镜像的天坑:

  • CentOS7 的官方 Docker 镜像 centos:7,为了精简镜像体积、规避权限问题,默认没有安装原生 systemd,而是用一个「伪系统管理工具 fakesystemd」来代替,满足一些软件的依赖检测。

两个关键痛点:

  • fakesystemd 只是「假的」,不支持 systemctl start/stop/enable 服务名 这类真实的 systemd 命令; 很多服务(httpd、sshd、mysql、nginx 等)在 CentOS7 中都是基于 systemd 管理的,没有原生 systemd,就无法用systemctl来管理容器内的服务; systemd 运行需要 CAP_SYS_ADMIN 权限 + 读取宿主机的 cgroup 资源,普通容器权限不够,启动会直接报错。 本次优化目的:改造官方 centos:7 镜像,删除伪的 fakesystemd、安装原生 systemd,让容器能像真实的 CentOS7 服务器一样,用 systemctl 管理各类服务。

  • 1.0 制作支持 systemd 的 CentOS7 镜像


# mkdir /docker-systemd ; cd /docker-systemd  ; vim Dockerfile-base

FROM centos:7
MAINTAINER "pzx" 1625576018@qq.com
ENV container docker
# ========== 1. 彻底清空原有所有yum源,不留任何残留,杜绝加载失效源 ==========
RUN rm -rf /etc/yum.repos.d/*
# ========== 2. 写入清华源CentOS7归档源,永久可用,解析超快 ==========
RUN echo '[CentOS7-Tsinghua]' > /etc/yum.repos.d/CentOS7-Tsinghua.repo && \
    echo 'name=CentOS7 - Tsinghua Mirror' >> /etc/yum.repos.d/CentOS7-Tsinghua.repo && \
    echo 'baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.9.2009/os/$basearch/' >> /etc/yum.repos.d/CentOS7-Tsinghua.repo && \
    echo 'gpgcheck=0' >> /etc/yum.repos.d/CentOS7-Tsinghua.repo && \
    echo 'enabled=1' >> /etc/yum.repos.d/CentOS7-Tsinghua.repo
# ========== 3. 安装systemd+清理,精简systemd服务 ==========
RUN yum -y install systemd systemd-libs && yum clean all && \
    (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
    rm -f /lib/systemd/system/multi-user.target.wants/*; \
    rm -f /etc/systemd/system/*.wants/*; \
    rm -f /lib/systemd/system/local-fs.target.wants/*; \
    rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
    rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
    rm -f /lib/systemd/system/basic.target.wants/*; \
    rm -f /lib/systemd/system/anaconda.target.wants/*
# ========== 4. 必备挂载目录 ==========
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]


# 文件解释
制作「支持 systemd 的 CentOS7 基础镜像」
配置后续安装应用程序的YUM源
编写第一个 Dockerfile,基于官方centos:7
核心操作:yum swap 删掉 fakesystemd,安装原生 systemd + systemd-libs
清理大量无用的 systemd 开机服务(精简镜像 + 避免启动冲突)
挂载宿主机/sys/fs/cgroup目录(给 systemd 提供资源管理能力)
启动命令指定为/usr/sbin/init(这是 systemd 的主进程,等同于真实 CentOS7 开机的初始化进程)
构建出的镜像标签:local/c7-systemd → 这是通用基础镜像,后续所有需要 systemd 的应用都基于它来做

# 构建镜像
[root@localhost ~]# docker build --no-cache -f Dockerfile-base -t local/c7-systemd .

  • 2.0 制作HTTP应用镜像测试

#cd .. ; mkdir c7-systemd-httpd ; cd  c7-systemd-httpd ; vim Dockerfile

FROM local/c7-systemd
# ========== 1. 安装httpd,清理缓存 ==========
RUN yum -y install httpd && yum clean all && rm -rf /var/cache/yum/*
# ========== 2. 手动创建软链接,实现httpd开机自启(替代systemctl enable,无任何坑) ==========
RUN ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service
# ========== 3. 暴露80端口 ==========
EXPOSE 80
# ========== 4. 启动systemd ==========
CMD ["/usr/sbin/init"]


# 构建镜像
[root@localhost ~]# docker build --no-cache -t local/c7-systemd-httpd .

# 运行容器
[root@localhost ~]# docker run -d -p 80:80 --privileged=true --name c7-httpd-server local/c7-systemd-httpd

--privileged :为了运行一个包含 systemd 的容器,需要使用该选项,
 并且挂载主机的 cgroups 文件夹。
 
注意:该命令不能添加/bin/bash,添加了会导致服务不可用,
而且有些服务可能会发现之前提到的权限不够的问题,
但是如果不加会运行在前台(没有用-d),可以用ctrl+p+q放到后台去 


# 测试
docker exec c7-httpd-server systemctl status httpd

说明:该 Dockerfile 删除 fakesystemd 并安装了原生 systemd,制作完成 local/c7-systemd 基础镜像,后续所有应用镜像均基于此镜像构建

更多推荐