容器镜像管理手册
系统镜像
通过 Alpine、CentOS 官方提供的操作系统镜像,运行容器,添加相关系统工具、常规化设置,然后使用 docker commit 从容器创建一个新的镜像1
2
3
4
5
6
7docker pull alpine:3.16
docker run -itd --name myalpine alpine:3.16
docker exec -it myalpine sh
docker pull centos:7.9.2009
docker run -itd --name mycentos centos:7.9.2009
docker exec -it mycentos /bin/bash
替换 systemctl
Failed to get D-Bus connection: Operation not permitted1
2
3
4
5
6mv /usr/bin/systemctl /usr/bin/systemctl.old
exit
#宿主机运行
docker cp ./systemctl mycentos:/usr/bin/
docker exec -it mycentos /bin/bash
chmod +x /usr/bin/systemctl
添加所需工具
1 | yum install vim less net-tools sysstat lsof wget curl lrzsz telnet |
工具 | 说明 |
---|---|
vim | 命令行文本编辑器 |
less | 命令文本分页显示工具 |
net-tools | 网络管理工具,包括 netstat、arp、route、ifconfig 命令 |
sysstat | 监控工具包,主要使用 iostat、sar 命令 |
lsof | 文件打开句柄数诊断工具 |
wget | http、ftp 文件获取工具 |
curl | http、https 调试工具 |
tar/zip/unzip | 打包、解包工具 |
lrzsz | ftp 上传下载:sz 下载、rz 上传 |
mtr | 直观显示 ping 和 traceroute 结果的网络工具 |
telnet | 网络诊断工具,nc |
top | 性能诊断工具 |
python | Python 执行环境(可选) |
注意:该操作系统镜像只提供了一些常用的工具包,应用可根据需要自行安装一些额外的工具包。
安装方法:下载镜像,启动容器,进入容器内,配置软件源,安装相应工具。
中英文字符集
修改时区配置
1 | ln -sf /usr/share/ zoneinfo/Asia/Shanghai /etc/localtime |
执行上述命令验证时区是否正确
提交新的镜像
以上步骤完成后通过 docker commit 命令生成新的镜像1
2
3
4
5docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a:提交的镜像作者;
-c:使用Dockerfile指令来创建镜像;
-m:提交时的说明文字;
-p:在commit时,将容器暂停。
创建 Dockerfile_CentOS1
2
3
4
5
6
7
8
9
10
11
12
13
14
15FROM centos:7.9.2009
MAINTAINER Jun Yu<work@yuwei.cc>
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum -y install kde-l10n-Chinese fontconifg \
&& yum -y reinstall glibc-common \
&& localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 \
&& echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf \
&& source /etc/locale.conf \
&& yum install -y vim less net-tools zip unzip lsof wget curl lrzsz telnet \
&& yum clean all
COPY simsun.ttc /usr/share/fonts/
ENV LANG=zh_CN.UTF-8 \
LC_ALL=zh_CN.UTF-8
创建镜像并验证1
2
3docker build -t centos_v7.9-zh_cn:220915001 -f Dockerfile_CentOS .
docker run -itd --name czc centos_v7.9-zh_cn:220915001
docker exec -it czc /bin/bash
软件镜像
软件镜像就是在上述系统镜像的基础上进行构建,命名及 tag 规范如下:
- 镜像命名使用操作系统版本+基础软件版本+tag 方式命名
- 镜像命名中分割符使用下划线(“_”)分割。
- tag 命名方式使用八位日期+三位流水号方式命名
例如:CentOS+JDK 镜像 - centos_v7.9-zh_cn-jdk8:220915001
创建 Dockerfile_CentOS_JDK81
2
3
4FROM centos_v7.9-zh_cn:220915001
MAINTAINER Jun Yu<work@yuwei.cc>
ADD jdk8u292-b10.tar.gz /opt
RUN ln -s /opt/jdk8u292-b10/bin/* /usr/bin
创建镜像并验证1
2
3docker build -t centos_v7.9-zh_cn-jdk8:220915001 -f Dockerfile_CentOS_JDK8 .
docker run -itd --name czcj centos_v7.9-zh_cn-jdk8:220915001
docker exec -it czcj /bin/bash
Dockerfile
编写规范
为规范 Docker 镜像资源的管理,方便使用和维护做以下规范定义(所有 Dockerfile 内部指令均大写),详细规范参照下表:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#指定准基础软件镜像
FROM IMAGE:tag
FROM 127.0.0.1:8080/public/alpine_v3.16_nginx_v1.20.1:20220914
#指定维护者:
#str 信息,使用个人名称拼音+邮箱格式
MAINTAINER [STR]
例如:MAINTAINER xxxxxx xxxxxx@eteng.cn
#设置环境变量:
EVN [STR]
ENV LANG="en_US.UTF-8" \
SERVER_PORT="8088"
#添加文件
#LOCAL_PATH:使用相对路径地址,和 Dockerfile 在同一级目录下
#CONTAINER_PATH:使用容器绝对路径地址,参照应用技术要求
COPY <LOCAL_PATH> <CONTAINER_PATH>
COPY eteng-cloud-gateway /app/
#指定容器生命周期内提供服务所监听的端口
#如果服务需要暴露端口,必须指定,为保证便于管理,禁止在运行服务时候临时指定监听端口,约束 docker run 命令
EXPOSE <PORT>
EXPOSE $SERVER_PORT
#切换工作目录命令
#可以多次切换,类似于 cd 命令
WORKDIR <dir>
WORKDIR /app
#执行命令生成新的镜像层
RUN <COMMAND>
RUN cd /app && tar –zxvf example.tar.gz
#指定容器生命周期起始默认启动的进程
CMD ["/bin/bash","-c","/app/bin/resatrt.sh && -f /app/logs/stdout.log"]
版本管理
制作镜像的 Dockerfile 及相关文档需要在 gitlab 上进行版本管理,在 gitlab 上必须存在如下目录/文件:
文件名 | 说明 | 备注 |
---|---|---|
Dockerfile | docker build 文件 | |
.dockerignore | Dockerfile 忽略文件 | 定义 Dockerfile 运行忽略信息 |
build.sh | 构建运行脚本 | |
run.sh | 容器启动运行脚本 | |
readme.md | 使用说明:镜像、例子如何使用 | 必须 copy 到镜像根目录下 |
release-notes.txt | 版本说明:变更信息、修正 bug、增加功能等 | 必须 copy 到镜像根目录下 |
scripts | 构建运行时所需脚本文件 | 目录(文件夹) |
镜像管理
公有仓库
1 | docker login --username=cn_yuwei@qq.com registry.cn-shanghai.aliyuncs.com |
私有仓库
使用 harbor 构建私有仓库 vi /etc/docker/daemon.json
1
2
3{
"insecure-registries": ["192.168.1.1:8080"]
}
上传镜像
1 | docker login 127.0.0.1:8080 |
导出导入
命令的话需要启动的容器才能导出1
2docker export alpine-3.16_nginx-1.20.1:20220914 alpine-3.16_nginx-1.20.1_20220914.tar
docker import alpine-3.16_nginx-1.20.1_20220914.tar alpine-3.16_nginx-1.20.1:20220914
Portainer 可以直接导出
可视操作
1 | docker pull portainer/portainer-ce:alpine |
代理1
2
3
4
5
6
7
8
9
10
11
12
13docker network create \
--driver overlay \
portainer_agent_network
docker service create \
--name portainer_agent \
--network portainer_agent_network \
-p 9001:9001/tcp \
--mode global \
--constraint 'node.platform.os == linux' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \
portainer/agent:2.15.0