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
我觉得将 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_HOST=ssh://your-remote-host docker info
为了方便使用,将 export DOCKER_HOST=ssh://your-remote-host 写入 ~/.zshrc 即可
我的 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 container、dangling images、build cache
docker system prune
如果还释放的更彻底的话,可以使用下面命令,它同时会删除 all volumes not used by at least one container、all 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 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
# 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
# import from container
docker export container-id > my-image.tar
docker import - my-image < my-image.tar
# use BuildKit
RUN mkdir /root/.m2
RUN --mount=type=cache,target=/root/.m2 mvn -B clean install -DskipTests
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