Skip to content

Instantly share code, notes, and snippets.

@zh4n7wm
Last active August 3, 2021 06:39
Show Gist options
  • Select an option

  • Save zh4n7wm/3a23f2c82a5f27a06cf5be3825a1dea3 to your computer and use it in GitHub Desktop.

Select an option

Save zh4n7wm/3a23f2c82a5f27a06cf5be3825a1dea3 to your computer and use it in GitHub Desktop.
Docker Tips

Ubuntu 安装 docker/docker-compose

sudo apt-get upgrade -yq
sudo apt-get remove -yq docker docker-engine docker.io containerd runc
sudo apt-get install -yq apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update -yq
sudo apt-get install -yq docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

设置 docker container 时区

我觉得将 host 的 /etc/timezone、/etc/localtime 挂载到 docker container 是不好的,应该为 docker container 单独设置 timezone

下面是 Ubuntu 系统的设置,其它系统类似只是安装包的命令不同。

ENV TZ "Etc/UTC"
RUN echo $TZ > /etc/timezone && \
apt-get -y update && \
apt-get install -y tzdata && \
rm -f /etc/timezone && ln -snf /usr/share/zoneinfo/$TZ /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata

Alpine Linux Setting the timezone

连接远端的 docker

通过 ssh + DOCKER_HOST 实现

推荐该方法,它比下面的安全。

使用

DOCKER_HOST=ssh://your-remote-host docker info

为了方便使用,将 export DOCKER_HOST=ssh://your-remote-host 写入 ~/.zshrc 即可

让 docker daemon 监听 tcp 2375 端口

我的 Mac 硬盘快满了,而 docker image 又非常占用硬盘,Mac 上的 docker 也非常占用内存;好在我还有一台配置比较低,但硬盘很大的机器,所以,我在另一台机器上跑 docker。

修改 /etc/systemd/system/multi-user.target.wants/docker.service ,增加 -H tcp://0.0.0.0:2375

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock

Mac 上使用 Docker,修改 ~/.zshrc ,增加

# docker
export DOCKER_HOST=tcp://your-remote-host:2375

然后,

$ exec $SHELL
$ docker info  # 可以看到已经连到连一台机器的 docker 了

注:这种使用方法是不安全的;只要知道了你运行 docker 的主机 ip/port,谁都可以连上用的

释放硬盘空间

docker 使用是非常消耗硬盘空间的,通过下面命令可以尽可能释放硬盘空间。

查看 docker 占用的硬盘空间:

docker system df

# 如果想查看更详细的输出,可以加上 `-v` 选型

释放硬盘空间,释放 stopped containers、networks not used by at least one containerdangling images、build cache

docker system prune

如果还释放的更彻底的话,可以使用下面命令,它同时会删除 all volumes not used by at least one containerall images without at least one container associated to

docker system prune -a --volumes

释放 container logs

sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'

仔细观察可能还会发现有些容器的日志占用了大量硬盘空间,可以通过系统自动的 logrotate 释放

cat /etc/logrotate.d/docker-log

/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  size=10M
  missingok
}

# 上面命令的意思是每天将日志压缩,如果占用磁盘空间大于10M就丢弃一些日志;只保留最近7天的日志

释放 docker registry 占用的硬盘空间

docker exec -it "$(docker ps | grep 'registry:2' | awk '{print $1}')" bin/registry garbage-collect /etc/docker/registry/config.yml --delete-untagged=true

如果通过 crontab 定期运行,则删除 docker exec -it 中的 t,写成 docker exec -i ...

ERROR: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

docker network create test1 --subnet 172.18.0.0/16

参考:https://medium.com/@loomchild/docker-can-only-create-31-default-networks-e7f98f778626

share docker image

save/load from docker image

# save
docker save -o my-image.tar my-image

# import
docker rmi my-image
docker load < my-image.tar

# note: replace `my-image` with the real docker image

export/import from container

# import from container
docker export container-id > my-image.tar
docker import - my-image < my-image.tar

BuildKit

cache .m2 dir

maven

# use BuildKit
RUN mkdir /root/.m2
RUN --mount=type=cache,target=/root/.m2 mvn -B clean install -DskipTests

nodejs - npm

RUN mkdir /root/.npm
RUN --mount=type=cache,target=/root/.npm npm install
RUN --mount=type=cache,target=/root/.npm npm run build:prod

run docker build

DOCKER_BUILDKIT=1 docker build ...

日志问题:docker build "output clipped, log limit 1MiB reached"

将下面配置添加到 /etc/docker/daemon.json ,然后重启 docker service

"log-opts": {
	  "max-size": "50m"
  }

重启 docker service

sudo systemctl restart docker
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment