OWenT's blog
  • Introduction
  • About Me
  • 2020
    • 近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)
    • xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
    • 在游戏服务器中使用分布式事务
    • libcopp接入C++20 Coroutine和一些过渡期的设计
    • libatbus 的大幅优化
    • nftables初体验
    • 容器配置开发环境小计
  • 2019
    • PALM Tree - 适合多核并发架构的B+树 - 论文阅读小记
    • 跨平台协程库 - libcopp 简介
    • C++20 Coroutine 性能测试 (附带和libcopp/libco/libgo/goroutine/linux ucontext对比)
    • 尝鲜Github Action
    • 一些xresloader(转表工具)的改进
    • protobuf、flatbuffer、msgpack 针对小数据包的简单对比
    • 协程框架(libcopp) 小幅优化
    • Excel转表工具(xresloader) 增加protobuf插件功能和集成 UnrealEngine 支持
    • Anna(支持任意扩展和超高性能的KV数据库系统)阅读笔记
    • C++20 Coroutine
    • libcopp merge boost.context 1.69.0
    • Google去中心化分布式系统论文三件套(Percolator、Spanner、F1)读后感
    • Rust玩具-企业微信机器人通用服务
  • 2018
    • 使用ELK辅助监控开发测试环境服务质量和问题定位
    • Webpack+vue+boostrap+ejs构建Web版GM工具
    • 2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现
    • Rust的第二次接触-写个小服务器程序
    • 理解和适配AEAD加密套件
    • atsf4g-co的进化:协程框架v2、对象路由系统和一些其他细节优化
    • 协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比
    • 可执行文件压缩
    • 初识Rust
    • 使用restructedtext编写xresloader文档
    • atframework的etcd模块化重构
    • C++的backtrace
  • 2017
    • ECDH椭圆双曲线(比DH快10倍的密钥交换)算法简介和封装
    • protobuf-net的动态Message实现
    • pbc的proto3接入
    • atgateway内置协议流程优化-加密、算法协商和ECDH
    • 整理一波软件源镜像同步工具+DevOps工具
    • Blog切换到Hugo
    • libcopp v2的第一波优化完成
    • libcopp(v2) vs goroutine性能测试
    • libcopp的线程安全、栈池和merge boost.context 1.64.0
    • GCC 7和LLVM+Clang+libc++abi 4.0的构建脚本
    • libatbus的几个藏得很深的bug
    • 用cmake交叉编译到iOS和Android
    • 开源项目得一些小维护
    • atapp的c binding和c#适配
    • 对象路由系统设计
    • 2016年总结
    • 近期的一个协程流程BUG
  • 2016
    • 重写了llvm+clang+libc++和libc++abi的构建脚本
    • atsf4g完整游戏工程示例
    • atframework基本框架已经完成
    • 游戏服务器的不停服更新
    • 对atbus的小数据包的优化
    • Android和IOS的TLS问题
    • pbc的一个陈年老BUG
    • boost.context-1.61版本的设计模型变化
    • 接入letsencrypt+全面启用HTTP/2
    • 理解Raft算法
    • libatbus基本功能及单元测试终于写完啦
    • 博客文章和文档迁移到gitbook
  • 2015
    • 博客文章和文档迁移到gitbook
    • 给客户端写得LRU缓存
    • 近期活动比较零散
    • 关于BUS通信系统的一些思考(三)
    • 针对Java JIT的优化(转表工具:xresloader)
    • libcopp更新 (merge boost 1.59 context)
    • 小记最近踩得两个C++坑
    • Redis全异步(HA)Driver设计稿
    • Vim常用命令
    • 关于firewalld和systemd的一些命令速记
    • Jenkins(hudson)插件记录
    • 我们的Lua类绑定机制
    • LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译)
    • 回顾2014
    • Android NDK undefined reference to ___tls_get_addr 错误
    • gitlab腾讯企业邮箱配置
  • 2014
    • 回顾2013
    • C++11动态模板参数和type_traits
    • C++又一坑:动态链接库中的全局变量
    • tolua++内存释放坑
    • [转]类似github的框架
    • Lua性能分析
    • 集成Qt Webkit 到cocos2d-x
    • Gitlab环境搭建小计
    • 近期研究VPN的一些记录(OpenVPN,pptp,l2tp)
    • LLVM + Clang + Libcxx + Libcxxabi 工具链编译
    • 关于BUS通信系统的一些思考(二)
    • 关于BUS通信系统的一些思考(一)
    • [libiniloader] Project
    • 记录一些在线编辑器
    • [WP Code Highlight.js] Project
    • 再议 C++ 11 Lambda表达式
    • 基于Chrome插件的开发工具链
    • [ACM] HDU 1006 解题报告
    • Linux 编译安装 GCC 4.9
    • 又碰到了这个解谜游戏,顺带记下地址
    • 简单C++单元测试框架(支持一键切到GTest或Boost.Test)
    • 捣鼓一个协程库
  • 2013
    • std和boost的function与bind实现剖析
    • 不知道是哪一年的腾讯马拉松题目 照片评级 解题报告
    • Lua 挺好用的样子
    • VC和GCC成员函数指针实现的研究(三)
    • VC和GCC成员函数指针实现的研究(二)
    • VC和GCC内成员函数指针实现的研究(一)
    • 一个C++关于成员变量偏移地址的小Trick
    • ptmalloc,tcmalloc和jemalloc内存分配策略研究
    • POJ 2192 Zipper HDU 2059 龟兔赛跑
    • 从Javascript到Typescript到Node.js
    • 网络编程小结
    • 试试Boost.Asio
    • Lnmp yum 安装脚本 (for CentOS)
    • ARM 交叉编译环境搭建
    • Linux 编译安装 GCC 4.8
    • [记录]虚拟硬盘的压缩|磁盘写零
  • 2012
    • Boost.Spirit 初体验
    • “C++的90个坑”-阅读笔记
    • AC自动机
    • C++ 标准过渡期
    • 程序员修炼之道 -- 阅读笔记
    • [转载]狼与哈士奇
    • C++ 新特性学习(八) — 原子操作和多线程库[多工内存模型]
    • C++ 新特性学习(七) — 右值引用
    • 理解Protobuf的数据编码规则
    • 忆往昔ECUST的ACM时代
    • Linux编译安装GCC 4.7
    • JSON显示库 -- showJson (Javascript)
    • C++ 新特性学习(六) — 新的字符串编码和伪随机数
    • C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型
    • C++ 新特性学习(四) — Bind和Function
  • 2011
    • C++ 新特性学习(三) — Regex库
    • C++ 新特性学习(二) -- Array、Tuple和Hash库
    • C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)
    • Linux 和 Windows PowerShell 常用工具/命令 记录
    • 非常帅气的Linq to sql
    • 2011 Google Code Jam 小记
    • C++总是很神奇
    • 大学生创新项目[国家级]经费使用记录
    • 常用官方文档整理
    • 我们学校的IPV6很不错嘛
  • 2010
    • 线段树相关问题 (引用 PKU POJ题目) 整理
    • 2010 ACM 赛前笔记
    • POJ PKU 2596 Dice Stacking 解题报告
    • POJ PKU 3631 Cuckoo Hashing 解题报告
    • POJ PKU 1065 Wooden Sticks 3636 Nested Dolls 解题报告
    • HDU 3336 Count the string 解题报告
    • Hash模板 个人模板
    • ZOJ 3309 Search New Posts 解题报告
    • POJ PKU Let's Go to the Movies 解题报告
    • 注册表常用键值意义
    • PKU POJ 1724 ROADS 解题报告
    • 《神奇古今秘方集锦》&《民间秘术大全》
    • PKU POJ 1720 SQUARES 解题报告
    • POJ PKU 2155 Matrix 解题报告
    • PKU POJ 1141 Brackets Sequence 解题报告
    • PKU POJ 2728 Desert King 解题报告
    • PKU POJ 2976 Dropping tests 解题报告
    • PKU POJ 3757 Simple Distributed storage system 解题报告
    • GCD Determinant 解题报告
    • Southeastern European 2008 Sky Code 解题报告
    • HDU HDOJ 3400 Line belt 解题报告
    • 线性筛法求质数(素数)表 及其原理
    • HDU HDOJ 3398 String 解题报告
    • 树状数组模块(个人模板)
    • 浙江理工 省赛总结 team62 By OWenT of Coeus
    • POJ PKU 3659 Cell Phone Network 解题报告
    • USACO 2008 March Gold Cow Jogging 解题报告
    • C#格式化输出(记录)
    • 参加有道难题笔记
    • POJ PKU 2446 Chessboard 解题报告
    • POJ PKU 1986 Distance Queries 解题报告
    • 计算几何算法概览[转载]
    • 关于差分约束(转载)
    • POJ PKU 2826 An Easy Problem?! 解题报告
    • 数论模板(个人模板)
    • 简易四则运算(ACM个人模板)
    • Catalan 数
    • The 35th ACM/ICPC Asia Regional Tianjin Site —— Online Contest 1009 Convex 解题报告
    • JQuery扩展插件--提示信息
    • ACM 计算几何 个人模板
    • 解析网站字符串型参数 Javascript QueryString 操作 TQueryString类
    • POJ PKU 1474 Video Surveillance 解题报告
  • 2009
    • 模式匹配(kmp)个人模板
    • 并查集 模板
    • POJ 3267 The Cow Lexicon 解题报告
    • C/C++语言常用排序算法
    • POJ 2606 Rabbit hunt 2780 Linearity 1118 Lining Up 解题报告
    • 打造最快的Hash表(转) [以暴雪的游戏的Hash为例]
    • ECUST 09年 校赛个人赛第六,七场总结
    • ECUST 09年 校赛个人赛第三场部分解题报告(A,D,F,I)
    • 牛顿迭代解方程 ax^3+bX^2+cx+d=0
    • 09年8月9日 ECUST ACM 练习赛总结
    • 连接最多点直线 (OWenT 个人模板)
    • 点到直线距离 和 线段间最短距离 (OWenT 模板)
    • ECUST 09年 校赛个人训练赛第五场总结
    • ECUST 09年 校赛个人赛第八场(最后一场)总结
    • 09年8月14日 ECUST ACM 练习赛总结
    • 矩阵相关 (增强中)
    • Prime最小生成树(个人模板)
    • 最长单调子序列 复杂度nlog(n)
    • POJ PKU 2549 Sumsets 解题报告
    • POJ PKU 3277 City Horizon 解题报告
    • 我的ACM生涯
    • POJ PKU 2528 Mayor's posters 解题报告
    • POJ PKU 2378 Tree Cutting 解题报告
    • POJ PKU 1990 MooFest 解题报告
Powered by GitBook
On this page
  • 编译podman
  • 基本设置
  • 拉取镜像和网络代理和自建镜像仓库
  • 镜像构建流程
  • 在宿主机上测试( 兼容systemd )
  • 网络代理和vscode和zsh
  • 其他

Was this helpful?

  1. 2020

容器配置开发环境小计

Previousnftables初体验Next2019

Last updated 5 years ago

Was this helpful?

这段时间折腾了好久容器搭建开发环境和家里软路由趟的一些坑。这里先记录一下使用容器搭开发环境的一些流程和问题。

开发环境一般里面会包含很多的工具和开启一些服务。 我自己的环境测试和搭建了 、 、 。 开启了 , 支持网络代理+vscode远程开发, 支持 和 ,支持k8s,开启了 sshd 。 所有的构建脚本及 Dockerfile 都放在 了,有需要的小伙伴可以自取。

编译podman

之前看一些文章把 吹上了天,于是我就当了下小白鼠。最后的建议是除非你想去折腾这玩意,不然现阶段还是珍爱生命,远离它(BUG茫茫多,想想都是泪)。

除了一些自带的发行版以外,有些发行版(比如 )还是得自己编译自己装。发行版自带的版本也相对较低,如果想用比较新的版本也是得自己编译安装。 官方给出的编译安装组件并不完整,而且 内部的一些组件互相依赖的版本也很高,系统自带的组件版本也不一定能够支持,我自己总结的需要准备的列表如下:

  1. golang

  2. ostree

  3. conmon(容器监控工具)

  4. runc(容器运行工具)

  5. cni(对非host模式rootful容器的网络支持)

  6. libpod( 命令行工具)

  7. fuse-overlayfs(rootless容器的用户空间文件系统挂载支持)

  8. slirp4netns(rootless容器的用网络支持)

