记录一些使用 Docker 的经验和技巧,备忘 📝

加速

Docker 镜像加速

尝试过各种国内镜像,最终发现还是阿里云的最快,这与 【测速】使用不同的Docker镜像加速器下载速度 对比测试 这篇博客中的测试结果一致。由于阿里云会为每个用户分配独立的加速器地址,建议有阿里云账号的还是用自己的地址,查看方式是,登录阿里云账号后进入控制台,然后【容器镜像服务】->【镜像工具】->【镜像加速器】查看:
aliyun_mirrors

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

镜像内 apt 更换为清华源

编写 Docker 文件的时候,经常需要在基础镜像的基础上通过包管理安装额外的软件。基于 debian 的基础镜像通过默认源安装阮建师速度会慢得令人发指,替换成国内源则可以大幅提速。个人经验清华源在速度、仓库丰富度、更新及时性多个方面都是较为优秀的:
Debian 镜像使用帮助

通过在 Dockerfile 中加入如下命令即可:

1
RUN apt install apt-transport-https ca-certificates && sed -i 's|deb.debian.org|mirrors.ustc.edu.cn|g' /etc/apt/sources.list

实用工具

Watchtower – 自动更新 Docker 镜像与容器

Quick Start

  • 监控更新所有容器:
    1
    docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
  • 只更新某个容器一次
    1
    docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once portainer
  • 只监控更新指定容器
    1
    docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --label-enable
    然后需要被监控的容器运行命令中加入 --label='com.centurylinklabs.watchtower.enable=true'

dive - 查看镜像层级和文件目录

A tool for exploring each layer in a docker image

用法:

1
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive:latest [image]:[tag]

dive

构建镜像瘦身

将容器作为程序运行

dart

1
2
3
docker run --rm -it -v ${PWD}:/runner --workdir /runner dart:stable dart --version

alias dart="docker run --rm -it -v ${PWD}:/runner --workdir /runner dart:stable dart"

php

Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
FROM php:7.4-cli

RUN apt install apt-transport-https ca-certificates && sed -i 's|deb.debian.org|mirrors.ustc.edu.cn|g' /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
librabbitmq-dev \
libssh-dev \
zip \
unzip \
zlib1g-dev \
libzip-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install zip \
&& docker-php-ext-install sockets

RUN pecl install redis-5.3.1 \
&& pecl install mongodb-1.7.5 \
&& pecl install xdebug-2.8.1 \
&& pecl install amqp \
&& docker-php-ext-enable redis mongodb xdebug amqp

RUN echo "xdebug.enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
echo "xdebug.idekey=PHPSTORM" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
echo "xdebug.remote_host=172.17.0.1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

EXPOSE 8000

构建、运行

1
2
docker build -t php-runner .
docker run --name="php-runner" -it --rm php-runner /bin/bash

PhpStorm 配置

首先在如下设置页面选择新增来自 Docker 的解释器
ps1
然后在弹框中选择 Docker,再在下拉框中选择编译好的 php-runner 镜像
ps2
运行或调试代码前选择这个解释器,效果如下图所示,可以看到断点调试工作正常
ps3

利用 docker-compose 跑服务

Piwigo

Piwigo - 管理您的图像收藏

docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
version: "2.1"

services:
mysql:
image: mysql:latest
restart: always
container_name: piwigo_mysql
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: [password]
MYSQL_DATABASE: piwigo
MYSQL_USER: debuggerx
MYSQL_PASSWORD: [password]
volumes:
- /mnt/hd500/db:/var/lib/mysql
ports:
- "3306:3306"
networks:
- mynet

piwigo:
image: lscr.io/linuxserver/piwigo
container_name: piwigo
links:
- mysql
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /mnt/hd500/config:/config
- /mnt/hd500/gallery:/gallery
ports:
- 80:80
networks:
- mynet
restart: unless-stopped

networks:
mynet:
driver: bridge

Files Gallery
Tiny File Manager
How to deal with permissions using docker - nginx / php-fpm
一键部署的相册和文件管理器:docker_gallery_with_manager