Docker小白也能懂,手把手教你构建开发环境
nanshan 2024-11-07 11:25 11 浏览 0 评论
作者:josiahchen,腾讯TEG鲁班工作室前端工程师
前言
大多数人可能都遇到过这样一个问题,在本地开发好功能后,部署到服务器,或者其他人拉到本地接着开发时,会出现功能用不了的情况。
大多数时候是由于系统不同,依赖出现差异而导致的。因此,为了解决这个问题,基于 Docker 构建统一开发环境的需求便产生了。
使用 Docker 的好处
- 部署方便:平常要搭建环境常常需要耗费几个小时,而且,对于团队协作时来说,每有新人进来,都需要浪费这可以避免的时间,而且搭建环境时,也常常会产生的各种问题,导致项目代码运行异常。如果使用了 Docker 的话,只需最开始的人写好开发容器,其他人只需要 pull 下来,即可完成项目环境的搭建,能有效避免无意义的时间浪费。
- 隔离性:我们时常会在一台电脑部署多个项目环境,若是直接安装的话,彼此间有可能会造成干扰,比如一个项目需要 Node.js 14,有的又需要 Node.js 12,若是直接在本机部署的话,总是不能共存的,而是用 Docker 的话,则可以避免该问题。Docker 还能确保每个应用程序只使用分配给它的资源(包括 CPU、内存和磁盘空间)。一个特殊的软件将不会使用你全部的可用资源,要不然这将导致性能降低,甚至让其他应用程序完全停止工作。
实现
安装 Docker
Linux
我是用的是 Arch Linux,所以以下安装方法是以 Arch Linux 为基础,其他发行版也大同小异,只是换成其包管理工具而已。
# 设置国内镜像站,国内提速用的,可选操作
$ 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
Windows 10
Windows 10 下安装 docker 比较简单,有如下几种方式:
手动下载安装
点击以下 链接 下载 Docker Desktop for Windows。
下载好之后双击 Docker Desktop Installer.exe 开始安装。
使用winget安装
$ winget install Docker.DockerDesktop
运行
在 Windows 搜索栏输入 Docker 点击 Docker Desktop 开始运行。
Docker 启动之后会在 Windows 任务栏出现鲸鱼图标。
等待片刻,当鲸鱼图标静止时,说明 Docker 启动成功,之后你可以打开 PowerShell/CMD/Windows Terminal 使用 Docker。
macOS
使用 Homebrew 安装
Homebrew 的 Cask 已经支持 Docker Desktop for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:
$ brew install --cask docker
手动下载安装
如果需要手动下载,请点击以下 链接 下载 Docker Desktop for Mac。
请注意下载对应芯片类型的软件,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 都是使用的 Docker Desktop,所以直接在 GUI 中配置即可。
打开 Docker 界面,点击 Docker Engine
在右边输出框中,输入镜像源:
{
"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。
包含环境:
- node.js 14.17
- npm 6.14
- yarn 1.22
# 前端开发中,时常需要使用 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 后,即可愉快的开始开发了!
# 进入 docker-compose.yml 所在目录
$ cd frontend
# 后台启动 docker-compose.yml 中所有容器,若容器没有构建则会先构建
$ docker compose up -d
# 进入 react 容器中,以便命令行交互
$ docker compose exec --user=me react /bin/zsh
为了测试容器间是否能相互访问,可以使用编写如下文件,数据库需自行创建:
// 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 的话,也可以直接开启一个容器,然后进入容器配置完后,使用 docker save/export 导出即可。
相关推荐
- 今晚拿下PHP反序列化的一系列操作
-
引言在CTF中反序列化类型的题目还是比较常见的,之前有学习过简单的反序列化,以及简单pop链的构造。这次学习内容为php内置的原生类的反序列化以及一点进阶知识。在题目给的的代码中找不到可利用的类时,这...
- Win10安装Apache和PHP(apache安装php模块)
-
说明:虽然PHPStudy之类的软件给我们提供了方便的集成环境,但是其使用的是非线程安全的PHP版本(NotThreadSafe,NTS),某些功能不可以使用。所以,我们还需要自己再安装一个Apa...
- 腾讯云云函数部署laravel项目(腾讯云函数 selenium)
-
1、购买函数套餐包在Serverless控制台,选择函数套餐包进行购买2、新建函数服务2.1、模板创建选择函数URL:新建函数URL,启用公网访问:2.1.1、postman访问首页2.1.2、pos...
- 站长教你搭建属于自己的网站(站长教你搭建属于自己的网站是什么)
-
每个人都希望可以有自己的网站,因为那样高端大气上档次,低调奢华有内涵,尤其是公司用户,一般会有自己的网站。而个人呢,也可以搭建自己的网站博客,论坛等,但是一般个人都是搭建博客的。好了,那么下面站长教你...
- 微信公众号开发出现 cURL error 60: SSL certificate problem ssl证书
-
在phpstudy的环境下如果出现这样的报错cURLerror60:SSLcertificateproblem:unabletogetlocalissuercertificat...
- 【网络安全】关于PHP Study nginx解析高危漏洞的预警通报
-
网络安全近日,山石网科安全研究院监测发现PHPStudyWindows最新版本存在nginx解析漏洞,可以造成任意代码执行。一、漏洞情况phpStudy是一个PHP调试环境的程序集成包,该程序包集成...
- PHP 环境 搭建教程(php环境搭建教程linux)
-
PHP是一种编程语言,很多网站都用PHP语言编写,我们有时候需要测试一个网站,就需要PHP环境才能运行,又要安装Apache、又要安装MySQL……真的非常麻烦。其实我们可以使用PHP集成...
- 黑客搭建钓鱼平台,手把手教你如何钓鱼?
-
跨站脚本攻击XSS:通过HTML注入篡改了网页,插入了恶意的脚本,从而用户浏览网页时,控制用户浏览器的一种攻击那么,我们搭建一个XSS钓鱼平台吧,注意:这个平台仅用于学习和测试,小伙伴们不要动有坏心思...
- php源码网站搭建方法和过程(php网站源码完整)
-
web网站是我们上网的窗口,而网站是如何搭建的呢?今天我们来做一个介绍,以php代码为例来进行介绍(后续会介绍一下java代码搭建,如果想要我这里涉及的工具或源码请私信我)。1、首先你需要去网上下载你...
- 使用VS Code调试PhpStudy环境里的代码
-
最近几个月把所有项目都迁过来VSCode了(除了因为Unity调试问题反而用回了VisualStudio),PHP也就抛弃了最强的PhpStorm。这段时间抽空在帮朋友处理PHP项目,然...
- phpstudy搭建PHP+Mysql服务(用phpstudy搭建服务器)
-
PHP是一种创建动态交互性站点的强有力的服务器端脚本语言。PHP是免费的,并且使用非常广泛。同时,对于像微软ASP这样的竞争者来说,PHP无疑是另一种高效率的选项。(1)PHP环境搭建使用V...
- Windows安装phpstudy(Windows安装mysql)
-
说明:phpstudy是一个PHP+MySQL+Apache的集成环境,可以减少单独部署各个所需软件的麻烦,以及更加方便地切换版本。phpenv、wamp等软件的作用一样。由于环境的不同,安装过程中可...
- phpstudy安装及简单使用教程(phpstudy安装教程详解)
-
phpstudy前不久爆出有后门,我的看法是,去看下是哪个版本有后门,为啥会有后门,怎么解决掉这个后门,而不是听到后门就弃用了。毕竟phpstudy绿色安装,配置简单,多版本融合,真香。前言:关于开发...
- 如何对dedeCMS的开源程序进行二次开发
-
二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能和效果,一般来说都不会改变原有系统的内核。为了让更多人了解二次开发,并更方便的了解DedeCMS的二次开发,下面将会...
- mysql基础问题三问(底层逻辑;正在执行;日志观察)
-
背景:经常面试会遇到且实际工作中也会应用到的三个场景:目录:一.mysql查询时的底层原理是什么?二.如何查看正在执行的mysql语句?三.如何观察mysql运行过程中的日志信息?-----...
你 发表评论:
欢迎- 一周热门
-
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
【系统配置】信创终端挂载NAS共享全攻略:一步到位!
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WindowsServer2022|配置NTP服务器的命令
-
- 最近发表
-
- 今晚拿下PHP反序列化的一系列操作
- Win10安装Apache和PHP(apache安装php模块)
- 腾讯云云函数部署laravel项目(腾讯云函数 selenium)
- 站长教你搭建属于自己的网站(站长教你搭建属于自己的网站是什么)
- 微信公众号开发出现 cURL error 60: SSL certificate problem ssl证书
- 【网络安全】关于PHP Study nginx解析高危漏洞的预警通报
- PHP 环境 搭建教程(php环境搭建教程linux)
- 黑客搭建钓鱼平台,手把手教你如何钓鱼?
- php源码网站搭建方法和过程(php网站源码完整)
- 使用VS Code调试PhpStudy环境里的代码
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)