Files
2025-12-04 09:12:56 +08:00

16 KiB
Raw Permalink Blame History

docker tips

#docker #tips

官方教程

Samples | Docker Documentation

docker 验证

docker_auth GitHub - cesanta/docker_auth: Authentication server for Docker Registry 2

harbor GitHub - goharbor/harbor: An open source trusted cloud native registry project that stores, signs, and scans content.

nexus

docker 安装源

Debian Docker 安装 | 菜鸟教程

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -
add-apt-repository \
   "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
  $(lsb_release -cs) \
  stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

docker 容器镜像源

阿里云容器镜像服务 镜像库可能只包含流行的公有镜像,而私有镜像仍需要从美国镜像库中拉取。 但是portianer 要先在images中pull 可以找到80x86/filebrowser

Registry

https://upm3cnhv.mirror.aliyuncs.com

汇总最近更新的一些docker镜像群晖威联通等通用_网摘资源部落_社区_115一生相伴 oldiy's Profile - Docker Hub 30多个N1可用docker镜像-百度云同步、1898种dos游戏、花生壳、可道云、蚂蚁笔记... - 斐讯无线路由器以及其它斐迅网络设备 - 恩山无线论坛 - Powered by Discuz! DaoCloud | Docker 极速下载

docker国内镜像源Azure 中国(最快镜像源)

vim /etc/docker/daemon.json

