Hero Image
WINDOWS上的DOCKER DESKTOP

在本系列的Docker入门中,我们介绍了容器的基本概念,以及如何在Ubuntu(Linux)上安装Docker引擎来进行容器化引用的开发。 本篇我们介绍如何在Windows系统上安装和使用Docker,这里主要介绍在Windows 10上安装和使用Docker Desktop,对于Windows 10以下的版本,可以使用Docker Toolbox,这里就不做介绍了. 安装Docker Desktop Docker Desktop - The fastest way to containerize applications on your desktop, 这是Docker官方的定义,Docker Desktop为Windows和Mac提供了一个桌面化的容器开发环境,在Windows 10上,Docker Desktop使用了Windows的Hyper-V虚拟化技术,因此你需要一台打开了硬件虚化化的电脑并且安装的是Windows 10专业版以上的系统,还需要打开Hyper-V功能,如何在Windows 10上打开Hyper-V,参考这里. 补充 : Docker Desktop支持Windows 10 64位: 专业版,企业版,教育版 (Build 15063 或以上). 首先在满足条件的Windows系统上下载Docker Desktop的安装包 - https://hub.docker.com/editions/community/docker-ce-desktop-windows .安装过程是简单的,直接双击下载的安装,更具提示安装就好了,一开始我们选择使用Linux容器(之后可以其他换到使用Windows容器的方式,会单独写一篇来介绍使用Windows容器).安装过程中安装程序会检查系统是否满足,如果不满足,安装程序会报错并结束安装. 安装完成之后,打开 开始 菜单,然后选择 Docker Desktop 启动. 查看状态栏上的Docker图标,一开始会显示 starting 装,等到显示Docker Desktop is running,就可以通过终端(例如 PowerSheel)来使用Docker的相关命令了,下面我们将使用Windows 10的PowerShell作为终端来进行操作. 构建和运行容器 我们将使用一个简单Node应用来示例如何在Windows上构建容器镜像和启动一个容器.首先我们需要将代码库下载到我们的环境中,这里可以使用Git来克隆代码库或者直接下载代码包. 在Windows上,可以使用Git for Windows,也可以使用Windows 10的WSL安装一个Ubuntu子系统,然后在Ubuntu子系统终端里安装Git,并直接使用Git克隆代码,这里我使用的是在Ubuntu子系统终端里克隆代码库到本地目录. 如上图所示,我们把代码克隆到了D:\gitrepos\hellonode\目录,然后切换到PowerShell终端,进入该目录. 用你喜欢的文本编辑器打开hellonode\Dockerfile(推荐时候用VS Code,内容如下 FROM node:12.2-alpine MAINTAINER Mengz You <mengz.you@outlook.com> WORKDIR /app COPY package*.

Hero Image
GITHUB ACTIONS工作流

