docker高级
·
一: 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 基础镜像,后续所有应用镜像均基于此镜像构建
更多推荐
所有评论(0)