GVKun编程网logo

在 Apache 反向代理后面的 Docker 中运行 Wordpress(apache反向代理websocket)

1

以上就是给各位分享在Apache反向代理后面的Docker中运行Wordpress,其中也会对apache反向代理websocket进行解释,同时本文还将给你拓展AWSECS:在jenkinsslav

以上就是给各位分享在 Apache 反向代理后面的 Docker 中运行 Wordpress,其中也会对apache反向代理websocket进行解释,同时本文还将给你拓展AWS ECS:在 jenkins slave docker 中运行 docker、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、Docker Nginx 背后的 Docker Wordpress/Apache - 端口号问题、Docker 学习笔记之 docker-save vs docker-export vs docker-commit等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

在 Apache 反向代理后面的 Docker 中运行 Wordpress(apache反向代理websocket)

在 Apache 反向代理后面的 Docker 中运行 Wordpress(apache反向代理websocket)

如何解决在 Apache 反向代理后面的 Docker 中运行 Wordpress

我想在 apache 反向代理后面的 docker 容器中运行 wordpress 安装。 apache 还应该处理 ssl 终止。

Docker 配置:

  1. version: ''3.1''
  2. services:
  3. wordpress:
  4. image: wordpress:5.5-PHP7.4-apache
  5. restart: always
  6. ports:
  7. - 8080:80
  8. environment:
  9. wordpress_DB_HOST: db
  10. wordpress_DB_USER: <user>
  11. wordpress_DB_PASSWORD: <password>
  12. wordpress_DB_NAME: wp1-db
  13. volumes:
  14. - ./wp1:/var/www/html
  15. - ./uploads.ini:/usr/local/etc/PHP/conf.d/uploads.ini
  16. db:
  17. image: MysqL:5.7
  18. restart: always
  19. environment:
  20. MysqL_DATABASE: wp1-db
  21. MysqL_USER: <user>
  22. MysqL_PASSWORD: <password>
  23. MysqL_RANDOM_ROOT_PASSWORD: ''<password>''
  24. volumes:
  25. - ./db1/:/var/lib/MysqL

apache 配置

  1. <VirtualHost *:80>
  2. ServerName <servername>
  3. ProxyPreserveHost off
  4. ProxyPass / http://127.0.0.1:8080/
  5. ProxyPassReverse / http://127.0.0.1:8080/
  6. RewriteEngine on
  7. RewriteCond %{SERVER_NAME} =<servername>/ [OR]
  8. RewriteCond %{SERVER_NAME} =<servername>
  9. RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
  10. </VirtualHost>

现在,当我在没有 ssl 的情况下在给定域下输入我的站点时,该站点至少显示出来,但在控制台日志中有一些跨域错误,但没有加载一些 css 文件。

  1. ... has been blocked by CORS policy: No ''Access-Control-Allow-Origin'' header is present on the requested resource.

当我使用 ssl 进入网站时,我在控制台中收到大量混合内容错误。

  1. Mixed Content: The page at ''<URL>'' was loaded over HTTPS,but requested an insecure script ''<URL>''. This request has been blocked; the content must be served over HTTPS.
  • 我尝试手动将所有数据库条目从 http:// 替换为 https://,并使用更好的替换插件。
  • 我尝试将 wordpress 地址和站点地址从 http://domain.name:8080 更改为 1. https://domain.name 2. https://domain.name:8080

我想我在 wordpress 中缺少反向代理和配置的标头,内容将通过 https 加载?

非常感谢!!

编辑:

当我添加

  1. RequestHeader set X-Forwarded-Port "443"
  2. RequestHeader set X-Forwarded-Proto "https"

在 ssl conf 中,我摆脱了混合内容错误,但我无法再加载内容。

  1. GET https://<domain.name>:8080/wp-includes/css/dist/block-library/style.min.css?ver=5.6 net::ERR_SSL_PROTOCOL_ERROR

这个设置是否正确,我在 wordpress 中遗漏了什么?

AWS ECS:在 jenkins slave docker 中运行 docker

AWS ECS:在 jenkins slave docker 中运行 docker

如何解决AWS ECS:在 jenkins slave docker 中运行 docker

我正在使用 AWS ECS 构建主从 jenkins。
对于主 jenkins,我使用可扩展的亚马逊 ecs 插件来初始化奴隶。
https://plugins.jenkins.io/scalable-amazon-ecs/。

对于slave,我需要它来执行docker命令,
所以我自己构建 docker 镜像。
虽然我收到如下错误。

+ docker image list
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

从其他解决方案中,我尝试启动 docker,但仍然失败。

+ systemctl start docker
Failed to get D-Bus connection: Operation not permitted

我的 Docker 文件:

FROM amazonlinux:2.0.20190228

