从Docker-Desktop迁移到wsl2

最近更新升级了最新版本的 Docker Desktop 4.20.0 ,然后发现了一个 bug #13524,然后降级一个版本之后又发现了另一个 bug #13477。决定寻找替代品,尝试了 Podman Desktop 之后放弃了,最终决定直接使用 wsl2。记录一下迁移以及踩坑过程。 WSL 遇到的无法解决的问题 microsoft/WSL#5118 导致无法使用 pnpm,只能使用 yarn、npm 替代。 修改源 使用中科大的软件源 https://mirrors.ustc.edu.cn/ # 备份源文件 $ sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup # 切换 root 用户 $ sudo su # 写入中科大的源 $ echo "deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse deb https://mirrors....

2023-06-02 · 3 分钟

多个docker-compose项目之间通信与环境架构

在讲多个 docker-compose 项目之间通信之前,想要先说一说我从刚使用 Docker 到目前为止遇到的一些问题与想法。 在刚学习 Docker 的时候,我相信很多人都跟我一样有过这种想法:我们的代码运行环境、MySQL、Redis 等服务是放到一个容器里面呢,还是放到多个容器里面呢?经过一番学习知道,Docker 官方是推荐将这些环境放置到多个容器中的,至于为什么就不详细说了,可以自行百度学习一下。 容器通信 但是当放到多个容器中,又会出现一个问题,我的 API 服务该怎么访问 MySQL、Redis 呢?有三种办法可以解决。 通过容器内 ip + 映射出的端口进行访问(不推荐) 通过 --link 链接另一个容器访问(不推荐) --link 只能在 docker run 一个容器时链接另一个已运行的容器,所以说该方法只能单向访问。 通过 network 将两个容器链接到同一个 network 中可以进行双向访问 docker-compose 这么看来第三种方式是最好的解决方案,但是当我们容器越来越多时,需要记住所有容器的 run 指令,将一个个的容器 run 起来,然后链接到同一个 network 中去,操作起来非常的麻烦。所以我更推荐使用 docker-compose 来编排管理多个容器。下面来编写一个 docker-compose.yml 文件演示一下。 编写接口 因为我们只是来演示一下容器之间的通信,使用 MySQL、Nginx 等容器反而更加的麻烦,所以我们使用 Golang 简单写一个接口用来构建一个演示的镜像。 package main import ( "flag" "github.com/gin-gonic/gin" ) func main() { name := flag.String("name", "", "") flag.Parse() r := gin.Default() r....

2022-06-25 · 2 分钟

Docker中使用MySQL踩坑

需要使用到 MySQL ,打算使用 Docker 来部署,compose 来管理。原以为很简单,没想到还是有些坑的。 version: "3.7" services: mysql: image: mysql:8.0-oracle container_name: mysql ports: - "3306:3306" restart: always environment: # 密码 MYSQL_ROOT_PASSWORD: "root" # 创建默认数据库名 MYSQL_DATABASE: "test" 上面的写法就可以启动一个 MySQL 服务了,很简单。但是如果重新构建的话,数据就会丢失了,解决办法也很简单,挂载一下数据目录。 version: "3.7" services: mysql: image: mysql:8.0-oracle container_name: mysql ports: - "3306:3306" volumes: - ./data/mysql:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: "root" MYSQL_DATABASE: "test" 很好,MySQL 的数据已经挂载出来了,但是当重启 MySQL 容器的时候发现重启不了了,报错如下。 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1.el8 started. chown: cannot dereference '/var/lib/mysql/mysql.sock': No such file or directory 根据报错信息是找不到挂载目录下的文件,猜测是权限原因引起的,加个权限试一试。...

2022-04-08 · 2 分钟

alpine镜像设置时区

FROM alpine ENV TZ=Asia/Shanghai RUN echo 'http://mirrors.aliyun.com/alpine/v3.4/main/' > /etc/apk/repositories \ && apk --no-cache add tzdata zeromq \ && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo '$TZ' > /etc/timezone

2022-03-29 · 1 分钟

Dockerfile编写注意事项与技巧

1、多条指令应换行 ... RUN apt-get clean apt-get update ... 多条指令写在一行会当做一条指令执行,有可能后面的指令不执行或者报错。 应改为: ... RUN apt-get clean \ && apt-get update ... 2、忽略错误继续运行 我们在使用apt-get安装一个包时,常常会因为缺少依赖而安装失败,我们可以使用apt-get install -y -f --fix-missing命令来安装上一次安装失败所需要的依赖包,可以很方便的管理所以依赖,而不用我们手动按照依赖顺序把所有依赖包安装一遍,但是必须在安装失败后执行。Dockerfile 在构建过程中如果出现报错会立即退出构建,我们可以使用逻辑或||来忽略错误继续执行后面的语句。 ... # 下载Chrome安装包 RUN wget -P /tmp https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ # 安装Chrome失败 && dpkg -i /tmp/google-chrome-stable_current_amd64.deb \ # 安装Chrome的依赖 && apt-get install -y -f --fix-missing \ # 再次安装Chrome && dpkg -i /tmp/google-chrome-stable_current_amd64.deb ... 上面的写法在 Chrome 安装失败时构建会退出,改为下面的写法就可以成功构建了。 ... # 下载Chrome安装包 RUN wget -P /tmp https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ # 安装Chrome失败之后安装Chrome的依赖 && dpkg -i /tmp/google-chrome-stable_current_amd64....

2022-01-26 · 1 分钟

使用docker-compose构建PHP8.0 + Swoole + Redis + MongoDB环境

最近公司考虑使用 PHP8 + swoole 进行项目的重构,所以要搭建一个环境进行开发学习。swoole 只能运行在 Linux 系统下,考虑到统一团队的开发环境,避免别的小伙伴在环境问题上浪费太多时间,所以选择使用 docker 来构建一个开发环境。 首先创建我们的工作目录Docker,然后在DockerHub上查找 PHP8.0 最新版本的镜像目前为PHP8.0.12,在Docker目录下创建php目录,因为以后可能会使用别的版本的 PHP,所以在php目录下在创建一个php8.0.12的目录,并在目录中创建Dockerfile文件。 目录结构为 Docker ├─ php │ ├─ php8.0.12 │ │ └─ Dockerfile │ ├─ ... 构建自己的 PHP 镜像 Dockerfile # 因为要使用swoole直接使用cli版本 FROM php:8.0.12-cli # 更新依赖 RUN apt-get update \ && apt-get install -y \ unixodbc-dev \ zlib1g-dev \ libzip-dev # 创建`/usr/src/php/ext`目录 RUN docker-php-source extract # 下载redis扩展 # printf "" | 是为了跳过扩展安装过程中弹出让我们选择的yes no RUN printf "" | pecl install redis-5....

2021-11-24 · 3 分钟

PHP镜像中自带的几个特殊的命令

docker-php-source docker-php-ext-install docker-php-ext-enable docker-php-ext-configure docker-php-source 此命令,实际上就是在 PHP 容器中创建一个/usr/src/php 的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的 PHP 扩展源码的存放目录即可。事实上,所有 PHP 扩展源码扩展存放的路径都在 /usr/src/php/ext 里面。 格式: docker-php-source extract # 创建并初始化 `/usr/src/php`目录 docker-php-source delete # 删除 `/usr/src/php`目录 docker-php-ext-enable 这个命令,就是用来启动 PHP 扩展 的。 格式: docker-php-ext-enable redis # 开启Redis扩展 前提是已经下载安装过 docker-php-ext-install 这个命令,是用来安装并启动PHP 扩展的。 格式: docker-php-ext-install 源码包目录名 注意点: 源码包需要放在 /usr/src/php/ext 下 默认情况下,PHP 容器没有 /usr/src/php这个目录,需要使用 docker-php-source extract来生成。 docker-php-ext-install 安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展。 卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。 docker-php-ext-configure docker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。 用法: docker-php-ext-configure ext-name [configure flags]

2021-11-24 · 1 分钟