{
    "registry-mirrors": ["https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}

docker 容器启动后立马退出的解决方法

Docker容器后台运行,就必须有一个前台进程

tail -f /dev/null

docker run -d --name mycentos-zp5 -d centos:7.4.1708 /bin/sh -c "while true;do echo hello;sleep 5;done"
sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

docker run -d --name mycentos-zp4 -d centos:7.4.1708 ping 8.8.8.8

docker run -dit --name ubuntu2 ubuntu
docker run -d --name ubuntu ubuntu /bin/bash -c "tail -f /dev/null"





#####
# docker-nginx-amplify/entrypoint.sh 
有这种写法
nginx -g "daemon off;" &
nginx_pid=$!
wait ${nginx_pid}

查看docker container内进程信息及与宿主机上进程的映射关系

1、docker ps 找到对应的容器 2、根据container id 找到容器在宿主机上映射后的进程信息 docker top id 就会得到类似下面的信息其中PID是容器内进程在宿主机上的pidppid是容器内进程在宿主机上的父进程pid 查看docker container内进程信息及与宿主机上进程的映射关系 - 衣舞晨风 - CSDN博客

映射的host目录 好像会自己建立

在portainer上试验是这样的

PUID=1000 and PGID=1000

id应该是按主机上的用户id来定义 建立文件和文件夹的权限是该账户的 -e TZ="Asia/Shanghai" -e HOST_OS="Unraid" -e 'PUID'='99' -e 'PGID'='100'

Understanding PUID and PGID - LinuxServer.io

id $user

查看一个正在运行的Docker容器的启动命令

docker ps -a --no-trunc

apt-get install python-pip pip install setuptools pip install runlike runlike Docker_container_name runlike -p Docker_container_name

docker开启远程tcp监听端口

Docker TCP远程连接_慕课手记

https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file

You cannot set options in daemon.json that have already been set on daemon startup as a flag. On systems that use systemd to start the Docker daemon, -H is already set, so you cannot use the hosts key in daemon.json to add listening addresses. See https://docs.docker.com/engine/admin/systemd/#custom-docker-daemon-options for how to accomplish this task with a systemd drop-in file.

configure-docker-to-start-on-boot Post-installation steps for Linux | Docker Documentation

Configure where the Docker daemon listens for connections Post-installation steps for Linux | Docker Documentation

按官方文档的说法好像在centos里面用不了 daemon.json 来配置 host

/etc/docker/daemon.json

{
  "registry-mirrors": ["https://upm3cnhv.mirror.aliyuncs.com"],
  "hosts": ["tcp://192.168.66.254:2375", "unix:///var/run/docker.sock"]

  "hosts": ["tcp://0.0.0.0:22375", "unix:///var/run/docker.sock"]

}

所以使用下面的方法

systemctl edit docker.service

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:22375

重启docker网络

systemctl daemon-reload

重启docker服务 重启 docker

systemctl restart docker
systemctl status docker.service

curl -l http://localhost:22375/info

Non-Root

Work With Non-Root Containers for Bitnami Applications

docker 普通用户 将docker权限添加给普通用户

将docker权限添加给普通用户 - 简书 使用普通用户执行 docker - klvchen - 博客园

cat /etc/group
sudo gpasswd -a userapp docker



# 最好不要用这个命令,这个命令可以添加一个用户到指定的组,但是以前添加的组就会清空掉
# 所以想要添加一个用户到一个组,同时保留以前添加的组时,请使用 gpasswd 这个命令来添加操作用户
# usermod -G docker userapp  

#####
groupadd docker
gpasswd -a ${USER} docker    

网络

drone 有时候会导致整个服务器网络异常

docker network ls
docker network rm drone-ysqYZHndoYiYX2ndglk8

docker 中访问宿主

宿主执行 ip a 看docker0 网卡的ip 一般是 172.17.0.1

host 模式

docker 网络-host - 简书 容器与主机在相同的网络命名空间下面,使用相同的网络协议栈,容器可以直接使用主机的所有网络接口

host 模式 不能使用端口映射和自定义路由规则,这些都与主机一致,-p 与-icc 参数是无效的

host 模式下面的网络模型是最简单和最低延迟的模式,容器进程直接与主机网络接口通信,与物理机性能一致

docker run -itd --net host --name C1 hub.c.163.com/library/alpine:latest

判断系统是否运行在Docker环境中

判断系统是否运行在Docker环境中_白帽子技术/思路_i春秋社区-分享你的技术,为安全加点温度.

cat /proc/1/cgroup|grep docker

# docker
root@55ff7ae5bdae:~# cat /proc/1/sched | head -n 1
startWebLogic.s (8212, #threads: 1)
root@55ff7ae5bdae:~#

# real
root@kali:~# cat /proc/1/sched | head -n 1
systemd (1, #threads: 1)
root@kali:~#



# real
root@kali:~# ps -q1
   PID TTY          TIME CMD
     1 ?        00:00:02 systemd
root@kali:~#


# docker
root@55ff7ae5bdae:~# ps -p 1
  PID TTY          TIME CMD
    1 ?        00:00:00 startWebLogic.s
root@55ff7ae5bdae:~#

容器内查看运行时间

uptime command gives weird results in a docker image - Server Fault stat /proc/1/cmdline

unraid 的docker命令

root@localhost:# /usr/local/emhttp/plugins/dynamix.docker.manager/scripts/docker create --name='nginx' --net='bridge' --log-opt max-size='50m' --log-opt max-file='1' -e TZ="Asia/Shanghai" -e HOST_OS="Unraid" -e 'PUID'='99' -e 'PGID'='100' -p '2280:80/tcp' -p '22443:443/tcp' -v '/mnt/user/appdata/nginx':'/config':'rw' 'linuxserver/nginx' 
1c20c14ca61487a84313eac231c46fdaa0818eb1e5a872246abd6147c97f8945

docker restart policy

Docker容器的重启策略及docker run的--restart选项详解_运维_成长的足迹-CSDN博客

no不自动重新启动容器。默认默认策略在容器退出时不重启容器

on-failure 由于一个错误退出它表现为退出状态不等于0自动启动容器 on-failure:3在容器非正常退出时重启容器最多重启3次

unless-stopped :除非被显式停止 stop、kill 否则docker服务停止或自动重启自动启动容器 在容器退出时总是重启容器但是不考虑在Docker守护进程启动时就已经停止了的容器

always如果容器停止总是重新启动容器。这是官方解释如果手动kill容器 无法自动重启,应该也属于正常 如果手动都不能让他停止 也许我们会更烦恼怎么停止它~~~~)在容器退出时总是重启容器

使用重新启动策略时请记住以下几点:

  1. 重新启动策略仅在容器启动成功后才生效。在这种情况下启动成功意味着容器已启动至少10秒并且Docker已开始监视它。这可以防止根本不启动的容器进入重启循环。
  2. 如果手动停止容器则会忽略其重新启动策略直到Docker守护程序重新启动或手动重新启动容器。这是另一个防止重启循环的尝试。
  3. 重新启动策略仅适用于容器。群集服务的重新启动策略配置不同。 https://docs.docker.com/engine/reference/commandline/service_create/

Configure Docker to use a proxy server 容器内代理

两种方式

一个是配置文件 一个是容器的环境变量

Variable Dockerfile example docker run Example
HTTP_PROXY ENV HTTP_PROXY "http://127.0.0.1:3001" --env HTTP_PROXY="http://127.0.0.1:3001"
HTTPS_PROXY ENV HTTPS_PROXY "https://127.0.0.1:3001" --env HTTPS_PROXY="https://127.0.0.1:3001"
FTP_PROXY ENV FTP_PROXY "ftp://127.0.0.1:3001" --env FTP_PROXY="ftp://127.0.0.1:3001"
NO_PROXY ENV NO_PROXY "*.test.example.com,.example2.com" --env NO_PROXY="*.test.example.com,.example2.com"

宿主机进程的问题

在Linux宿主机审计docker进程和网络连接 - 血梦博客 - 专注于网络安全|渗透测试|代码审计|国内最专业的黑客技术博客

有docker字样的是docker进程

root@unRaid:~# cat /proc/23437/cgroup
10:pids:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
9:perf_event:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
8:net_cls:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
7:freezer:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
6:devices:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
5:memory:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
4:blkio:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
3:cpuacct:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
2:cpu:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f
1:cpuset:/docker/069de498d1d22d31565ea8816981cb4d546e5437bb0e84ff0d6bdc2655475b5f

保存修改后的容器

保存对容器的修改 - Docker入门教程 - docker中文社区

commit 之前最好停止容器

查看被修改的容器docker ps -l 提交指定容器保存为新的镜像: docker commit <container id> <new image name> 查看本地所有镜像docker images

Docker保存修改后的镜像 - 知乎

docker run -it ubuntu:16.04 /bin/bash

docker run -it openjdk:8-jdk /bin/bash
docker commit d3742a06f8ae openjdk-tesseract

Docker 配置 HTTP 代理

Docker配置HTTP代理 - Hazx小屋

配置的 HTTP 代理主要用于 Docker 拉取 (pull) 和推送 (push) 镜像使用。不会影响 Docker 容器的联网状态。 Docker 代理仅支持 HTTP 协议。 若有特殊需求,请自备梯子。 代理地址配置为自己的本地服务器地址,必须是 HTTP 代理协议。 NO_PROXY 配置跳过代理的地址,需要填入所以用到的本地地址,支持 *,多个地址用逗号隔开。

mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://192.168.100.100:8080/"
Environment="HTTPS_PROXY=http://192.168.100.100:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,10.96.0.1,192.168.*"


systemctl daemon-reload

systemctl restart docker

docker 运行 代理

Configure Docker to use a proxy server | Docker Documentation

Variable Dockerfile example docker run Example
HTTP_PROXY ENV HTTP_PROXY="http://127.0.0.1:3001" --env HTTP_PROXY="http://127.0.0.1:3001"
HTTPS_PROXY ENV HTTPS_PROXY="https://127.0.0.1:3001" --env HTTPS_PROXY="https://127.0.0.1:3001"
FTP_PROXY ENV FTP_PROXY="ftp://127.0.0.1:3001" --env FTP_PROXY="ftp://127.0.0.1:3001"
NO_PROXY ENV NO_PROXY="*.test.example.com,.example2.com" --env NO_PROXY="*.test.example.com,.example2.com"

ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule

原因是防火墙关闭之后需要重启docker服务

service docker restart

tools

ctop 监控 ctop CTOP一款管理Docker容器的TOP命令 | 佰阅部落

Docker 与 Vagrant 的区别? - V2EX docker 部署方式 - V2EX 有什么好玩的自建服务没? 最近在玩 docker搭上瘾了。。。。。 - V2EX

实在没理解 docker 或 vagrant 是怎么统一 开发 环境的 - V2EX Dockerize PostgreSQL | Docker Documentation

docker 使用 mysql 时选择新建 mysql 容器还是单一容器内新开 mysql 进程? - V2EX

docker 建议是单一进程的,也就是这一个容器里只跑一个进程 别在 docker 上跑数据库,会被坑死的

京东MySQL数据库Docker化最佳实践附PPT - MySQL - dbaplus社群围绕Data、Blockchain、AiOps的企业级专业社群。技术大咖、原创干货每天精品原创文章推送每周线上技术分享每月线下技术沙龙。

容器监控实践—cAdvisor - 简书

Samples | Docker Documentation

资料

WORKDIR 指定工作目录-Docker — 从入门到实践

books

Docker — 从入门到实践