使用容器Docker进行开发


使用容器进行软件开发已成为一种普遍的做法。开发中的常见用例是运行应用程序所需的服务环境,诸如安装Redis,MongoDB甚至Elasticsearch之类的东西。大多数情况下,开发人员依赖于docker-compose定义应用程序所需的整套服务。
下面展示通过使用指定某个语言开发所需的所有内容创建容器图像,包括(但不限于):

  • 代码编辑器
  • 调试器
  • 探查
  • 跟踪工具
  • 包管理员
  • 构建工具 

使用容器进行开发的好处

OS独立
即使使用的是Docker for Mac,您还可以使用基于Linux的环境进行开发。如果你非常熟悉Linux,可以应用于创建真正的生产容器镜像(以及许多其他事情)。

安装速度
与使用安装程序脚本相比,容器镜像(特别是docker映像)在新计算机上的运行速度非常快。这是因为您只需要使用预编译的二进制文件下载镜像。

可移植性
如果使用安装程序脚本,则可能无法在其他计算机上运行,​​因为某些软件包以不同方式安装。比之下,一旦构建了容器镜像,它几乎可以在任何机器上工作。

健壮性
一旦构建了镜像,它就不会突然中断。这与安装程序脚本不同; 当我刚刚使用git存储库来存储配置和脚本时,我会有很多事情发生,它会根据安装程序的运行时间而中断。


注意事项
不是Docker的常见用例
Docker对这种工作流程的支持并不是很好。docker的一些问题需要数年才能 解决

还需要一些胶水代码
您想要从主机映射到容器中有几件事情。我写了一个工具,让这个更容易,称为slipway,在我编写此工具之前,我将使用shell脚本初始化容器。
如果您不使用Linux作为主机操作系统,事情会变得更加复杂。

0.选择基本镜像
对于初学者来说,构建docker镜像需要一个配置文件(Dockerfile)来定义要在容器中执行的步骤。运行所有这些步骤后,容器将“提交”为新镜像。

大多数镜像基于另一个镜像。我建议从Ubuntu基础开始,因为它非常受欢迎。

在一个空目录的文件下添加下面到Dockerfile:

FROM ubuntu:bionic

1.设置您的用户
由于镜像中仅包含root用户。我们需要创建一个具有适当权限的用户才能在容器内运行。

# Feel free to change this to whatever your want
ENV DOCKER_USER developer

# Create user with passwordless sudo. This is only acceptable as it is a
# private development environment not exposed to the outside world. Do 
# NOT do this on your host machine or otherwise.
RUN apt-get update && \
    apt-get install -y sudo && \
    adduser --disabled-password --gecos '' "$DOCKER_USER" && \
    adduser "$DOCKER_USER" sudo && \
    echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \
    touch /home/$DOCKER_USER/.sudo_as_admin_successful && \
    rm -rf /var/lib/apt/lists/*

USER "$DOCKER_USER"

WORKDIR "/home/$DOCKER_USER"

2.基本工具
Ubuntu核心(这是我们的图像所基于的)并不包含太多,因为它是为“准备发布”应用程序而构建的。让我们为开发添加一些基本包:

RUN yes | sudo unminimize && \
    sudo apt-get install -y man-db bash-completion build-essential curl openssh-client && \
    sudo rm -rf /var/lib/apt/lists/*


3.多路复用(可选)
如果您没有使用像VSCode或Webstorm这样的GUI编辑器,那么您可能需要一个程序可以进行单个shell会话并将其拆分为多个。这称为终端多路复用器。我更喜欢tmux

RUN sudo apt-get update && \
    sudo apt-get install -y tmux && \
    sudo rm -rf /var/lib/apt/lists/*


我可以在这里讨论很多自定义选项,但为了保持教程简短,我将跳过这一步。请随意查看我的项目,了解更好的开发环境理念。

4.安装您的选择编辑器
现在我们需要一些东西来编辑源代码。我可以推荐Neovim,也可以其他任何编辑。

RUN sudo apt-get update && \
    sudo apt-get install -y neovim && \
    sudo rm -rf var/lib/apt/lists/*


5.安装运行时
在这个例子中,我们将安装NodeJ,因为站点上的大多数开发人员都使用它。如果您在此步骤中使用Python或其他语言,则可以安装它。

RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
ENV NVM_DIR /home/$DOCKER_USER/.nvm

RUN . "$NVM_DIR/nvm.sh" && \
    nvm install --lts && \
    nvm alias default stable


在此步骤中,为您自己的语言安装任何其他工具。

构建然后运行

您只需要在运行之前构建镜像。
在您的终端中,运行:

docker build -t development-environment .

运行环境的最终命令可能因您要传输的内容而异。这是一个示例命令:

docker run --rm -ti \
    -v $HOME/workspace:/home/developer/workspace \
    development-environment bash