系统镜像

通过 Alpine、CentOS 官方提供的操作系统镜像,运行容器,添加相关系统工具、常规化设置,然后使用 docker commit 从容器创建一个新的镜像

1
2
3
4
5
6
7
docker 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 permitted

1
2
3
4
5
6
mv /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
2
ln -sf /usr/share/	zoneinfo/Asia/Shanghai /etc/localtime
date

执行上述命令验证时区是否正确

提交新的镜像

以上步骤完成后通过 docker commit 命令生成新的镜像

1
2
3
4
5
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a:提交的镜像作者;
-c:使用Dockerfile指令来创建镜像;
-m:提交时的说明文字;
-p:在commit时,将容器暂停。

创建 Dockerfile_CentOS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM 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
3
docker 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 规范如下:

  1. 镜像命名使用操作系统版本+基础软件版本+tag 方式命名
  2. 镜像命名中分割符使用下划线(“_”)分割。
  3. tag 命名方式使用八位日期+三位流水号方式命名

例如:CentOS+JDK 镜像 - centos_v7.9-zh_cn-jdk8:220915001

创建 Dockerfile_CentOS_JDK8

1
2
3
4
FROM 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
3
docker 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
2
3
docker login 127.0.0.1:8080
docker tag alpine-3.16_nginx-1.20.1:20220914 127.0.0.1:8080/public/alpine_v3.16_nginx_v1.20.1:20220914001
docker push 127.0.0.1:8080/public/alpine_v3.16_nginx_v1.20.1:20220914001

导出导入

命令的话需要启动的容器才能导出

1
2
docker 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
2
3
docker pull portainer/portainer-ce:alpine
docker volume create portainer_data
docker run -d -p 9000:9000 -p 9443:9443 --name portainer --restart=always -v portainer_data:/data portainer/portainer-ce:alpine

代理

1
2
3
4
5
6
7
8
9
10
11
12
13
docker 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