本文将介绍在Azure门户内的UbuntuLinux中构建、部署Docker容器的详细情况,特别是关于azure部署应用的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,
本文将介绍在 Azure 门户内的 Ubuntu Linux 中构建、部署 Docker 容器的详细情况,特别是关于azure 部署应用的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于CentOS7 下 Docker 中构建 Jenkins 容器、Create React App 无法在 docker 中构建、Docker - Aps.NET Core:无法在 Visual Studio 2019 中构建 Docker 映像、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock的知识。
本文目录一览:- 在 Azure 门户内的 Ubuntu Linux 中构建、部署 Docker 容器(azure 部署应用)
- CentOS7 下 Docker 中构建 Jenkins 容器
- Create React App 无法在 docker 中构建
- Docker - Aps.NET Core:无法在 Visual Studio 2019 中构建 Docker 映像
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Azure 门户内的 Ubuntu Linux 中构建、部署 Docker 容器(azure 部署应用)
如何解决在 Azure 门户内的 Ubuntu Linux 中构建、部署 Docker 容器
我正在尝试在 Azure 门户内的 Ubuntu linux 环境中构建、部署 docker 容器。 因此,我转到 Azure 并创建了一个 LINUX VM 并运行 sudo yum 命令并创建了一个示例容器。
但我的目标是在这个容器上部署一个 Web 应用程序,并希望看到应用程序正在运行。
想知道下一步是什么。
CentOS7 下 Docker 中构建 Jenkins 容器
背景
在 CentOS 搭建 Docker 完成后,我们需要在 Docker 中搭建 Jenkins 用来实现工程自动部署。
安装前提
- jdk 已安装,安装目录如:usr/java/jdk1.8.0_161
- maven 已安装,安装目录如:usr/maven/apache-maven-3.5.2
- 设置 Jenkins 挂载目录 (重要!!!)
- 创建一个目录作为 Jenkins 挂载目录,比如,mkdir -p /home/jingguoliang/jenkins
- 设置此目录的归属用户 ID:chown -R 1000:1000 "/home/jingguoliang/jenkins/"
步骤
- 下载相应的 jenkins 镜像文件
- 运行 Docker 服务:systemctl start docker.service
- 搜索下载量大于 10 的相关镜像:docker search -s 10 "jenkins",如下图,我们选择第一个官方 Jenkins Docker 镜像
- 下载镜像:docker pull "docker.io/jenkins",等待下载。
- PS: 在下载过程中不可以断网,如果断网则需要重新下载镜像。具体步骤如下
- 重启 docker:systemctl restart docker.service
- 重新搜索镜像
- 重新下载镜像
- 查看 Docker 镜像,如下图,则成功。
- 创建 Jenkins 容器
- 创造并运行容器:docker run -itd -p 8090:8080 -p 50000:50000 --name jenkins --privileged=true -v /home/jingguoliang/jenkins:/var/jenkins_home -v /usr/java/jdk1.8.0_161:/usr/java/jdk1.8.0_161 -v /usr/maven/apache-maven-3.5.2:/usr/maven/apache-maven-3.5.2 docker.io/jenkins
- -p 8090:8080 -p 50000:50000:进行端口映射,比如 127.0.0.1:8090 就可以访问 Jenkins
- --name jenkins:容器名称
- --privileged=true:在 CentOS7 中的安全模块 selinux 把权限禁掉了,参数给容器加特权,如果不加此参数会有权限问题
- -v /home/jingguoliang/jenkins:/var/jenkins_home -v /usr/java/jdk1.8.0_161:/usr/java/jdk1.8.0_161 -v /usr/maven/apache-maven-3.5.2:/usr/maven/apache-maven-3.5.2:磁盘挂载
- docker.io/jenkins:镜像名称
- 查看正在运行的容器:docker ps,如下图
- 创造并运行容器:docker run -itd -p 8090:8080 -p 50000:50000 --name jenkins --privileged=true -v /home/jingguoliang/jenkins:/var/jenkins_home -v /usr/java/jdk1.8.0_161:/usr/java/jdk1.8.0_161 -v /usr/maven/apache-maven-3.5.2:/usr/maven/apache-maven-3.5.2 docker.io/jenkins
- 访问 Jenkins,如图
- 访问地址
- 本地访问:http://loalhost:8090/
- 局域网访问,ip+8090
- 访问地址
-
- 获取登录密码
- 方式一:在 jenkins 启动的时候,我们设置了文件夹的挂在,所以我们直接可以在本地 jenkins 目录下查看密码:cat /home/jingguoliang/jenkins/secrets/initialAdminPassword,返回的值就是密码
- 方式二:进入容器内部获取密码
- 进入容器:docker exec -it "容器 ID" bash,如图
- 查找文件:cat /var/jenkins_home/secrets/initialAdminPassword,如下图,返回的值就是密码
- 登录即可。
- 获取登录密码
Create React App 无法在 docker 中构建
如何解决Create React App 无法在 docker 中构建
我正在尝试 dockerize 一个 react 应用程序。 它使用 craco 进行构建,因为我使用的是 tailwindcss。 它一直正常工作,直到今天构建开始抛出 CSS 文件错误。
错误
> [admin-build 7/7] RUN npm run build:
#15 1.594
#15 1.594 > admin@0.1.0 build /app
#15 1.594 > craco build
#15 1.594
#15 3.555 craco: *** Cannot find ESLint loader (eslint-loader). ***
#15 3.873 Creating an optimized production build...
#15 89.72 Failed to compile.
#15 89.72
#15 89.72 ./src/styles/index.css
#15 89.72 TypeError: Cannot convert undefined or null to object
#15 89.72 at Function.entries (<anonymous>)
#15 89.72 at Array.forEach (<anonymous>)
#15 89.72
#15 89.72
#15 89.75 npm ERR! code ELIFECYCLE
#15 89.75 npm ERR! errno 1
#15 89.76 npm ERR! admin@0.1.0 build: `craco build`
#15 89.76 npm ERR! Exit status 1
#15 89.76 npm ERR!
#15 89.76 npm ERR! Failed at the admin@0.1.0 build script.
#15 89.76 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
#15 89.76
#15 89.76 npm ERR! A complete log of this run can be found in:
#15 89.76 npm ERR! /root/.npm/_logs/2021-06-26T14_32_59_262Z-debug.log
------
我的 Dockerfile
# base image
FROM node:14-alpine as admin-build
# workdir
RUN mkdir /app
workdir /app
# Install dependencies
copY package.json ./
RUN npm install
# copy source
copY . .
# build source
RUN npm run build
# Nginx for serving
FROM Nginx:alpine
# copy configs
copY Nginx.conf /etc/Nginx/conf.d/default.conf
copY --from=admin-build /app/build /usr/share/Nginx/html
EXPOSE 80
CMD ["Nginx","-g","daemon off;"]
应用程序在 docker 之外正确构建。 有什么办法可以解决这个问题,或者至少看看问题出在哪里?
谢谢
解决方法
只需将 ENV 添加到 Dockerfile,
这个对我来说很好用:
FROM node:13.12.0-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json ./
COPY package-lock.json ./
RUN npm install
COPY . ./
RUN npm run build
# production environment
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
Docker - Aps.NET Core:无法在 Visual Studio 2019 中构建 Docker 映像
如何解决Docker - Aps.NET Core:无法在 Visual Studio 2019 中构建 Docker 映像
我有一个 Asp.NET 核心项目,我想构建到 docker 镜像但没有成功。
我的项目目录:
-我的项目
--Blazor.Server
---Blazor.Server.csproj
---dockerfile
--Blazor.Shared
---Blazor.Shared.csproj
我的 dockerfile:
当我构建此 dockerfile 时,出现以下错误:
所以,请帮助我为我的错误提供建议。
非常感谢
解决方法
docker 引擎在构建过程中没有通过您的路径找到资源。
您应该按如下方式更改您的项目结构:
myproject
├─Blazor.Server
│ └─Blazor.Server.csproj
├─dockerfile
└─Blazor.Shared
└─Blazor.Shared.csproj
Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
在 Docker 容器里面使用 docker run
/docker build
?
Docker 容器技术目前是微服务/持续集成/持续交付领域的第一选择。而在 DevOps 中,我们需要将各种后端/前端的测试/构建环境打包成 Docker 镜像,然后在需要的时候,Jenkins 会使用这些镜像启动容器以执行 Jenkins 任务。
为了方便维护,我们的 CI 系统如 Jenkins,也会使用 Docker 方式部署。 Jenkins 任务中有些任务需要将微服务构建成 Docker 镜像,然后推送到 Harbor 私有仓库中。 或者我们所有的 Jenkins Master 镜像和 Jenkins Slave 镜像本身都不包含任何额外的构建环境,执行任务时都需要启动包含对应环境的镜像来执行任务。
我们的 Jenkins Master、Jenkins Slaves 都是跑在容器里面的,该如何在这些容器里面调用 docker run
命令启动包含 CI 环境的镜像呢? 在这些 CI 镜像里面,我们从源码编译完成后,又如何通过 docker build
将编译结果打包成 Docker 镜像,然后推送到内网仓库呢?
答案下面揭晓。
一、原理说明:/var/run/docker.sock
Docker 采取的是 Client/Server 架构,我们常用的 docker xxx
命令工具,只是 docker 的 client,我们通过该命令行执行命令时,实际上是在通过 client 与 docker engine 通信。
我们通过 apt/yum 安装 docker-ce 时,会自动生成一个 systemd 的 service,所以安装完成后,需要通过 sudo systemctl enable docker.service
来启用该服务。 这个 Docker 服务启动的,就是 docker engine,查看 /usr/lib/systemd/system/docker.service
,能看到有这样一条语句:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
默认情况下,Docker守护进程会生成一个 socket(/var/run/docker.sock
)文件来进行本地进程通信,因此只能在本地使用 docker 客户端或者使用 Docker API 进行操作。 sock 文件是 UNIX 域套接字,它可以通过文件系统(而非网络地址)进行寻址和访问。
因此只要以数据卷的形式将 docker 客户端和上述 socket 套接字挂载到容器内部,就能实现 "Docker in Docker",在容器内使用 docker 命令了。具体的命令见后面的「示例」部分。
要记住的是,真正执行我们的 docker 命令的是 docker engine,而这个 engine 跑在宿主机上。所以这并不是真正的 "Docker in Docker".
二、示例
在容器内部使用宿主机的 docker,方法有二:
- 命令行方式:将
/usr/bin/docker
映射进容器内部,然后直接在容器内部使用这个命令行工具docker
- 需要的时候,也可以将
/etc/docker
文件夹映射到容器内,这样容器内的docker
命令行工具也会使用与宿主机同样的配置。
- 需要的时候,也可以将
- 编程方式:在容器内部以编程的方式使用 docker
- 通过 python 使用 docker: 在 Dockerfile 中通过
pip install docker
将 docker client 安装到镜像中来使用
- 通过 python 使用 docker: 在 Dockerfile 中通过
容器的启动方式也有两种,如下:
1. 直接通过 docker 命令启动
示例命令如下:
docker run --name <name> \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--user root \
<image-name>:<tag>
**必须以 root 用户启动!(或者其他有权限读写 /var/run/docker.sock
的用户)**然后,在容器内就能正常使用 docker 命令,或者访问宿主机的 docker api 了。
2. 使用 docker-compose 启动
docker-compose.yml 文件内容如下:
version: ''3.3''
services:
jenkins-master:
image: jenkinsci/blueocean:latest
container_name: jenkins-master
environment:
- TZ=Asia/Shanghai # 时区
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home # 将容器中的数据映射到宿主机
- /usr/bin/docker:/usr/bin/docker # 为容器内部提供 docker 命令行工具(这个随意)
- /var/run/docker.sock:/var/run/docker.sock # 容器内部通过 unix socket 使用宿主机 docker engine
user: root # 必须确保容器以 root 用户启动!(这样它才有权限读写 docker.socket)
restart: always
然后通过 docker-compose up -d
即可后台启动容器。
Docker 中的 uid 与 gid
通过上面的操作,我们在容器内执行 docker ps
时,还是很可能会遇到一个问题:权限问题。
如果你容器的默认用户是 root,那么你不会遇到这个问题,因为 /var/run/docker.sock
的 onwer 就是 root.
但是一般来说,为了限制用户的权限,容器的默认用户一般都是 uid 和 gid 都是 1000 的普通用户。这样我们就没有权限访问 /var/run/docker.sock
了。
解决办法:
方法一(不一定有效):在构建镜像时,最后一层添加如下内容:
# docker 用户组的 id,通常都是 999
RUN groupadd -g 999 docker \
&& usermod -aG docker <your_user_name>
这样我们的默认用户,就能使用 docker 命令了。
P.S.
999
不一定是 docker 用户组,所以上述方法某些情况下可能失效。这时还是老老实实通过docker run -u root
启动容器吧。(或者在docker-compose.yml
中添加user: root
属性)
参考
- Docker in Docker - 王柏元
关于在 Azure 门户内的 Ubuntu Linux 中构建、部署 Docker 容器和azure 部署应用的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于CentOS7 下 Docker 中构建 Jenkins 容器、Create React App 无法在 docker 中构建、Docker - Aps.NET Core:无法在 Visual Studio 2019 中构建 Docker 映像、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock等相关内容,可以在本站寻找。
本文标签: