前端眼里的docker

docker是什么

可以简单的认为docker容器是一个虚拟机,封装就是把这个虚拟机打包,打包后能在任何系统跑,docker装上即用。也可以形象的比喻成一个集装箱,把所有货物都打包好放到箱子里,不需要再分类运输,集装箱不互相影响

好处

  1. 统一应用环境
  2. 方便迁移
  3. 占用资源少 (如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来)

docker和虚拟机比较

  1. 虚拟机是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程
  2. 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟

图片描述
图片描述
图片描述

Docker架构

图片描述
图片描述

基本概念

镜像

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
镜像镜像只是一个虚拟的概念,且是分层存储的,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

容器

1.镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
2.容器的本质是进程,但是和宿主执行的进程不一样,它有独立的命名空间,因此有自己的root文件系统,网络配置、进程空间
3.容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡,因此任何保存于容器存储层的信息都会随容器删除而丢失。
注: Docker 最佳实践的要求

1.容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。
2.所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高
3.数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡

仓库

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

使用镜像

获取镜像

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker pull ubuntu:16.04
docker run 运行容器的命令

docker run -it --rm \
    ubuntu:16.04 \
    bash
-it:  -i:交互式操作  -t:终端  我们这里打算进入bash执行一些命令并查看返回结果,因此需要交互式终端
--rm:这个参数是说容器退出后随之将其删除
bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。

列出镜像

docker image ls
docker image ls -f dangling=true 虚悬镜像
docker image prune 删除虚悬镜像
docker image ls -a   中间层镜像
docker image ls ubuntu 列出部分镜像
docker image ls -f since=mongo:3.2
docker image ls -f before=mongo:3.2

删除本地镜像

docker image rm [选项] <镜像1> [<镜像2> ...]
docker image rm ID
docker image rm 镜像名
docker image rm 摘要
docker rmi 镜像名

Docker指令

Dockerfile定制镜像

FROM 指定基础镜像
RUN 执行命令
构建镜像 docker build -t nginx:v3 .

COPY 复制文件

  1. COPY <源路径>... <目标路径>
COPY package.json /usr/src/app/
  1. 相对于工作目录的相对路径(工作目录可以用 WORKDIR
  2. 各种元数据都会保留。比如读、写、执行权限、文件变更时间等

ADD

Add 比COPY多了些特性,比如 <源路径> 可以是一个 URL

CMD

  1. shell: CMD <命令>
  2. exec : CMD ["可执行文件", "参数1","参数2"]
CMD echo $HOME
CMD [ "sh", "-c", "echo $HOME" ]

ENV

ENV NODE_VERSION 7.2.0
或者ENV NODE_VERSION=7.2.0
比如使用: RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION

操作容器

启动

$ docker container run \
  -d \
  -p 127.0.0.2:8080:80 \
  --rm \
  --name mynginx \
  nginx

重启

docker container start

终止

docker stop ID

进入容器

docker attach ID  /exit 会导致容器退出
docker exec -it ID  /exit 不会导致容器退出

Docker Compose

安装和卸载

linux安装

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

卸载

$ sudo rm /usr/local/bin/docker-compose

使用

docker-compose up
docker-compose down
docker-compose --version

项目实践

<think>嗯,用户想了解如何在前端项目中实施CI/CD流程,特别是与Docker相关的配置和部署。首先,我需要回忆一下相关的知识,并结合提供的引用内容来组织答案。 首先,用户提到的参考引用中有关于GitLab CI/CD和Docker的配置,比如引用1和引用5提到了使用Docker镜像部署前端项目,引用2是关于Docker的基本命令,引用3是安装Docker的步骤,引用4涉及Docker的配置文件修改。所以需要整合这些信息,分步骤讲解。 用户的需求可能包括从零开始搭建CI/CD流程,包括环境准备、Dockerfile编写、GitLab CI配置、部署步骤以及优化方法。我需要确保每个步骤都涵盖必要的细节,比如如何安装Docker,如何构建镜像,如何处理配置文件等。 可能需要注意的点是,Docker的安装步骤在引用3中提到的是使用apt-get安装docker.io,而通常官方推荐的是使用Docker的官方仓库,但用户提供的引用中可能使用的是Ubuntu系统的默认仓库,所以需要按照引用3的内容来写。此外,引用4中提到了修改Docker的配置文件,特别是目录卷的配置,需要说明如何修改config.toml文件,避免错误。 另外,用户可能需要了解如何将前端项目打包成Docker镜像,并在CI/CD流程中自动构建和部署。这时候需要结合Dockerfile的编写和.gitlab-ci.yml的配置,这部分在引用1和引用5中有提到。 还要考虑测试阶段的集成,比如单元测试和镜像安全扫描,这些能提高流程的可靠性。引用中虽然没有直接提到测试,但作为CI/CD的一部分,应该包含进去。 最后,用户可能关心常见问题,比如如何优化镜像大小,如何处理多阶段构建,这些在Docker的最佳实践中常见。需要结合引用中的信息,比如使用多阶段构建来减少镜像体积,这在Dockerfile的编写部分可以提到。 现在需要把这些内容结构化,分步骤讲解,并确保每个步骤引用正确的来源。同时,生成相关问题,帮助用户深入理解可能遇到的后续问题。</think>以下是前端项目基于Docker的CI/CD实施教程,整合GitLab CI/CD与Docker的配置步骤: ### 一、环境准备 1. **安装Docker** 在部署服务器执行: ```bash sudo apt-get update sudo apt-get install -y docker.io # 通过apt安装docker社区版[^3] ``` 2. **配置Docker权限** 将当前用户加入docker组: ```bash sudo usermod -aG docker $USER && newgrp docker ``` ### 二、创建Docker镜像 1. **编写Dockerfile** 在项目根目录创建文件,示例: ```dockerfile # 构建阶段 FROM node:16-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 生产阶段 FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` 此多阶段构建可减小最终镜像体积[^1] 2. **配置.gitlab-ci.yml** 在项目根目录创建CI配置文件: ```yaml stages: - build - test - deploy variables: IMAGE_NAME: ${CI_PROJECT_NAME}:${CI_COMMIT_SHORT_SHA} build_image: stage: build script: - docker build -t $IMAGE_NAME . artifacts: paths: - dist/ unit_test: stage: test image: node:16 script: - npm install - npm run test deploy_prod: stage: deploy script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker push $IMAGE_NAME - ssh user@server "docker pull $IMAGE_NAME && docker-compose up -d" only: - main ``` ### 三、关键配置说明 1. **Runner配置** 修改GitLab Runner配置文件`config.toml`,添加卷映射: ```toml [[runners]] volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"] shm_size = "0" # 防止容器内存不足[^4] ``` 2. **安全凭证配置** 在GitLab项目设置中添加环境变量: - `CI_REGISTRY_USER`: Docker仓库用户名 - `CI_REGISTRY_PASSWORD`: Docker仓库密码 ### 四、部署优化技巧 1. **镜像缓存策略** 在Dockerfile中添加缓存目录: ```dockerfile RUN --mount=type=cache,target=/app/node_modules npm ci ``` 2. **健康检查配置** 在Dockerfile中增加健康监测: ```dockerfile HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/ || exit 1 ``` ### 五、常见问题排查 - **权限问题**:确保GitLab Runner用户有docker执行权限,可通过`groups`命令验证用户组 - **构建失败**:检查`.gitlab-ci.yml`缩进格式,必须使用空格而非Tab - **镜像推送失败**:确认CI变量中仓库地址格式正确(如`registry.example.com/group/project`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值