ARG BUILD_DATE
ARG VCS_REF
ARG SCHEMA_VERSION
ARG VERSION=4.6
ARG USER=jenkins
ARG GROUP=jenkins
ARG UID=1000
ARG GID=1000
ARG AGENT_workdir=/home/${USER}/agent
ARG EXTRA_DOCKER=18.06.1

ENV HOME /home/${USER}
ENV AGENT_workdir=${AGENT_workdir}
ENV JAVA_HOME /usr/lib/jvm/java 

RUN amazon-linux-extras enable corretto8 docker=$EXTRA_DOCKER && \\
  yum clean Metadata && \\
  yum -y update && \\
  yum -y install java-1.8.0-amazon-corretto-devel shadow-utils.x86_64 docker && \\
  yum clean all && \\
  rm -rf /var/cache/yum

RUN groupadd -g ${GID} ${GROUP}
RUN useradd -c "Jenkins user" -d $HOME -u ${UID} -g ${GID} -m ${USER}

RUN curl --create-dirs -fsSLo /usr/share/jenkins/slave.jar https://repo.jenkins-ci.org/public/org/jenkins-ci/main/remoting/${VERSION}/remoting-${VERSION}.jar \\
  && chmod 755 /usr/share/jenkins \\
  && chmod 644 /usr/share/jenkins/slave.jar

USER ${USER}
RUN mkdir /home/${USER}/.jenkins && mkdir -p ${AGENT_workdir}

VOLUME /home/${USER}/.jenkins
VOLUME ${AGENT_workdir}
workdir /home/${USER}

USER root
copY jenkins-slave /usr/local/bin/jenkins-slave
RUN chmod +x /usr/local/bin/jenkins-slave
USER ${user}
ENTRYPOINT ["/usr/local/bin/jenkins-slave"]

从 jenkins-slave 复制过来的。
https://github.com/pbsladek/jenkins-amazonlinux2-jnlp-slave/blob/master/jenkins-slave

Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock

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,方法有二:

  1. 命令行方式:将 /usr/bin/docker 映射进容器内部,然后直接在容器内部使用这个命令行工具 docker
    • 需要的时候,也可以将 /etc/docker 文件夹映射到容器内,这样容器内的 docker 命令行工具也会使用与宿主机同样的配置。
  2. 编程方式:在容器内部以编程的方式使用 docker
    • 通过 python 使用 docker: 在 Dockerfile 中通过 pip install docker 将 docker client 安装到镜像中来使用

容器的启动方式也有两种,如下:

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 - 王柏元

Docker Nginx 背后的 Docker Wordpress/Apache - 端口号问题

Docker Nginx 背后的 Docker Wordpress/Apache - 端口号问题

如何解决Docker Nginx 背后的 Docker Wordpress/Apache - 端口号问题

我在使用 Nginx docker 镜像获取 wordpress docker 镜像时遇到问题。

python/django 容器在 Nginx 上工作得很好,但 wordpress/apache 有问题。我可以使用 https 访问 django 站点。我无法使用 https 进入 wordpress。事实上,当我访问我的网站 site.com/wp 时,我会返回 site.com:8080/wp,因此出于某种原因它是通过端口返回的8080,而不是 44380。我已经尝试将 wordpress 站点设置为根位置 /(在 default.conf 文件中),但它仍然存在相同的问题(然后我得到 site.com:8080)。 wordpress 功能正常,我可以照常编辑网站。

Nginx 的 default.conf 文件

  1. disable_symlinks off;
  2. ssl_certificate xxx
  3. ssl_certificate_key xxx
  4. server {
  5. listen 80;
  6. return 301 https://$host$request_uri;
  7. }
  8. server {
  9. listen 443 ssl;
  10. server_name site.com;
  11. location / {
  12. proxy_pass http://django:8000; #django container
  13. }
  14. location /static {
  15. alias /path/to/static;
  16. }
  17. location /wp {
  18. proxy_set_header X-Real-IP $remote_addr;
  19. proxy_set_header X-Forwarded-For $remote_addr;
  20. proxy_set_header Host $host;
  21. proxy_pass http://wordpress:80; #the wordpress container
  22. }
  23. }

docker yml

  1. version: ''3.7''
  2. services:
  3. django:
  4. restart: always
  5. build:
  6. context: .
  7. dockerfile: docker-django #django gunicorn server,python image
  8. ports:
  9. - "8000:8000"
  10. wordpress:
  11. restart: always
  12. build:
  13. context: .
  14. dockerfile: docker-wordpress #docker wordpress-apache image
  15. # image: wordpress:latest
  16. volumes:
  17. - ./www/html:/var/www/html
  18. - ./etc/apache2:/etc/apache2
  19. ports:
  20. - "8080:80"
  21. Nginx:
  22. restart: always
  23. build:
  24. context: .
  25. dockerfile: docker-Nginx #docker Nginx image
  26. # image: Nginx
  27. volumes:
  28. - ./xx/static:/usr/xx/static
  29. - ./Nginx/conf.d:/etc/Nginx/conf.d
  30. ports:
  31. - "443:443"
  32. - "80:80"
  33. depends_on:
  34. - django
  35. - wordpress