这篇文章以一个简单的Nodejs应用为例,示例如何使用Github Actions来自动构建,测试和部署一个应用. 什么是Github Actions 首先简单介绍下什么是Github Actions? Github Actions是Github官方提供的一个与Github集成在一起的CI/CD工具,使用Github Actions可以非常容易地自动化你的所有软件工作流程,包括持续集成(CI)和持续发布(CD). 不过要使用Github Actions,你需要将你的项目代码库放在Github上,然后为代码库配置相应的工作流(Workflows). Actions Runner 使用Github Actions来执行工作流任务,还需要一个可执行的环境,Actions Runner就是提供这样的环境,Github Actions支持两种类型的Runner: Github-Hosted Runner : 由Github官方提供和维护的Runner服务器,不需要用户自己维护和更新,有支持Linnux,Windows,macOS环境的构建 Self-Hosted Runner : 用户自己使用本地机器,云服务器安装Actions应用,用户可以自定义硬件,软件等需求 Actions 在Github Actions中有一个Action的概念,Actions是一个独立的任务,你可以组合这些任务成为要完成一个工作的步骤. 在工作步骤中,你可以自己写执行命令组成Action,也可以直接使用Github社区提供的针对一个写公共任务的Actions,可以到Github市场查找社区或者其他开发人员编写的Actions. 例如一个最常用的Action - checkout,可用来检出代码库: - uses: actions/checkout@v2 除了以上概念之外,Github Actions还有其他概念需要了解,具体可参考 (https://help.github.com/en/actions/getting-started-with-github-actions/overview) Nodejs应用示例 接下来,我们就那个简单的nodejs应用来看看如何使用Github Actions创建CI/CD的流程. 首先,你的项目代码库需要放在Github上,例如 https://github/mengzyou/hellonode/ ,访问你的代码库主页,然后点击 Actions 进入Actions页面. 根据你的代码库的语言类型,Github推荐了一些Workflow的模板,这里我们将使用Nodejs的模板 直接点击 Set up this workflow 来应用这个模板,然后Github会直接打来Web编辑器来编辑这个模板文件 你可以直接使用该文件,也可以修改,添加需要的Actions,完成之后可以点击 Start commit 按钮来提交Workflow文件,Github会自动为代码库创建目录 .github/workflows/,以及把该文件放在该目录下,例如 .github/workflows/nodejs.yml . 提交之后,Github Actions就会根据Workflow的内容开始运行相应的工作. 创建一个执行测试CI工作流 其实我们也可以直接编辑本地代码库,添加目录 .github/workflows/`,以及创建相应的Workflows配置文件,例如我们创建一个 .github/workflows/nodejs.yml` name: Node.js CI on: push: branches: - master jobs: build: runs-on: ubuntu-latest container: node:12.

Hero Image
DOCKER运行微信桌面客户端

今天借助Github用户huan的盒装微信项目,在我的openSUSE Leap系统上使用Docker成功地运行封装的Windows上的微信客户端。 安装Docker 在Linux系统上安装Docker引擎是很容器的,请参考Docker入门,如果你也使用的是openSUSE Leap,执行如下命令安装Docker引擎: $ sudo zypper ref $ sudo zypper in docker 启动微信客户端 注意: 在启动之前,需要设置主机系统的X服务的访问控制,使用如下的命令禁用主机上X服务的访问控制,允许所有客户端链接服务: $ xhost + 关于[xhost]的更多信息,可参考(https://www.computerhope.com/unix/xhost.htm)。 huan/docker-wechat提供了一个启动脚本dochat.sh来执行容器镜像的下载,以及启动,可直接执行如下操作: $ curl -sL https://raw.githubusercontent.com/huan/docker-wechat/master/dochat.sh | bash 当然也可以克隆Git代码库,然后执行dochat.sh脚本。 成功启动后如下图所示,使用手机扫描登录。 使用Docker Compose启动 dochat.sh是直接使用了docker run命令启动容器,也可以编写一个compose文件来使用docker-compose管理应用容器。例如我在目录 ~/dockerapp/ 下创建了一个 dochat.yml 文件。 version: '2.4' services: dochat: image: zixia/wechat container_name: dockerapps_dochat network_mode: bridge devices: - "/dev/video0:/dev/video0" - "/dev/snd:/dev/snd" volumes: - "/etc/localtime:/etc/localtime:ro" - "$HOME/.dochat/appdata:/home/user/.wine/drive_c/user/Application Data/" - "$HOME/.dochat/wechatfiles:/home/user/WeChat Files/" - "/tmp/.X11-unix:/tmp/.X11-unix" environment: - "DISPLAY=unix$DISPLAY" - "XMODIFIERS=@im=fcitx" - "GTK_IM_MODULE=fcitx" - "QT_IM_MODULE=fcitx" - "AUDIO_GID=492" - "VIDEO_GID=484" - "GID=100" - "UID=1000" - "DOCHAT_DEBUG=true" ipc: host privileged: true 首次启动时使用命令docker-compose -f ~/dockerapp/dochat.

Hero Image
DOCKER构建容器化应用

这是Docker快速开始系列的第二篇,在对我们的应用进行容器化之前,请先阅读第一篇安装好Docker环境。 介绍 我们在开发主机(开发环境)上安装好Docker之后,我们就可以开始发开容器化应用,通常按照以下步骤: 为应用的每个组件创建Docker镜像,然后通过镜像运行容器并测试. 编写 docker stack 文件或者Kubernetes的 YMAL 文件,将容器和支持的基础设施集装到一个完整应用程序. 测试,分享和部署你的整个容器化的应用程序. 在这个快速的教程里,我们将专注在第一个步骤:创建容器将基于的镜像. 准备Dockerfile 我们将使用Docker的一个培训项目示例docker-training/node-bulletin-board,按照如下步骤 从Github克隆示例代码(首先你需要在环境中安装好Git) $ git clone -b v1 https://github.com/docker-training/node-bulletin-board $ cd node-bulletin-board/bulletin-board-app/ 这是一个简单的公告板应用示例代码,使用node.js编写.现在,我们需要容器化该应用. 在代码目录下,有一个Dockerfile文件,该文件描述了如何为一个容器封装一个私有文件系统,以及包含一些描述如何运行容器的元数据,文件内容如下 FROM node:8.9.4-alpine WORKDIR /usr/src/app COPY package.json . RUN npm install COPY . . CMD [ "npm", "start" ] 为应用编写Dockerfile是容器化应用的第一步,你可以认为Dockerfile里的命令是构建镜像的一步步指令 首先从一个已经存在的基础镜像开始,FROM node:8.9.4-alpine,该基础镜像是一个官方的镜像,在开始构建时,如果本地没有该镜像,将会Docker Hub自动拉取该镜像. 然后通过WORKDIR指令设置工作目录,之后的操作都将基于该工作目录. 通过COPY指令,将当前目录下的package.json文件拷贝到容器的当前目录下(/usr/src/app/),也就是/usr/src/app/package.json. RUN指令是执行相关的命令,示例中在/usr/src/app/目录下执行npm install命令,该命令将根据package.json文件安装应用相关的依赖包. 接着将剩余的代码从主机拷贝到镜像的文件系统中. 最后的CMD命令配置了镜像的元数据,描述使用该镜像运行容器时,如何启动应用程序,这里启动容器时将运行npm start. 以上只是一个简单的Dockerfile示例,更多的指令请参考官方文档. 构建和测试镜像 现在我们拥有了源代码和Dockerfile,我们可以开始构建应用的镜像了. 首先确保当前目录是 node-bulletin-board/bulletin-board-app/ ,通过如下的命令构建镜像 $ docker image build -t bulletinboard:1.0 . 你将看到Docker按照Dockerfile里的指令进行构建,当构建成功后,可通过如下命令查看到构建出来的镜像 $ docker image ls bulletinboard 1.

Hero Image
DOCKER入门

Docker Docker是一个为开发者和运维工程师(系统管理员)以容器的方式构建,分享和运行应用的平台。使用容器进行应用部署的方式,我们成为容器化。 容器化应用具有一下特性,使得容器化日益流行: 灵活: 再复杂的应用都可以进行容器化. 轻量: 容器使用使用和共享主机的内核,在系统资源的利用比虚拟机更加高效. 可移植: 容器可以本地构建,部署到云上,运行在任何地方. 松耦合: 容器是高度自封装的,可以在不影响其他容器的情况下替换和升级容器. 可扩展: 可以在整个数据中心里增加和自动分发容器副本. 安全: 容器约束和隔离应用进程,而无需用户进行任何配置. 镜像和容器 其实,容器就是运行的进程,附带一些封装的特性,使其与主机上和其他容器的进程隔离.每个容器都只访问它自己私有的文件系统,这是容器隔离很重要的一方面.而Docker镜像就提供了这个文件系统,一个镜像包含运行该应用所有需求 - 代码或者二进制文件,运行时,依赖库,以及其他需要的文件系统对象. 通过与虚拟机对比,虚拟机(VM)通过一个虚拟机管理(Hypervisor)运行了完整的操作系统来访问主机资源.通常虚拟机会产生大量的开销,超过了应用本身所需要的开销. 容器编排 容器化过程的可移植性和可重复性意味着我们有机会跨云和数据中心移动和扩展容器化的应用程序,容器有效地保证应用程序可以在任何地方以相同的方式运行,这使我们可以快速有效地利用所有这些环境.当我们扩展我们的应用,我们需要一些工具来帮助自动维护这些应用,在容器的生命周期里,可以自动替换失败的容器,管理滚动升级,以及重新配置. 容器编排器(Orchestrator)就是管理,扩展和维护容器化应用的工具,当前最常见的例子就是 Kubernetes 和 Docke Swarm .Docker Desktop 工具可以在开发环境提供这两个编排工具.当前,Docker Desktop 仅支持在Windows和OSX系统上安装,本文接下来主要介绍如何在Linux上安装Docker,以及运行一个容器. 安装Docker 如果你使用的是Windows或者Mac OS系统,请参考上面的链接安装和使用 Docker Desktop,下面我们将已Ubuntu 18.04系统为例来安装Docker的社区版本(docker-ce). 配置软件源 更新apt包索引 $ sudo apt update 安装需要的软件包 $ sudo apt install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common 添加Docker官方的GPG信息 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 使用如下命令添加Docker的安装源 $ sudo add-apt-repository \ "deb [arch=amd64] https://download.

Hero Image
GITLAB CI自动部署容器应用

容器 Docker 越来越受开发者和运维人员的喜爱,更是作为实践 DevOps 的一个中要工具。同时 Gitlab 提供了免费的代码管理服务,其 gitlab-ci 更是提供了强大的自动化 CI/CD 流程功能。 本文以一个静态站点的示例来说明如何使用 gitlab-ci 和 docker 进行容器镜像的构建,以及如何将镜像自动化部署到目标服务器上。 编写Dockerfile 首先在代码库中增加 Dockerfile ,用于描述如何构建应用的容器镜像。以下是一个基于 Hugo 的静态站点应用的示例: FROM mengzyou/hugo:latest as builder COPY . /app/ RUN hugo FROM nginx:1.16-alpine RUN set -x \ && rm -f /etc/nginx/conf.d/default.conf \ && mkdir -p /usr/share/nginx/html COPY --from=builder /app/nginx-default.conf /etc/nginx/conf.d/default.conf COPY --from=builder /app/public/ /usr/share/nginx/html 其实非常简单,使用了多阶段构建,以 mengzyou/hugo 作为构建镜像,然后将生成的静态文件拷贝到 nginx 镜像中,最终生成静态站点的镜像。 配置Gitlab-ci构建容器镜像 该阶段,在项目根目录添加 .gitlab-ci.yml 文件,示例内容如下: variables: DOCKER_DRIVER: overlay2 CI_REGISTRY_IMAGE: ${CI_REGISTRY}/mengzyou/app before_script: - echo $CI_JOB_NAME - echo $CI_PROJECT_DIR stages: - build build:docker: stage: build variables: DOCKER_HOST: tcp://docker:2375 image: docker:stable services: - docker:dind script: - echo "Building image - $CI_REGISTRY_IMAGE:latest" - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY - docker image build --force-rm --no-cache -t $CI_REGISTRY_IMAGE:latest .