标签归档:docker

如何判断一个进程是否运行在容器中

1、查看该进程的 PID

以 nginx 为例

# ss -ntpl | grep nginx
LISTEN     0      511          *:88                       *:*                   users:(("nginx",pid=28791,fd=8),("nginx",pid=28790,fd=8),("nginx",pid=28789,fd=8),("nginx",pid=28788,fd=8),("nginx",pid=28787,fd=8))
LISTEN     0      511          *:80                       *:*                   users:(("nginx",pid=28791,fd=7),("nginx",pid=28790,fd=7),("nginx",pid=28789,fd=7),("nginx",pid=28788,fd=7),("nginx",pid=28787,fd=7))

或通过 ps -aux ,第二列就是 PID

ps -aux | grep nginx
root     28787  0.0  0.0  10560  1804 ?        Ss   09:33   0:00 nginx: master process
100      28788  0.0  0.0  11076  2884 ?        S    09:33   0:00 nginx: worker process
100      28789  0.0  0.0  11024  2500 ?        S    09:33   0:00 nginx: worker process
100      28790  0.0  0.0  11056  2888 ?        S    09:33   0:00 nginx: worker process
100      28791  0.0  0.0  11024  2500 ?        S    09:33   0:00 nginx: worker process
root     31719  0.0  0.0 112812   976 pts/2    S+   09:59   0:00 grep --color=auto nginx

2、查看进程的 cgroup

cat /proc/<pid>/cgroup
# cat /proc/28791/cgroup                                                                                                                                                                               
11:perf_event:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
10:pids:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
9:freezer:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
8:memory:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
7:devices:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
6:cpuacct,cpu:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
5:hugetlb:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
4:net_prio,net_cls:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
3:blkio:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
2:cpuset:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5
1:name=systemd:/docker/21d0cf703b4719cf1c86d1c0094773ff1c580e8fb039fc95b9021726dd2cb5c5

看到例如CPU、内存、磁盘都在 docker 中,因此此进程应该是运行在容器中。

3、确认容器服务

docker ps | grep <容器ID前4到10位>

# docker ps | grep 21d0c
21d0cf703b47   nginx   "tini entrypoint.sh"   32 minutes ago   Up 32 minutes      mynginx

rocky linux 9.3 安装 docker

sudo dnf check-update
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
sudo systemctl status docker

非 root 账号添加权限

sudo usermod -aG docker $(whoami)

使用 docker-compose 启动

docker compose up -d

docker 无法启动 mysql 容器可能的解决办法

启动 mysql:8.* 效果很好,但 mysql:5.7.* 会导致立即 100% 内存消耗,尝试通过以下方法解决。

方法1

  1. 编辑 /lib/systemd/system/containerd.service ,修改 LimitNOFILE=infinityLimitNOFILE=1048576
  2. sudo systemctl daemon-reload
  3. sudo systemctl restart containerd.service

再尝试启动 mysql 容器。

方法2

  1. 编辑 /etc/docker/daemon.json
{
    // 原有配置...
    "default-ulimits": {
        "nofile": {
            "Name": "nofile",
            "Hard": 64000,
            "Soft": 64000
        }
    }
}

2. 重启服务 systemctl restart docker

参考:https://sukbeta.github.io/docker-ulimit-configure/

docker容器的重启策略

Use a restart policy

To configure the restart policy for a container, use the --restart flag when using the docker run command. The value of the --restart flag can be any of the following:

FlagDescription
noDo not automatically restart the container. (the default)
on-failure[:max-retries]Restart the container if it exits due to an error, which manifests as a non-zero exit code. Optionally, limit the number of times the Docker daemon attempts to restart the container using the :max-retries option.
alwaysAlways restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stoppedSimilar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.

参考:https://docs.docker.com/config/containers/start-containers-automatically/

docker 退出集群模式的办法

当收到如下警告:

WARNING: The Docker Engine you’re using is running in swarm mode.

如果确认不需要/没有使用集群模式,可以使用以下命令退出:

docker swarm leave --force

阿里ECS部署jar包发生无法解析计算机名的问题

在ECS上利用 docker 部署 jar 包时出现如下错误:

redis.clients.jedis.HostAndPort - cant resolve localhost address

是因为spring-redis在初始化时会实例化LocalHost,但是ECS的host name并没有在设置,解决方案是在 /etc/hosts 中设置ECS的host name。

比如:ssh 登录后,界面显示 user@abcdefg ,则在 /etc/hosts 中添加 127.0.0.1 abcdefg