对于EBCLI在应用程序根目录中找不到Dockerfile或Dockerrun.aws.json文件感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于AWSElasticBeanstalk,
对于EB CLI 在应用程序根目录中找不到 Dockerfile 或 Dockerrun.aws.json 文件感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于AWS Elastic Beanstalk,Dockerrun.aws.json和docker run上的多个端口、Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库、Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock的宝贵知识。
本文目录一览:- EB CLI 在应用程序根目录中找不到 Dockerfile 或 Dockerrun.aws.json 文件
- AWS Elastic Beanstalk,Dockerrun.aws.json和docker run上的多个端口
- Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库
- Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose
- Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock
EB CLI 在应用程序根目录中找不到 Dockerfile 或 Dockerrun.aws.json 文件
Nvm,错误是误导... 我必须跑 eb init -p docker 应用程序名称 之前在同一个目录下,这样就可以生成.elasticbeanstalk文件了。
AWS Elastic Beanstalk,Dockerrun.aws.json和docker run上的多个端口
我希望使用AWS API在EC2实例中运行docker ,并且有一个像这样的Dockerrun.aws.json :
{ "AWSEBDockerrunVersion": "1","Authentication": { "Bucket": "<BUCKET>","Key": ".dockercfg" },"Image": { "Name": "<NAME>:<TAG>","Update": "true" },"Ports": [ { "ContainerPort": "80" },{ "ContainerPort": "443" } ] }
就像你可以看到的,我有多个端口可以暴露,但弹性beanstalk只暴露它们的第一个。
我在文档中find了这个句子:您可以指定多个容器端口,但AWS Elastic Beanstalk只使用第一个将容器连接到主机的反向代理,并从公共Internet路由请求。
我的问题是为什么?
启用PostGres并设置sonar.properties之后,SonarQube不会恢复
Nginx无法写入access.log
Amazon EC2实例之间进行通信的最佳实践是什么?
为亚马逊深度学习AMI安装mxnet GPU R软件包的问题
Amazon EC2实例上的uWsgi安装exception
我有一个使用Oauth2协议的身份validation,为了安全起见,我必须使用HTTPS协议。 有了这个限制,我只能selectHTTP或HTTPS,因为我只能公开端口80或443。
我试图鼓励ebextensions使端口在EC2实例的Nginxredirect,但我失败了。 我能怎么做 ?
这个计算器用户有相同的问题。 在Elastic Beanstalk中暴露Docker的多个端口
提前感谢你
如何在GUI中访问Amazon AMI ec2实例
如何configuration我的nodejs应用程序只响应SSL连接?
在启动/停止或重启后,从AMI启动的EC2实例无法访问(ssh)
Nginx:在“passenger_root”指令中无效的参数个数
让Grails监听外部IP地址
我联系了亚马逊支持中心,我选择向您展示答案。
你好K …,
通过Dockerrun.aws.json,Elastic Beanstalk挂钩脚本将只读取JSON文件中的第一个端口。
这是因为在/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh中:
如果[ echo $EB_CONfig_DOCKER_PORT | wc -w echo $EB_CONfig_DOCKER_PORT | wc -w -gt 1]; 那么EB_CONfig_DOCKER_PORT = echo $EB_CONfig_DOCKER_PORT | awk '{print $1}' echo $EB_CONfig_DOCKER_PORT | awk '{print $1}'警告“只允许使用一个EXPOSE指令,使用第一个指令:$ EB_CONfig_DOCKER_PORT”fi
挂钩脚本将必须指定一个随机端口为反向代理转发,然后转发到您的Docker容器的端口。 目前只能设置一个端口映射。
关于Nginx配置,实现端口443监听你的环境的最快方法是在/etc/Nginx/conf.d/中创建一个单独的服务器部分,例如custom-ssl.conf,它处理HTTPS握手客户。 这意味着您必须将您的SSL证书放在实例上,以便Nginx可以执行SSL握手。 稍后我会在Nginx中给出一个HTTPS示例配置。
否则,如果您的环境是负载平衡的,那么您可以简单地在ELB上设置HTTPS侦听器,然后让ELB处理SSL终止。
同时,如果您有其他问题,请不要犹豫,问!
最好的祝福,
悉尼支持中心
*
你好再次K …,
正如我在前面的信件中提到的那样,请在一个实例Docker环境中附上一个示例.ebextensions配置文件,它将在Nginx上设置一个https服务器。 你没有让我知道你正在查询哪个环境,所以附加的.ebextensions将只能在单个实例环境中工作。
这个.ebextensions配置文件执行以下操作:
将Nginx的https服务器配置文件添加为/etc/Nginx/sites-enabled/https.conf,该文件将传入的https会话作为http进行反向代理到Docker容器。
将SSL密钥/证书组合文件添加到/etc/pki/tls/certs/my_ssl.crt中,这是上述HTTPS服务器所要求的。
将额外的入口规则添加到Beanstalk环境的EC2安全组,以允许传入的TCP:443连接到实例
请随意修改.ebextensions配置文件以适合您的使用情况,并将其放在应用程序根级别的.ebextensions /目录中,以便在Elastic Beanstalk中进行部署。 如果该目录不存在,请创建它。
有关.ebextensions配置文件的更多信息,请参阅:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers.html
如果您处于负载平衡的环境中,则需要通过AWS CLI将SSL证书上载到IAM,并配置Beanstalk环境的ELB以启用其HTTPS侦听器。 说明将与上面的不同:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https.html
请让我知道你如何去与.ebextensions配置文件,并让我知道如果您需要进一步的帮助!
最好的祝福,
悉尼支持中心
他给了我一个附件的例子。 01-Nginx的,ssl.config
files: "/etc/Nginx/sites-enabled/https.conf": mode: "000644" owner: root group: root content: | server { listen 443 ssl; ssl_certificate_key /etc/pki/tls/certs/my_ssl.crt; ssl_certificate /etc/pki/tls/certs/my_ssl.crt; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://docker; proxy_http_version 1.1; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } "/etc/pki/tls/certs/my_ssl.crt": mode: "000400" owner: root group: root content: | <Your key/cert pair goes here> Resources: AllowSSL: Type: AWS::EC2::SecurityGroupIngress Properties: GroupId: {Ref : AWSEBSecurityGroup} IpProtocol: tcp ToPort: 443 FromPort: 443 CidrIp: 0.0.0.0/0
Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库
MySQL 部署
拉取 mysql 镜像 docker pull centos/mysql-57-centos7
创建 MySQL 容器 docker run -di --name=mysql01 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=320512 centos/mysql-57-centos7
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是 root 用户的登录密码
Tomcat 部署
拉取镜像 docker pull tomcat:7-jre7
创建容器 创建容器 -p 表示地址映射
docker run ‐di ‐‐name=mytomcat ‐p 9000:8080
‐v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7‐jre7
Nginx 部署
拉取镜像 docker pull nginx
创建容器 docker run ‐di ‐‐name=mynginx ‐p 80:80 nginx
Redis 部署
拉取镜像 docker pull redis
创建容器 docker run ‐di ‐‐name=myredis ‐p 6379:6379 redis
迁移与备份
容器保存为镜像
我们可以通过以下命令将容器保存为镜像
docker commit 容器名称 镜像名称
镜像备份
我们可以通过以下命令将镜像保存为 tar 文件
docker save -o tar 文件名称 镜像名称
恢复镜像
docker load -i tar 文件名称
Dockerfile
Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过 Dockerfile 文件构建一个新的镜像开始工作了;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
常用命令
命令 | 作用 |
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是 Dockerfile 的核心部分 (可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和 ADD 相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
使用脚本创建镜像
步骤:
(1)创建目录
mkdir –p /usr/local/dockerjdk8
(2)下载 jdk-8u171-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录
(3)创建文件 Dockerfile vi Dockerfile
#依赖镜像名称和 ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径 jar, 把 java 添加到容器中
ADD jdk‐8u171‐linux‐x64.tar.gz /usr/local/java/
#配置 java 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH
$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
(4)执行命令构建镜像(注意后边的空格和点,不能省略)
docker build ‐t=''jdk1.8'' .
参看镜像是否建立完成
docker images
Docker 私有仓库
私有仓库搭建与配置
(1)拉取私有仓库镜像(此步省略)
docker pull registry
(2)启动私有仓库容器
docker run ‐di ‐‐name=registry ‐p 5000:5000 registry
(3) 打开浏览器输入地址 http://ip:5000/v2/_catalog,看到 {"repositories":[]} 表示私有仓库搭建成功并且内容为空。
(4) 修改 daemon.json vi /etc/docker/daemon.json
添加以下内容,保存退出,这是为了让 docker 信任私有仓库地址 {"insecure-registries":["ip:5000"]}
重启 docker 服务
systemctl restart docker
镜像上传到私有仓库
标记此镜像为私有仓库的镜像 docker tag jdk1.8 ip:5000/jdk1.8
再次启动私服容器
docker start registry
上传标记的镜像
docker push ip:5000/jdk1.8
Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose
Docker 学习路线 11:Docker命令行
Docker CLI (命令行界面) 是一个强大的工具,可让您与 Docker 容器、映像、卷和网络进行交互和管理。它为用户提供了广泛的命令,用于在其开发和生产工作流中创建、运行和管理 Docker 容器和其他 Docker 资源。
安装
要开始使用 Docker CLI,您需要在计算机上安装 Docker。您可以从 Docker 文档的官方安装指南中按照您所使用的操作系统进行安装。
基本命令
以下是一些基本的 Docker CLI 命令,供您熟悉:
docker run
:从 Docker 映像创建并启动容器docker container
:列出正在运行的容器docker image
:列出系统中所有可用的映像docker pull
:从 Docker Hub 或其他注册表拉取映像docker push
:将映像推送到 Docker Hub 或其他注册表docker build
:从 Dockerfile 构建映像docker exec
:在正在运行的容器中运行命令docker logs
:显示容器的日志
Docker Run 选项
docker run
是 Docker CLI 中最重要的命令之一。您可以使用各种选项自定义容器的行为,例如:
d, --detach
:在后台运行容器e, --env
:为容器设置环境变量v, --volume
:绑定挂载卷p, --publish
:将容器的端口发布到主机name
:为容器指定名称restart
:指定容器的重启策略rm
:容器退出时自动删除容器
Dockerfile
Dockerfile 是一个包含构建 Docker 映像的指令的脚本。您可以使用 Docker CLI 使用 Dockerfile 构建、更新和管理 Docker 映像。
以下是 Dockerfile 的一个简单示例:
# Set the base image to use
FROM alpine:3.7
# Update the system and install packages
RUN apk update && apk add curl
# Set the working directory
WORKDIR /app
# Copy the application file
COPY app.sh .
# Set the entry point
ENTRYPOINT ["./app.sh"]
要构建映像,请使用以下命令:
docker build -t my-image .
Docker Compose
Docker Compose 是一个 CLI 工具,用于使用 YAML 文件定义和管理多容器 Docker 应用程序。它与 Docker CLI 协作,提供了一种一致的方式来管理多个容器及其依赖项。
使用官方的安装指南安装 Docker Compose,然后您可以创建一个 docker-compose.yml
文件来定义和运行多容器应用程序:
version: ''3''
services:
web:
image: webapp-image
ports: - "80:80"
database:
image: mysql
environment: - MYSQL_ROOT_PASSWORD=my-secret-pw
使用以下命令运行应用程序:
docker-compose up
总之,Docker CLI 是管理 Docker 容器和资源的强大而多才多艺的工具。一旦熟悉其命令和功能,您将能够轻松开发、维护和部署使用 Docker 的应用程序。
Docker镜像
Docker镜像是一种轻量级、独立、可执行的软件包,其包含了运行应用程序所需的所有组件。这些组件包括:依赖项、库、运行时、系统工具和代码等,以确保应用程序在不同的环境中可以保持一致地运行。
Docker镜像是使用Dockerfile进行构建和管理的。Dockerfile是一个包含了创建Docker镜像所需指令的脚本,提供了一个逐步设置应用程序环境的指南。
使用Docker镜像
Docker CLI提供了多个命令来管理和使用Docker镜像。其中一些重要的命令包括:
docker image ls
:列出本地系统上所有可用的镜像。docker build
:从Dockerfile构建镜像。docker image rm
:删除一个或多个镜像。docker pull
:从注册表(如Docker Hub)将镜像拉到本地系统。docker push
:将镜像推送到仓库。
例如,要从Docker Hub拉取官方的Ubuntu镜像,可以运行以下命令:
docker pull ubuntu:latest
拉取镜像后,可以使用docker run
命令创建和运行一个使用该镜像的容器:
docker run -it ubuntu:latest /bin/bash
这个命令将创建一个新的容器,并使用**/bin/bash
** shell在容器内启动一个交互式会话。
共享镜像
Docker镜像可以使用容器注册表(如Docker Hub、Google Container Registry或Amazon Elastic Container Registry(ECR))共享和分发。一旦将您的镜像推送到注册表中,其他人就可以轻松地访问和使用它们。
要共享您的镜像,您首先需要使用适当的命名格式对其进行标记:
docker tag <image-id> <username>/<repository>:<tag>
然后,您可以使用以下命令将标记的镜像推送到注册表中:
docker push <username>/<repository>:<tag>
总之,Docker镜像是Docker生态系统中不可或缺的一部分,允许开发人员打包其应用程序、轻松地共享它们,并在不同的环境中确保一致性。通过理解Docker镜像和管理它们的命令,您可以利用容器化的力量,增强您的开发工作流程。在您的开发过程中使用Docker镜像可以大大提高开发效率,减少开发过程中的问题,让您能够更好地专注于应用程序的核心开发。
容器
容器可以被视为轻量级的、独立的可执行软件包,包括运行所需的所有东西,包括代码、运行时、库、环境变量和配置文件。容器将软件与其环境隔离开来,确保其在不同环境下工作一致。
为什么使用容器?
- 可移植性:容器确保应用程序在不同平台上一致工作,无论是开发人员的笔记本电脑还是生产服务器。这消除了“它在我的机器上运行”的问题。
- 效率:容器很轻量级,因为它们使用共享资源,没有完整操作系统的开销。这使得启动时间更快,减少资源使用。
- 可扩展性:容器可以根据工作量轻松地进行缩放,因此非常适合分布式应用程序和微服务。
- 一致性:容器使得开发人员、QA 和运维团队在整个应用程序生命周期中拥有一致的环境,从而加快了部署流程。
- 安全性:容器提供了一定程度的隔离,使其与其他容器和底层主机系统隔离开来,有助于维护应用程序的安全性。
使用 Docker CLI 工作
Docker CLI 提供了多个命令,可帮助您创建、管理和与容器交互。一些常用命令包括:
docker run
:用于创建和启动新容器。docker container ls
:列出运行中的容器。docker container stop
:停止运行中的容器。docker container rm
:删除已停止的容器。docker exec
:在运行中的容器中执行命令。docker logs
:获取容器的日志,有助于调试问题。
Docker卷
Docker卷是一种用于存储Docker容器生成和使用的数据的机制。它们允许您将数据与容器本身分开,从而轻松备份、迁移和管理持久性数据。
卷的重要性
Docker容器本质上是暂时的,这意味着它们可以轻松地停止、删除或替换。尽管这对应用程序开发和部署非常有利,但处理持久性数据时会带来挑战。这就是卷的作用。它们提供了一种将数据存储和管理与容器的生命周期分开的方法。
卷的类型
Docker中有三种类型的卷:
- 主机卷:它们存储在主机机器的文件系统中,通常位于
/var/lib/docker/volumes
目录中。这些可以很容易地访问,但可能会带来可移植性或文件系统兼容性问题。 - 匿名卷:这些是在运行容器时没有指定卷时自动生成的。它们的ID由Docker生成,也存储在主机机器的文件系统中。
- 命名卷:与匿名卷类似,命名卷也存储在主机机器的文件系统中。但是,您可以提供自定义名称,这样在其他容器中引用或备份时更容易。
使用Docker CLI管理卷
Docker CLI提供了各种命令来管理卷:
docker volume create
: 使用给定的名称创建新卷。docker volume ls
: 列出系统中的所有卷。docker volume inspect
: 提供有关特定卷的详细信息。docker volume rm
: 删除卷。docker volume prune
: 删除所有未使用的卷。
要在容器中使用卷,可以在docker run
命令期间使用-v
或--volume
标志。例如:
docker run -d --name my-container -v my-named-volume:/var/lib/data my-image
此命令使用“my-image”映像创建一个名为“my-container”的新容器,并在容器内部将“my-named-volume”卷挂载到/var/lib/data
路径。
Docker 网络
Docker 网络提供了管理容器通信的重要方法。它允许容器使用各种网络驱动程序相互通信并与主机机器通信。通过理解和利用不同类型的网络驱动程序,您可以设计容器网络以适应特定的场景或应用程序需求。
网络驱动程序
Docker 中有几个可用的网络驱动程序。这里,我们将介绍四个最常见的驱动程序:
- bridge:容器的默认网络驱动程序。它创建了一个私有网络,容器可以相互通信并与主机机器通信。在此网络上的容器可以通过主机网络访问外部资源。
- host:该驱动程序取消了网络隔离并允许容器共享主机的网络。在网络性能至关重要的情况下,它非常有用,因为它最小化了容器网络的开销。
- none:该网络驱动程序禁用容器网络。使用此驱动程序的容器在没有任何网络访问的隔离环境下运行。
- overlay:该网络驱动程序使部署在不同主机上的容器能够相互通信。它专为 Docker Swarm 设计,并且非常适合多主机或基于集群的容器部署。
管理 Docker 网络
Docker CLI 提供了各种命令来管理网络。以下是一些有用的命令:
- 列出所有网络:
docker network ls
- 检查网络:
docker network inspect <network_name>
- 创建新网络:
docker network create --driver <driver_type> <network_name>
- 将容器连接到网络:
docker network connect <network_name> <container_name>
- 将容器与网络断开连接:
docker network disconnect <network_name> <container_name>
- 删除网络:
docker network rm <network_name>
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding
,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎 点赞、收藏、关注
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 - 王柏元
关于EB CLI 在应用程序根目录中找不到 Dockerfile 或 Dockerrun.aws.json 文件的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于AWS Elastic Beanstalk,Dockerrun.aws.json和docker run上的多个端口、Docker 04 应用部署与迁移备份 Dockerfile 与 Docker 私有仓库、Docker CLI 实战指南:从基础命令到 Dockerfile 构建和 Docker Compose、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock等相关内容,可以在本站寻找。
本文标签: