如何为运行中的容器动态增加hosts映射
停止容器首先，停止你需要修改的容器：docker stop [容器ID或名称]修改hostconfig.json文件编辑/var/lib/docker/containers/[容器ID]/hostconfig.json文件，添加ExtraHosts条目："ExtraHosts": ["example.com:192.168.1.10"]重启Docker服务修改完配置文件后，重启Docker服务以应用更改：sudo systemctl restart docker
一、安装及配置1.gitlab镜像拉取# gitlab-ce为稳定版本，后面不填写版本则默认pull最新latest版本 $ docker pull gitlab/gitlab-ce拉取镜像2.运行gitlab镜像**$ docker run -d -p 443:443 -p 8001:80 -p 222:22 --name gitlab --restart always -v /home/mango/docker-vols/gitlab/config:/etc/gitlab -v /home/mango/docker-vols/gitlab/logs:/var/log/gitlab -v /home/mango/docker-vols/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce # -d：后台运行 # -p：将容器内部端口向外映射 # --name：命名容器名称 # -v：将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录运行成功后出现一串字符串运行成功3.配置按上面的方式，gitlab容器运行没问题，但在gitlab上创建项目的时候，生成项目的URL访问地址是按容器的hostname来生成的，也就是容器的id。作为gitlab服务器，我们需要一个固定的URL访问地址，于是需要配置gitlab.rb（宿主机路径：/home/gitlab/config/gitlab.rb）。# gitlab.rb文件内容默认全是注释 $ vim /home/gitlab/config/gitlab.rb# 配置http协议所使用的访问地址,不加端口号默认为80 external_url 'http://192.168.199.231' # 配置ssh协议所使用的访问地址和端口 gitlab_rails['gitlab_ssh_host'] = '192.168.199.231' gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口 :wq #保存配置文件并退出修改gitlab.rb文件# 重启gitlab容器 $ docker restart gitlab此时项目的仓库地址就变了。如果ssh端口地址不是默认的22，就会加上ssh:// 协议头打开浏览器输入ip地址(因为我的gitlab端口为80，所以浏览器url不用输入端口号，如果端口号不是80，则打开为：ip:端口号)4.创建一个项目第一次进入要输入新的root用户密码，设置好之后确定就行gitlab页面下面我们就可以新建一个项目了，点击Create a projectCreate a project创建完成后：创建完成！二、用户使用1.安装git略2.登录gitlab网页url：http://[your-ip]:[8001]填写账号密码登录登录页面3.设置ssh1.使用如下命令生成ssh公钥和私钥对$ ssh-keygen -t rsa -C 'xxx@xxx.com'然后一路回车(-C 参数是你的邮箱地址)2.然后输入命令：# ~表示用户目录，比如我的windows就是C:\Users\Administrator，并复制其中的内容 $ cat ~/.ssh/id_rsa.pub3.打开gitlab,找到Profile Settings-->SSH Keys--->Add SSH Key,并把上一步中复制的内容粘贴到Key所对应的文本框添加公匙到gitlab4.从gitlab克隆代码1.回到gitlab页面点击projects->your projects2.选择一个需要克隆的项目，进入我的项目页面3.点击按钮复制地址复制ssh地址4.新建一个文件夹，我在这里在我的电脑D盘下新建project文件夹5.设置用户名和邮箱$ git config --global user.name "你的名字" $ git config --global user.email "你的邮箱"6.克隆项目$ git clone 项目地址[scode type="yellow"]如果用http协议地址的话直接 git clone http.... 即可，但如果想免密推送需要使用git协议的地址进行克隆。如果ssh是默认端口那么直接 git clone git:.. 就可以了，但由于我们是在容器内跑的服务，而且将标准22端口映射到宿主机的222端口了，克隆的方法需要改一下，如下。[/scode]# 假设项目地址为 git:abc.com/foo/bar.git # 标准端口22的克隆方法 git clone git:abc.com/foo/bar.git # 非标准端口222的克隆方法 git clone ssh://git@abc.com:222/foo/bar.git7.查看projects文件夹，项目已经克隆下来了5.提交代码到gitlab1.基于以上步骤，在克隆的项目文件夹下新增一个测试文件2.查看同步状态$ git status可以看到红色部分有需要提交的文件3.提交代码$ git add 测试提交的文件.txt(“git add“后加“.”则添加全部文件，也可以加"*.txt"表示添加全部需要提交的txt文件 )add需要提交的文件然后输入以下命令提交并添加提交信息$ git commit -m "message"最后输入以下命令提交到gitlab$ git push origin master提交完成啦再回到gitlab上看该项目就可以看到多了一个txt测试文件
Docker一键安装并运行在后台参数：[your-domain]：换成你自己的主机域名。比如mail.xxx.com。[webmail-port]：映射到80端口的是用于web邮箱前台的端口，可随意修改。[admin-port]：映射到8080端口的是用于管理后台的端口，可随意修改。其他端口映射是邮件服务的标准端口不要修改，且需要保证宿主机这些端口被开放。如果处于内网还要做好端口映射。docker run -d -h [your-domain] --restart=always \ -p 25:25 \ -p 109:109 \ -p 110:110 \ -p 143:143 \ -p 465:465 \ -p 587:587 \ -p 993:993 \ -p 995:995 \ -p [webmail-port]:80 \ -p [admin-port]:8080 \ -v `pwd`/mysql/:/ewomail/mysql/data/ \ -v `pwd`/vmail/:/ewomail/mail/ \ -v `pwd`/ssl/certs/:/etc/ssl/certs/ \ -v `pwd`/ssl/private/:/etc/ssl/private/ \ -v `pwd`/rainloop:/ewomail/www/rainloop/data \ -v `pwd`/ssl/dkim/:/ewomail/dkim/ \ --name ewomail bestwu/ewomail管理后台 http://xxxxx:[admin-port]默认密码是admin / ewomail123邮箱前台 http://xxxxx:[webmail-port]邮箱前台管理 http://xxxxx:[webmail-port]/?admin 默认密码是admin / 12345接收不到邮件，不管是本域名的还是其他外部邮箱(2种解决方法)错误日志报10024端口错误错误原因：10024端口跑的服务主要用于ewomail中反垃圾反病毒作用，然而docker镜像中没有集成，所以会无法接收到邮件。注释/etc/postfix/main.cf中的content_filter = smtp-amavis:[127.0.0.1]:10024cp amavisd.conf.rpmsave amavisd.conf本域名的邮箱可以互发邮件，也可以接收外部邮件，但不能发送外部邮件简单调查了一下发现 telnet smtp.163.com 25 根本连不上，而从国内的服务器就可以连上。说明国内的这些主流邮件服务商基本屏蔽了来自海外的25端口连接，应该是为了屏蔽多数垃圾邮件吧。想绕过就得上代理，很麻烦还不稳定，这对邮件服务来说是不能接受的。于是作罢。继续做了一些测试，结果如下（注意，测试服务器并非租用的云主机而是自建服务器所以25端口本身的出站入站均处于开放状态）从国内IP连接端口25465587smtp.163.com⭕️⭕️⭕️smtp.qq.com⭕️⭕️⭕️smtp.gmai.com❌❌❌从海外IP连接端口25465587smtp.163.com❌⭕️⭕️smtp.qq.com❌⭕️⭕️smtp.gmai.com❌⭕️⭕️可见，在国内是可以用25端口给国内邮箱发送邮件的。而在海外想给国内邮箱发送邮件则必须使用SSL加密的465或587端口。而想给gmail发送邮件则必须使用SSL加密端口。至于国内服务器想给gmail发送邮件，你得先搞定科学上网的问题。以后空了再继续研究SSL加密端口怎么弄吧（并不会），暂时先这样了。官方文档http://doc.ewomail.com/docs/ewomail/jianjie
树莓派利用ffmpeg将外接USB麦克风的音频实时推流到rtmp服务器，实现在任意设备上实时监听音频
系统组成概要其实串流服务器也可以安装在树莓派上，但由于树莓派系统目前只有32位的所以对docker的兼容性很有问题，很多docker的镜像都只支持此64位系统。再就是笔者的树莓派是古老的1代，性能有限，跑一个ffmpeg解码推流就已经占用大部分cpu资源了。所以这里将串流服务安装在另一台ubunbu上 (2023年更新了安装在树莓派4b上的教程，请切换tab阅读)。1. 安装服务端1-1 安装docker在ubuntu上安装docker请参见这篇文章。[post cid="247" cover=""/]1-2 开放服务端口需要开放两个端口，一个是用来监听推流数据的端口1935，一个是用于实时播放用的网页播放器的http服务端口33380。在ubuntu上开放端口的方法请参见这篇文章。[post cid="249" cover=""/]1-3 用docker安装流媒体服务（nginx+rtmp）[scode type="green"]这部分请切换Tab阅读，支持x86架构的ubuntu或者arm64架构的树莓派。[/scode][tabs][tab name="1-3-A-安装在 x86架构服务器上 （比如 ubuntu 18.04 or 20.04 or 22.04）" active="true"]docker pull alfg/nginx-rtmp docker run -it -p 1935:1935 -p 33380:80 --rm alfg/nginx-rtmp说明，容器内的两个端口分别被映射到宿主机的1935和33380（这两个宿主机的端口都可以换成自己喜欢的任意端口，只要和宿主机其他服务不冲突即可），也就是上面开放的两个端口。上面的命令是启动了一个随用随删的一次性容器，在退出会话后会被自动删除。如果想一直保持后台运行可以换成以下命令，对docker的容器机制不熟悉的还是推荐使用上面的一次性容器比较好。docker run -d --name nginx-rtmp -p 1935:1935 -p 33380:80 alfg/nginx-rtmp[/tab][tab name="1-3-B-安装在 arm64架构服务器上 （比如 ubuntu for arm64 on 树莓派4b）" active="false"]下面将用到博主自己制作的适配arm64系统的docker镜像。已经发布在docker hub上。docker pull slipperstree/arm64-nginx-rtmp docker run -it -p 1935:1935 -p 33380:80 --rm slipperstree/arm64-nginx-rtmp说明，容器内的两个端口分别被映射到宿主机的1935和33380（这两个宿主机的端口都可以换成自己喜欢的任意端口，只要和宿主机其他服务不冲突即可），也就是上面开放的两个端口。上面的命令是启动了一个随用随删的一次性容器，在退出会话后会被自动删除。如果想一直保持后台运行可以换成以下命令，对docker的容器机制不熟悉的还是推荐使用上面的一次性容器比较好。docker run -d --name nginx-rtmp -p 1935:1935 -p 33380:80 slipperstree/arm64-nginx-rtmp[/tab][/tabs]2. 客户端 (树莓派)2-1 系统更新sudo apt-get update sudo apt-get upgrade2-2 安装ffmpegsudo apt-get install ffmpeg2-3 插入USB麦克风并查看USB录音设备号码arecord -l运行结果大概是这样的，记住card后面的数字和device后面的数字。本例中是1和0。后面会用到。**** List of CAPTURE Hardware Devices **** card 1: Microphone [Yeti Stereo Microphone], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #02-4 运行ffmpeg推送音频流到串流服务器ffmpeg -f alsa -ac 1 -i hw:1,0 -ar 11025 -f flv rtmp://[your-rtmpserver.com]/stream/hello说明，hw参数后面的1,0就是上一步记下的两个号码card和device，注意顺序，card在前。将[your-rtmpserver.com]换成ubuntu服务器的ip地址或者绑定的域名。如果使用了端口1935那么不需要特别注明端口号，因为这个是rtmp协议的默认端口号。如果你换成了别的端口号比如1999那么需要在域名或ip后指定端口号。比如your-rtmpserver.com:1999。这样执行的效果是立即开始启动录音并实时推送到串流服务器上，直到你按下Ctrl+C强制退出。如果想在后台一直运行可以使用screen工具在一个独立的screen进程中执行。3. 万事俱备，播放串流音频使用串流服务器提供的简易网页播放器在浏览器中打开下面的网址即可开始播放。（PC，手机均可）注意，由于arm版本的镜像制作方法和x86的略有不同，arm镜像暂不支持在网页播放流媒体的方法。http://[your-rtmpserver.com]:33380/player.html?url=http://[your-rtmpserver.com]:33380/live/hello.m3u8端口号就是一开始随便设置的那个端口号。注意，本文里的hello这个id/路径可以随意修改，推送时推什么id那么播放时就用什么id，为安全起见可以用一长串复杂的字符串防止别人偷看/偷听。（但如果不用hello那么播放时就只能使用rtmp协议播放，因为hello这个路径在nginx的配置文件中默认写死了，如果有兴趣可以自己修改容器内nginx的配置文件来适配别的id）使用音视频播放软件x86版服务器：以Mac上的VLC播放器为例，「媒体-打开网络串流」输入流媒体地址稍等片刻缓冲好了即可播放。流媒体地址： http://[your-rtmpserver.com]:33380/live/hello.m3u8arm64版服务器:以Win11上的VLC播放器为例，「媒体-打开网络串流」输入流媒体地址稍等片刻缓冲好了即可播放。流媒体地址： rtmp://[your-rtmpserver.com]/stream/hello注意arm版本使用的流媒体地址是rtmp协议的，暂不支持http协议的m3u8格式。
感谢镜像作者pch18[button color="success" icon="glyphicon glyphicon-user" url="https://pch18.cn/archives/docker-baota.html" type=""]作者原文[/button][scode type="yellow"]如果还没有安装docker的话可以参考以下文章安装[/scode][post cid="247" /]通过host模式运行宝塔镜像docker run -tid --name baota --net=host --privileged=true --shm-size=1g --restart always-v ~/wwwroot:/www/wwwroot -v ~/wwwbackup:/www/backup pch18/baota建议使用上述host网络模式启动,不需要设置映射端口,自动映射宝塔面板全端口到外网正常的bridge模式可能会造成网站后台不能获取用户真实ip地址.通过bridge模式运行宝塔镜像如果特殊情况不能使用host网络模式(macos和windows不支持host), 使用下述命令重新以bridge网络模式运行docker run -tid --name baota -p 80:80 -p 443:443 -p 8888:8888 -p 888:888 --privileged=true --shm-size=1g --restart always -v ~/wwwroot:/www/wwwroot -v ~/wwwbackup:/www/backup pch18/baota登录方式登陆地址 http://{{面板ip地址}}:8888[scode type="yellow"]如果不能访问很可能是因为宿主服务器没有开放8888端口，参见以下文章开放即可。[/scode][post cid="249" /]初始账号 username初始密码 password[scode type="red"]这里镜像作者给出的默认密码password不正确，并不能登录，需要手动重置一次密码，进入容器后执行bt命令即可修改用户名和密码。[/scode]$ docker exec -it baota /bin/bash [root@dynabook wwwroot]# bt删除容器命令如下docker rm -fv baota版本命名说明[scode type="blue"]pch18/baota或pch18/baota:latest等同pch18/baota:lnmppch18/baota:lnmp为最新版本的官方纯净安装的基础上安装nginx,mysql,phppch18/baota:lnp 为官方版本纯净安装的基础上安装nginx,php(不内置mysql,用于外置数据库的环境)pch18/baota:lamp 为官方版本纯净安装的基础上安装apache,phppch18/baota:lap 为官方版本纯净安装的基础上安装apache,php(不内置mysql,用于外置数据库的环境)pch18/baota:clear 为官方版本纯净安装, 不默认安装nginx,mysql,php等程序/www文件夹建议保存在volume卷中, /www/wwwroot建议映射到宿主机的目录下,方便上传网站代码等文件[/scode]安装完成后以后可以随时使用内置升级,升级到最新版本,由于面板数据都保存在持久化的卷中, 即使删除容器(不删除volumn)后重新运行, 原来的面板和网站数据都能得到保留.启动容器时自动启动所有服务Docker镜像以及说明来源 Docker Hub
在Ubuntu18.04上安装Docker和Docker Compose。2021年春
以下是在2021年4月在Ubuntu 18.04上安装Docker的步骤。[scode type="green"]请切换Tab阅读。[/scode][tabs][tab name="1-系统环境" active="true"]系统环境% cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"[/tab][tab name="2-安装 Docker Engine"]安装 Docker Engine - Community for Ubuntu[button color="success" icon="glyphicon glyphicon-link" url="https://docs.docker.com" type=""]https://docs.docker.com[/button]详情参见以上URL官方文档。这里只记录执行的命令行。% sudo apt update % sudo apt install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common % curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - % # 注意下面的arch=amd64命令是给x86架构使用的，如果是arm架构比如树莓派4，请修改成arm64 % sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"% sudo apt update % sudo apt install docker-ce docker-ce-cli containerd.io % docker -v Docker version 19.03.5, build 633a0ea838[scode type="share"]docker: Got permission denied 错误发生时执行下面的命令。[/scode]% sudo usermod -aG docker ${USER}执行后、logout一次（exit），重新login到终端，再次执行错误消失。[/tab][tab name="3-安装 Docker Compose"]安装 Docker Compose[button color="success" icon="glyphicon glyphicon-link" url="https://docs.docker.com" type=""]https://docs.docker.com[/button]详情参见以上URL官方文档。这里只记录执行的命令行。以下命令需要在安装完Docker以后执行。[scode type="blue"]下面是安装目前的最新版本v2.17.3作为例子。参见 https://github.com/docker/compose/releases 如果有新版请安装新版本，修改下面命令中的版本号即可。可用 $(uname -s) $(uname -m)来查看当前系统架构以下载正确的版本。注意，下面的命令中已经用$(uname -m)变量代替CPU架构的部分了，如有大小写错误请自行参考github的release修改成固定值。比如x86_64 / aarch64等[/scode]% sudo curl -L "https://github.com/docker/compose/releases/download/v2.30.0/docker-compose-linux-$(uname -m)" -o /usr/local/bin/docker-compose % sudo chmod +x /usr/local/bin/docker-compose % docker-compose -v docker-compose version 1.29.1, build c34c88b2[scode type="share"]在/usr/bin 里面加上软连接 ln 比较好，但并不是必须的。[/scode]% sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose[/tab][tab name="3-安装 Portainer 管理后台 （非必须）"]安装 Portainer[button color="success" icon="glyphicon glyphicon-link" url="https://docs.portainer.io/start/install-ce/server/docker/linux" type=""]官方文档[/button]详情参见以上URL官方文档。这里只记录执行的命令行。% docker volume create portainer_data % docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest启动后台以后访问 https://your-server-ip:9443 来进行初始化配置，比如设置用户密码等。[/tab][/tabs]
挂载局域网共享目录到树莓派创建树莓派上的挂载点mkdir /home/pi/share编辑配置文件sudo nano /etc/fstab添加以下命令，第一个参数是自己局域网中的某个共享目录，第二个参数是刚刚建立的本地挂载点，用户名密码一般不需要这里随便填了个aaa省略也可，如有需要则修改//192.168.0.13/移动磁盘-C(aaa)/share /home/pi/share cifs username=XXX,password=XXX,vers=1.0 0 0启动挂载sudo mount -a进入挂载点可以看到共享目录已经成功挂载cd /home/pi/share ls -l在docker上部署syncthing拉取syncthing官方docker镜像docker pull syncthing/syncthing运行容器将数据目录映射到刚刚挂载的share目录/home/pi/share:/var/syncthing 端口8384：主要用于Remote web UI的访问 端口22000：是用做同步协议的端口 docker run -p 8384:8384 -p 22000:22000 -v /home/pi/share:/var/syncthing syncthing/syncthing:latest访问控制台http://ip:8384与手机共享同步目录手机安装syncthing客户端（只支持安卓）添加设备扫描电脑ui上的设备二维码同样的，在电脑上添加手机设备id手机上默认有一个相册文件夹，这里我们添加一个新文件夹，比如download文件夹，添加时同时打开电脑设备的一个开关即可通知电脑UI有远程设备与你共享文件夹，同意即可。查看本地共享目录下会自动新建一个手机同步的文件夹并开始同步。然后就可以通过这个目录跟手机进行文件的同步了。