0%

docker

1. 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 删除老版本
sudo apt-get remove docker docker-engine docker.io

# 安装
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce

# 添加docker组
# sudo groupadd docker
# sudo gpasswd -a ${USER} docker
# sudo systemctl restart docker
# 切换当前会话到新 group 或者重启 X 会话

# 查看当前用户所在的所有用户组
groups
# 将用户添加到 docker 用户组
sudo usermod -a -G docker <username>
# 刷新
newgrp - docker

2. 镜像

通过修改镜像源地址, 加快镜像下载速度.
镜像源配置文件是: /etc/docker/daemon.json

  1. 使用daoCloud的镜像加速器
2.0.0.0.1. 修改方法

不同环境可查看 https://www.daocloud.io/mirror#accelerator-doc

在linux下使用如下命令配置:

1
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://85ad13ff.m.daocloud.io
  1. 阿里云镜像加速器

注册 https://cr.console.aliyun.com/
之后访问 https://cr.console.aliyun.com/#/accelerator
获得专属加速器
/etc/docker/daemon.json

1
2
3
{
"registry-mirrors": ["https://61mj61jz.mirror.aliyuncs.com"]
}
1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

3. 网络

1
docker run --net=bridge

4. 修改Docker的默认镜像存储位置

可能会需要镜像太多, 或者磁盘分配太小, 之后导致无法再下载镜像,或者容器无法启动.
我们可能需要将镜像存储位置移动到其他文件目录下.

默认镜像存储位置是 /var/lib/docker

1
2
# 通过该命令查看默认镜像存储位置
docker info | grep 'Docker Root Dir'

4.1. 方式 1: 修改Docker的默认镜像存储位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 停止服务
systemctl stop docker

# 对之前的数据做个文件备份, 如果有把握可以跳过
tar -zcC /var/lib/docker >/mnt/var_lib_docker-backup-$(date + %s).tar.gz

# 迁移整个/var/lib/docker目录到目的路径
mv /var/lib/docker /home/raven/Package/docker

# 建立symlink软链接
ln -s /data/tools/docke /var/lib/docker

# 确认文件夹类型为symlink 类型
ls -al /var/lib/docker

# 重启服务
sudo systemctl start docker

4.2. 方式 2: 修改镜像和容器的默认存放路径

/etc/default/docker 中修改

DOCKER_OPTS="-g /home/raven/Package/docker"

之后重启服务

或者 修改 /etc/docker/daemon.json

{“registry-mirrors”: [“http://***.***.com”],“graph”:"/home/raven/Packages/docker"}

修改后立即生效

5. 容器管理工具

以下 3 个工具都能通过文件配置管理与发布 Docker 容器.

5.1. Docker Compose

Docker Compose 只能管理当前主机上的容器

5.2. Docker Swarm

Docker Swarm 能管理多主机上的容器, 是由 Docker 公司开发的

5.3. Kubernates

Kubernates 也能管理多主机上的容器, 是有谷歌开发的.
Kubernates 比 Docker Swarm 更主流有点, 目前很多大公司使用它作为默认容器管理工具.

6. Problem

6.1. 1. 动态设置 容器最大内存

在部署docker应用, 应用编排时都需要指定一个内存的最大使用上限.
如果应用使用的内存超过了配额, 镜像会被kill掉.
所以java微服务应用, 有必要设置应用自己的最大内存.

docker镜像服务的内存不能全部给 -Xmx , 因为JVM消耗的内存不仅仅是Heap.

JVM = Heap + Method Area +Constant Pool + Thread Stack * num of thread .

Xmx的值可设置为镜像上限减去150m或200m.
当然还需要考虑应用自身的特点, 比如class数目, 并发线程数等.

通过 cgroups 动态获取容器资源配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# git memory limit size
limit_in_bytes=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes)

# If not default limit_in_bytes in cgroup
if [ "$limit_in_bytes" -ne "9223372036854771712" ]
then
limit_in_megabytes=$(expr $limit_in_bytes \/ 1048576)
heap_size=$(expr $limit_in_megabytes - $RESERVED_MEGABYTES)
export JAVA_OPTS="-Xmx${heap_size}m $JAVA_OPTS"
echo JAVA_OPTS=$JAVA_OPTS
fi

# start tomcat

7. 常见问题

7.1. docker 杀死容器

解决办法, 调整容器分配的内存到 1280m , 调整jvm分配的内存, 大致参数如下:

-Xms512m -Xmx512m -XX:ReservedCodeCacheSize=128m -XX:+UseCodeCacheFlushing -XX:MetaspaceSize=192m -XX:MaxMetaspaceSize=192m -XX:MaxDirectMemorySize=64m

明确已知内存 512m + 128m + 192m + 64m 共 896m,

另外线程预留 128m (预留 200线程, 每线程 512k)

剩余 256m 作为余量

8. Resource