首先说我对 Docker 完全陌生,我还不熟悉 Docker 生态系统。
我尝试执行的是创建一个docker-composer.yml在我的项目的本地开发环境中使用的。
我已经将wp-local-docker用于我的 WordPress 项目,但我也有一些旧项目具有不同的要求,因此,我做了自己的docker-compose.yml. 我自己的代码docker-compose.yml如下:
version: "3.4"
services:
database:
image: mysql:latest
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: appdb
MYSQL_USER: appuser
MYSQL_PASSWORD: password
volumes:
- $PWD/data/db:/var/lib/mysql
networks:
app_net:
ipv4_address: 192.168.50.10
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
links:
- database:mysql
ports:
- "8181:80"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: appuser
MYSQL_PASSWORD: password
PMA_HOST: mysql
PMA_PORT: 3306
PMA_USER: appuser
PMA_PASSWORD: password
networks:
app_net:
ipv4_address: 192.168.50.11
web:
build: $PWD/ApachePHP
depends_on:
- database
links:
- database:mysql …Run Code Online (Sandbox Code Playgroud) 创建一个没有任何互联网访问权限的隔离 Docker 容器的最简单方法是什么?
我有一个简单的 Nginx 代理 Docker 容器侦听端口 80。这是 Dockerfile:
FROM centos:7
MAINTAINER Brian Ogden
# Not currently being used but may come in handy
ARG ENVIRONMENT
RUN yum -y update && \
yum clean all && \
yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
yum -y makecache && \
yum -y install nginx-1.12.0 wget
# Cleanup some default NGINX configuration files we don’t need
RUN rm -f /etc/nginx/conf.d/default.conf
COPY /conf/proxy.conf /etc/nginx/conf.d/proxy.conf
COPY /conf/nginx.conf /etc/nginx/nginx.conf
CMD ["nginx"]
Run Code Online (Sandbox Code Playgroud)
对于这个 Nginx 代理,这里是我的 nginx.conf:
daemon off; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的 wordpress 博客从主机转移到我自己的服务器。我想使用 docker 来完成这项任务。
在我的服务器上运行 nginx,它承载了许多与这个问题无关的服务。我使用以下脚本来创建一个容器。
#!/bin/bash
docker create --name blog \
--net bridge \
-e WORDPRESS_DB_HOST=192.168.170.11 \
-e WORDPRESS_DB_USER=USER \
-e WORDPRESS_DB_PASSWORD=PASSWORD \
-e WORDPRESS_DB_NAME=wordpress \
-v /var/www/wordpress:/var/www/html \
-p 8000:80 \
wordpress
Run Code Online (Sandbox Code Playgroud)
数据库连接有效并且 apache2 正在运行。但是我无法访问wordpress。
当我尝试访问时localhost:8000,将我重定向到80nginx 正在侦听的端口。为什么?我想连接到容器内的端口 80 (apache2)。
当我从外部尝试此操作时也是如此(如果防火墙关闭)。
另一个问题是防火墙:端口 8000/tcp 对所有 IP 都是开放的,但我来自外部的请求仍然被阻止。我必须为这个 docker 容器打开什么?
运行Docker version 17.05.0-ce, build 89658be上Debian Stretch。
编辑:
root@server:~/docker# curl -v http://localhost:8000
* Rebuilt URL to: http://localhost:8000/
* Trying ::1...
* TCP_NODELAY set …Run Code Online (Sandbox Code Playgroud) 一些安全更新刚刚发布,我想重建我的 Docker 镜像以利用这些更新。
但是,当我运行docker build .它时,它会立即完成而不更新任何内容,因为Dockerfile. 它甚至不会尝试apt-get update在我的Dockerfile.
apt-get update即使没有任何变化,我如何强制 Docker再次运行命令?
有一个--no-cache选项表示它不会在构建过程中使用缓存,但我希望它之前将缓存用于命令,apt-get update并且我希望将结果保存到缓存中以备下次运行(替换当前缓存的图像),所以我肯定想使用缓存。
我也无法docker rmi删除apt-get运行后生成的图像,因为它拒绝删除该图像作为image has dependent child images.
我正在努力为 Amazon ECS 中的任务定义内的容器设置正确的 HEALTHCHECK。
我尝试了多种解决方案,但无法让最简单的“始终正确”的健康检查真正起作用。
我的健康检查看起来像这样:
[ "CMD-SHELL", "echo"]
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该总是产生一个健康的容器,但不幸的是,我总是处于不健康状态。当我对不健康的容器进行 docker 检查时,我得到以下信息
[ec2-user@ip-10-0-0-77 ~]$ docker inspect 8f14979ae4eb
[
{
"Id": "8f14979ae4eb4e16ec26a4ac886d29b29f5666e5f00d41c56d25f5efe0c7d57e",
"Created": "2018-05-15T08:55:50.399791936Z",
"Path": "/bin/sh",
"Args": [
"-c",
"echo \"The application will start in ${JHIPSTER_SLEEP}s...\" && sleep ${JHIPSTER_SLEEP} && java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.war"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 783,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-05-15T08:55:51.049068973Z",
"FinishedAt": "0001-01-01T00:00:00Z",
"Health": {
"Status": "starting",
"FailingStreak": 2,
"Log": [
{
"Start": …Run Code Online (Sandbox Code Playgroud) 我有一个 mongo 实例在一个名为的容器中运行,该容器mongo1已公开端口 27017。我可以从主机正常连接。
我有另一个容器正在运行一个想要连接到 mongo 实例的应用程序。
如何连接 2 个容器,以便将主机名mongo1公开给另一个容器并且它可以连接到mongo1:27017?
我正在尝试构建一个包含 cron 的 docker 镜像。从 docker 文件系统的特定位置删除文件的 cron。下面是我的 Dockerfile
FROM ubuntu:latest
MAINTAINER docker@ekito.fr
RUN apt-get update && apt-get -y install cron
# Copy testfiles folder to docker container.
COPY ./testfiles /opt/
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
RUN (crontab -l -u root; echo "* * * * * root rm -rf /opt/*") | crontab
# Run the command on container startup
CMD cron
ENTRYPOINT ["/bin/sh", "-c", "/bin/bash"]
Run Code Online (Sandbox Code Playgroud)
一切都很成功。我的 cron 也设置在容器中
roadrunner:test shailesh$ …Run Code Online (Sandbox Code Playgroud) 我使用多阶段构建将构建环境与最终的 docker 镜像分开:
FROM ubuntu:bionic AS build
RUN apt-get update && apt-get install -y \
build-essential \
[...]
RUN wget https://someserver.com/somefile.tar.gz && \
tar xvzf somefile.tar.gz && \
./configure && \
make && make install && \
[missing part]
FROM ubuntu:bionic
COPY --from=build /tmp/fakeroot/ /
[...]
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法来收集make install在运行时创建/复制的所有文件?
目前我正在使用ldd和单个文件副本的组合来获取它们:
cp /etc/xyz/* /tmp/fakeroot/xyz
cp --parents $(ldd /usr/sbin/nginx | grep -o '/.\+\.so[^ ]*' | sort | uniq) /tmp/fakeroot
Run Code Online (Sandbox Code Playgroud)
但是由于 make install 已经有了将哪个文件复制到哪个目录的信息,我问自己是否没有任何方法可以使用这种机制。
感谢您的任何想法!
我试图使用 aws 代码构建服务构建 docker 镜像,然后将其推送到 ECR。我用于它的命令"buildspec.yml"在下面指定。
version: 0.2
phases:
install:
runtime-versions:
docker: 18
pre_build:
- $(aws ecr get-login --no-include-email --region us-east-1)
- REPOSITORY_URI=XXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/devopswebbuild
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
build:
commands:
- docker build -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
Run Code Online (Sandbox Code Playgroud)
但是我在构建过程中遇到错误,docker 命令无法连接到 docker daemon。请帮助我解决这些问题。
Docker 构建项目配置详细信息如下:
构建错误详细信息如下:
docker ×10
amazon-ecs ×2
containers ×1
firewall ×1
linux ×1
make ×1
networking ×1
nginx ×1
proxy ×1
ubuntu ×1
wordpress ×1