作者:josiahchen,腾讯TEG鲁班工作室后端工程师
序言
大多数人可能都碰到过这样一个问题,在本地开发好功能后,布署到服务器,或则其他人拉到本地接着开发时,会出现功能用不了的情况。
大多数时侯是因为系统不同,依赖出现差别而引致的。为此,为了解决这个问题,基于Docker建立统一开发环境的需求便形成了。
使用Docker的益处实现安装DockerLinux
我是用的是ArchLinuxlinux系统怎么样,所以以下安装方式是以ArchLinux为基础,其他发行版也长治小异,只是换成其包管理工具而已。
# 设置国内镜像站,国内提速用的,可选操作
$ sudo pacman-mirrors -i -c China -m rank
# 使用 Pacman 安装 Docker
$ sudo pacman -S docker
# 建立 docker 用户组。默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
$ sudo groupadd docker
# 将当前用户加入 docker 组,退出当前终端并重新登录后生效
$ sudo usermod -aG docker $USER
# 测试是否安装成功
$ docker run --rm hello-world
Windows10
Windows10下安装docker比较简单,有如下几种形式:
自动下载安装
点击以下链接下载DockerDesktopforWindows。
下载好以后双击DockerDesktopInstaller.exe开始安装。
使用winget安装
$ winget install Docker.DockerDesktop
运行
在Windows搜索栏输入Docker点击DockerDesktop开始运行。
Docker启动以后会在Windows任务栏出现海豚图标。
等待片刻,当海豚图标静止时,说明Docker启动成功,然后你可以打开PowerShell/CMD/WindowsTerminal使用Docker。
macOS使用Homebrew安装
Homebrew的Cask早已支持DockerDesktopforMac,因而可以很便捷的使用HomebrewCask来进行安装:
$ brew install --cask docker
自动下载安装
假如须要自动下载,请点击以下链接下载DockerDesktopforMac。
请注意下载对应芯片类型的软件,M1和Intel芯片所对应的版本不通用。
就像macOS其它软件一样,安装也十分简单,双击下载的.dmg文件,之后将那只叫Moby的海豚图标拖放到Application文件夹即可(其间须要输入用户密码)。
运行
从应用中找到Docker图标并点击运行。
运行以后,会在右上角菜单栏见到多了一个海豚图标,这个图标表明了Docker的运行状态。
每次点击海豚图标会弹出操作菜单。
以后,你可以在终端通过命令检测安装后的Docker版本。
$ docker --version
Docker换源
docker默认的源是美国的,国外访问的话速率比较慢,因而可以换为国外源,提升镜像拉去速率。
Linux
Linux下的比较简单,创建个deamon.json文件写下配置就好:
$ vi /etc/docker/deamon.json
# 输入镜像源
{
# 只换一个源也是可以的,可以直接用字符串,而不是数组。
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
}
# :wq 保存退出后重启 docker
$ systemctl restart docker
Windows和Mac
Windows和Mac都是使用的DockerDesktop,所以直接在GUI中配置即可。
打开Docker界面,点击DockerEngine
在左侧输出框中,输入镜像源:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
}
输入后结果如下:
检验
在更新完镜像源且重启了docker以后,即可运行一下命令查看是否生效:
$ docker info
# Registry Mirrors:
# https://registry.docker-cn.com/
# http://hub-mirror.c.163.com/
# https://docker.mirrors.ustc.edu.cn/
编撰Dockerfile
安装完Docker以后,接出来我们便可以来编撰我们自己的项目开发环境了。本文将以后端开发环境为例,建立Dockerfile。
包含环境:
# 前端开发中,时常需要使用 shell 命令,而有一个较为完整的环境比较重要,因此选择了使用 ubuntu 作为基础,若在意容器大小的话,可自行选择适用的基础镜像
FROM ubuntu
LABEL org.opencontainers.image.authors="moecasts.caster@gmail.com"
# 设置环境变量
ENV DEBIAN_FRONTEND noninteractive
# 设置时区
ARG TZ=Asia/Shanghai
ENV TZ ${TZ}
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 用 root 用户操作
USER root
# 更换阿里云源,在国内可以加快速度
RUN sed -i "s/security.ubuntu.com/mirrors.aliyun.com/" /etc/apt/sources.list &&
sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/" /etc/apt/sources.list &&
sed -i "s/security-cdn.ubuntu.com/mirrors.aliyun.com/" /etc/apt/sources.list
RUN apt-get clean
# 更新源,安装相应工具
RUN apt-get update && apt-get install -y
zsh
vim
wget
curl
python
git-core
# 安装 zsh,以后进入容器中时,更加方便地使用 shell
RUN git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh &&
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc &&
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions &&
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting &&
sed -i 's/^plugins=(/plugins=(zsh-autosuggestions zsh-syntax-highlighting z /' ~/.zshrc &&
chsh -s /bin/zsh
# 创建 me 用户
RUN useradd --create-home --no-log-init --shell /bin/zsh -G sudo me &&
adduser me sudo &&
echo 'me:password' | chpasswd
# 为 me 安装 omz
USER me
RUN git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh &&
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc &&
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions &&
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting &&
sed -i 's/^plugins=(/plugins=(zsh-autosuggestions zsh-syntax-highlighting z /' ~/.zshrc
# 安装 nvm 和 node
ENV NVM_DIR=/home/me/.nvm
NODE_VERSION=v14
RUN mkdir -p $NVM_DIR &&
curl -o- https://gitee.com/mirrors/nvm/raw/master/install.sh | bash &&
. $NVM_DIR/nvm.sh &&
nvm install ${NODE_VERSION} &&
nvm use ${NODE_VERSION} &&
nvm alias ${NODE_VERSION} &&
ln -s `npm bin --global` /home/me/.node-bin &&
npm install --global nrm &&
nrm use taobao &&
echo '' >> ~/.zshrc &&
echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc &&
echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.zshrc
# 安装 yarn
RUN curl -o- -L https://yarnpkg.com/install.sh | bash;
echo '' >> ~/.zshrc &&
echo 'export PATH="$HOME/.yarn/bin:$PATH"' >> ~/.zshrc
# Add NVM binaries to root's .bashrc
USER root
RUN echo '' >> ~/.zshrc &&
echo 'export NVM_DIR="/home/me/.nvm"' >> ~/.zshrc &&
echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.zshrc &&
echo '' >> ~/.zshrc &&
echo 'export YARN_DIR="/home/me/.yarn"' >> ~/.zshrc &&
echo 'export PATH="$YARN_DIR/bin:$PATH"' >> ~/.zshrc
# Add PATH for node & YARN
ENV PATH $PATH:/home/me/.node-bin:/home/me/.yarn/bin
# 删除 apt/lists,可以减少最终镜像大小,详情见:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#general-guidelines-and-recommendations
RUN rm -rf /var/lib/apt/lists/*
WORKDIR /var/www
编撰完Dockerfile后,建立即可:
docker build -t frontend/react:v1 .
建立完以后可以直接运行:
# 以 me 身份运行,推荐方式
docker run --user=me -it frontend/react:v1 /bin/zsh
# 以 root 角色运行
docker run -it frontend/react:v1 /bin/zsh
编撰docker-compose.yml
在开发时,我们寻常须要多个容器配合使用,例如须要配合mysql或其他容器使用时,使用docker-compose.yml可以更好的组织她们。
version: '2'
services:
react:
build:
context: .
dockerfile: react/Dockerfile
tty: true
ports:
- 30000:3000
volumes:
- ./react/www:/var/www
networks:
- frontend
mysql:
image: mysql:5.7
ports:
- 33060:3306
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=password
networks:
- frontend
# 将容器置于同一 networks 即可直接通过容器名访问
networks:
frontend:
driver: bridge
启动容器
编撰完上述Dockerfile和docker-compose.yml后手把手教你构建自己的linux系统,即可愉快的开始开发了!
# 进入 docker-compose.yml 所在目录
$ cd frontend
# 后台启动 docker-compose.yml 中所有容器,若容器没有构建则会先构建
$ docker compose up -d
# 进入 react 容器中,以便命令行交互
$ docker compose exec --user=me react /bin/zsh
为了测试容器间是否能互相访问,可以使用编撰如下文件suse linux 下载,数据库需自行创建:
// index.js
const mysql = require('mysql')
const connection = mysql.createConnection({
host: 'mysql',
user: 'root',
password: 'password',
database: 'test',
})
connection.connect();
connection.query(`SELECT * FROM users`, function (error, results, fields) {
if (error) throw error;
console.log(results)
})
connection.end();
然后运行,即可看见结果:
$ node index.js
[ RowDataPacket { id: 1, name: 'Caster' } ]
总结
使用Docker来搭建开发环境非常便捷,一次搭建,即可在许多机器上多次使用,即便是要重装系统,也毋须在重复配置。
如不喜欢写Dockerfile的话,也可以直接开启一个容器,之后步入容器配置完后手把手教你构建自己的linux系统,使用dockersave/export导入即可。