具体的流程在:

基本设置

拉取镜像和网络代理和自建镜像仓库

Environment="HTTP_PROXY=HTTP代理地址:端口" "HTTPS_PROXY=HTTP代理地址:端口" "NO_PROXY=代理排除列表"

然后如果有自定义镜像仓库要排除TLS证书检查的话可以在 /etc/docker/daemon.json 里配置:

{
    "graph": "数据存放路径,如: /data/docker-data",
    "storage-driver": "overlay",
    "insecure-registries" : [ "registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io", "quay.io", "其他自建仓库..." ]
}

镜像构建流程

  1. 换源

  2. 很多容器官方镜像是关闭文档的,开发环境还是需要它所以打开文档安装man-db

  3. 开文档后可能要重新安装某些组件触发一次拉取文档和man-db

  4. 安装基本工具

  5. 安装编译环境

  6. 生成locale,某些发行版没有 locale.gen , 直接执行 localectl set-locale LANG=en_GB.utf8 吧

  7. 设置时区

  8. 开启sshd服务,改服务端口,把 /etc/pam.d/* 里的 pam_loginuid.so 改成 optional 。

  9. 清理安装包缓存目录和日志

在宿主机上测试( 兼容systemd )

docker run -d --name 容器名称 --cap-add=SYS_ADMIN                                           \
        --mount type=tmpfs,target=/run,tmpfs-mode=1777,tmpfs-size=67108864                  \
        --mount type=tmpfs,target=/run/lock,tmpfs-mode=1777,tmpfs-size=67108864             \
        --mount type=tmpfs,target=/tmp,tmpfs-mode=1777                                      \
        --mount type=tmpfs,target=/var/log/journal,tmpfs-mode=1777                          \
        --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup                       \
        镜像HASH值或TAG名称 /sbin/init

网络代理和vscode和zsh

我现在主力使用vscode 远程开发插件来远程开发的。但是配置容器网络的时候碰到过很多问题,要么某些环境初始化不了,要么更新失败。

我试过加初始化代理的环境变量脚本到 $HOME/.bashrc 和加到 /etc/profile.d/xxx.sh 都不能完美解决问题。特别是使用了 zsh 之后。

最终比较完美的解决方案有两种,第一种是把代理环境变量写进 Dockerfile 里, 另一种是 sshd 的配置( /etc/ssh/sshd_config ) 里开启 PermitUserEnvironment yes 然后把环境变量写进 $HOME/.ssh/environment 里。(记得要 chmod 600 $HOME/.ssh/environment)

其他

拉取 镜像的命令我就不贴了。这里如果是用的 而不是 并且网络要要走代理需要配置下。

首先 服务的代理只能配环境变量,需要在 /lib/systemd/system/docker.service 里(假设用的 启动的 服务)的 [Service] 段里加上

大致就是如上的流程,这里提供一下我自己构建过的几个 Dockerfile , 都在 这个仓库里,部分Dockerfile可能会依赖里面的脚本所以最好整个仓库clone下来就可以直接用。如果要设置开发环境代理的话可以在构建镜像的时候加上 --env SETUP_INSTALL_PROXY=HTTP代理地址 和 --env SETUP_INSTALL_NO_PROXY=代理排除地址 。

:

:

:

:

:

要让容器能够启动 的话需要额外给一些权限和共享出cgroup。 然后启动命令必须是 /lib/systemd/systemd 。

我试了几个主要的发行版都是 /lib/systemd/systemd ,有些发行版会安装 适配 sysv 的包,然后 /sbin/init 会被软链到 /lib/systemd/systemd ,用这个也可以。

如果是 的话内建了对 的支持。只要加上启动参数 --systemd true 就可以了。

如果是原版的 的话,这里提供一个命令参考(参数选项来自 的代码):

这段时间还折腾了下 nftables ,用起来很爽,但是也是踩了一些坑。不过这个组件比 靠谱多了,只是功能上还不能完全替代 iptables + ebtables 而已。 我也是尝试用了好多种发行版docker里跑软路由,后面再来填坑吧。

ubuntu
centos
archlinux
systemd
docker
podman
https://github.com/owent-utils/docker-setup
podman
Debian
podman
podman
https://github.com/owent-utils/docker-setup/blob/master/build-podman.sh
docker
docker
podman
docker
systemd
docker
https://github.com/owent-utils/docker-setup
Ubuntu
https://github.com/owent-utils/docker-setup/blob/master/ubuntu.devtools.Dockerfile
Debian
https://github.com/owent-utils/docker-setup/blob/master/debian.devtools.Dockerfile
CentOS 7
https://github.com/owent-utils/docker-setup/blob/master/centos7.devtools.Dockerfile
CentOS 8
https://github.com/owent-utils/docker-setup/blob/master/centos8.devtools.Dockerfile
Archlinux
https://github.com/owent-utils/docker-setup/blob/master/arch.devtools.Dockerfile
systemd
systemd
podman
systemd
docker
podman
podman