解决方法

似乎 wordpress 容器正在从 mysql 中提取 8080 端口号,我最初将其设置为用于本地测试。

通过将这些行添加到 wp-config.php 来覆盖对我有用的 mysql 存储站点名称

  1. define( ''WP_HOME'',''https://'' . $_SERVER[''HTTP_HOST''] . ''/'' );
  2. define( ''WP_SITEURL'',''https://'' . $_SERVER[''SERVER_NAME''] . ''/'' );

Docker 学习笔记之 docker-save vs docker-export vs docker-commit

Docker 学习笔记之 docker-save vs docker-export vs docker-commit

之前对这几个 command 是忘了记,记了混~所以写下笔记以巩固之。

1.docker save

docker save -h

Usage:  docker save [OPTIONS] IMAGE [IMAGE...]

Save one or more images to a tar archive (streamed to STDOUT by default)

  --help             Print usage
  -o, --output       Write to a file, instead of STDOUT

从接的参数就可以猜到,直接接 image,不太可能导出单纯的文件系统(因为镜像本身就是分层存储的)

简单测试一下

docker save -o busybox.tar busybox && mkdir busybox && tar xf busybox.tar -C busybox
tree busybox
busybox
├── 2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749.json
├── 374004614a75c2c4afd41a3050b5217e282155eb1eb7b4ce8f22aa9f4b17ee57
│   ├── VERSION
│   ├── json
│   └── layer.tar
├── manifest.json
└── repositories

docker load 与之匹配,将其(带历史地)导入到 docker images 中

docker load -i busybox.tar

 

2.docker export

docker export -h
Usage:  docker export [OPTIONS] CONTAINER

Export a container''s filesystem as a tar archive

  --help             Print usage
  -o, --output       Write to a file, instead of STDOUT

从接的参数猜测,直接接 container,多半就是 dump rootfs 了

栗子测试一下:

docker run --name container -d busybox
docker export -o busybox.tar container && mkdir busybox && tar xf busybox.tar -C busybox
tree busybox -L 1
busybox
├── bin
├── dev
├── etc
├── home
├── proc
├── root
├── sys
├── tmp
├── usr
└── var

docker import 与之匹配

docker import busybox.tar my-busybox:1.0
docker images
# REPOSITORY     TAG    IMAGE ID            CREATED             SIZE
# my-busybox     1.0   5bfea374dd5c        3 seconds ago       1.093 MB

注意:docker import 后面接的是 docker export 导出的文件,也就是一个文件系统,所以导入的镜像是不带历史的
使用 docker history $image_name 查看镜像,只有一层

 

3.docker commit

docker commit -h       /tmp/pkg_debian (debian) choldrim-pc

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container''s changes

  -a, --author        Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  -c, --change=[]     Apply Dockerfile instruction to the created image
  --help              Print usage
  -m, --message       Commit message
  -p, --pause=true    Pause container during commit

commit 是合并了 save、load、export、import 这几个特性的一个综合性的命令,它主要做了:

  • 将 container 当前的读写层保存下来,保存成一个新层
  • 和镜像的历史层一起合并成一个新的镜像

如果原本的镜像有 3 层,commit 之后就会有 4 层,最新的一层为从镜像运行到 commit 之间对文件系统的修改

docker commit container my-commit-image
docker history my-commit-image
IMAGE          CREATED            CREATED BY                                      SIZE       COMMENT
e86539128c67   5 seconds ago       sh                                              0 B                 
2b8fd9751c4c   9 weeks ago         /bin/sh -c #(nop) CMD ["sh"]                    0 B                 
<missing>      9 weeks ago         /bin/sh -c #(nop) ADD file:9ca60502d646bdd815   1.093 MB

 

参考

 

今天关于在 Apache 反向代理后面的 Docker 中运行 Wordpressapache反向代理websocket的介绍到此结束,谢谢您的阅读,有关AWS ECS:在 jenkins slave docker 中运行 docker、Docker in Docker(实际上是 Docker outside Docker): /var/run/docker.sock、Docker Nginx 背后的 Docker Wordpress/Apache - 端口号问题、Docker 学习笔记之 docker-save vs docker-export vs docker-commit等更多相关知识的信息可以在本站进行查询。

本文标签: