搭建容器化开发环境
本文关注如何在采用 Apple 芯片的 Mac 电脑上,基于 Multipass 搭建容器化开发环境,包括:
- Docker
- K8S 集群
- 镜像仓库
等基础组件。
Multipass¶
安装¶
brew install --cask multipass
multipass version
共享数据¶
安装依赖(可选)¶
multipass shell $VM
sudo snap install multipass-sshfs
挂载目录¶
multipass mount $HOME $VM:/tmp/
multipass info $VM
Docker¶
快速启动¶
# 启动 Docker 虚拟机实例
multipass launch docker
# 主机使用 docke 命令
multipass alias docker:docker
export PATH="$PATH:$HOME/Library/Application Support/multipass/bin"
type docker # docker is '~/Library/Application Support/multipass/bin/docker'
启动配置¶
sudo update-alternatives --config editor
sudo systemctl edit docker.service
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
服务配置¶
sudo vim /etc/docker/daemon.json
配置项参见 https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file。
{
"registry-mirrors": [
"https://hub-mirror.c.163.com"
],
"insecure-registries" : ["192.168.205.59:32000"]
}
命令行工具¶
基础命令¶
docker run -d -p 3306:3306 --name nacos -e MYSQL_ROOT_PASSWORD=root mysql/mysql-server:8.0.30-aarch64
docker exec -it nacos bash
# mysql -u root -p
docker run --name pg -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 postgres:9.6.24
Compose¶
Docker 虚拟机添加了 Docker 镜像源,可以通过 apt
命令直接安装。
multipass shell docker
sudo apt update
sudo apt install docker-compose-plugin
docker compose --help
Build¶
使用 build
命令,需要理解 Docker 构建上下文,最佳实践是创建一个空目录,将 Dockerfile 和用到的所有文件置于该目录下,使用该目录作为 Docker 构建上下文路径。
IMAGE_NAME=$(uuidgen)
docker build -t ttl.sh/${IMAGE_NAME}:1h .
docker push ttl.sh/${IMAGE_NAME}:1h
镜像仓库¶
临时匿名镜像仓库¶
ttl.sh 是一个匿名的临时镜像仓库,免费使用,无需登录,并且已经开源。
MicroK8s 内置镜像仓库¶
microk8s enable registry
# 检查,响应状态码 200
http $(MICROK8S_VM_IP):32000/v2/
镜像加速器¶
{
"registry-mirrors": [
"https://hub-mirror.c.163.com"
]
}
K8S¶
快速安装¶
brew install ubuntu/microk8s/microk8s
microk8s install
microk8s status
访问配置¶
microk8s config view > $HOME/.kube/config
启用插件¶
microk8s enable dashboard dns ha-cluster helm3 ingress metallb metrics-server rbac registry storage
FAQ¶
Docker 拉取镜像失败¶
问题描述:
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout
解决方案:
配置镜像加速器。
推送镜像到 MicroK8s 内置镜像仓库报错¶
问题描述:
Get "https://192.168.205.59:32000/v2/": http: server gave HTTP response to HTTPS client
解决方案:
{
"insecure-registries" : ["192.168.205.59:32000"]
}
HELM 拉取镜像失败¶
问题描述:
register server gave HTTP response to HTTPS client
解决方案:
# /var/snap/microk8s/current/args/containerd-template.toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.205.59:32000"]
endpoint = ["http://192.168.205.59:32000"]
Docker 访问失败¶
问题描述:
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded.
解决方案:
docker pull hub-mirror.c.163.com/multiarch/qemu-user-static
参考¶
- Multipass Documentation
- Install the Compose plugin
- Multipass Docs | How to share data with an instance
- Docker Docs | Docker Registry HTTP API V2
- GitHub | qemu-user-static
- GitHub | Binfmt
最后更新: September 10, 2023