docker 容器访问宿主机端口
发表于|更新于|码不能停
|总字数:255|阅读时长:1分钟|浏览量:
运行在 docker 容器中的一个项目需要访问宿主机的某个端口,比如容器 A 中的项目访问宿主机 B,在 A 的项目中以下边的地址来访问即可:
1 | host.docker.internal |
之前是可以运行的,但是今天不知道什么情况突然 500 了,重启电脑后,在容器中 ping 这个地址:
1 | PING host.docker.internal (192.168.65.2) 56(84) bytes of data. |
可以看到实际访问的是 192.168.65.2 这个地址,那么在宿主机的 host 加上一行:
1 | 192.168.65.2 host.docker.internal |
再次访问,ok!做个记录,防止下次再忘。
安装ping
不指定用户进入容器,然后执行:
1 | apt-get update |
文章作者: m-finder
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 M-finder!
相关推荐

2019-03-21
laradock 中 php5.6 连接 mysql 报错解决
laradock 中 php 5.6 连接 mysql 报错的解决方法。 之前弄的是默认版本的 php 7.2 和 mysql 8,配置好以后一直都能正常使用。 最近因为需要切换 php 版本,突然发现切换后连接 mysql 时无法识别 host。 emmmm……,最开始还以为是 php 的锅,各种重新 build,无果,最后在 github 上找到别人发出来的解决办法: rm -rf ~/.laradock/data/mysql删除老版本的数据 docker-compose build mysql重新构建 mysql 进入 mysql 容器mysql -uroot -prootALTER USER root IDENTIFIED WITH mysql_native_password BY ‘root’;exit; 到这里也就可以了。 有这个问题是因为 8 和 5.7 的配置不一样,不清掉老数据的话会引起报错,一有请求去连接 mysql 马上就宕机。

2019-04-09
laravel 队列学习
学习下 laravel 的队列系统。 队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和相应的时间。 常用的队列后台有: Beanstalk,Amazon SQS,Redis 等。 配置laravel 为多种队列服务做了统一的API,在配置文件 config/queue.php 中可以找到每种队列驱动的配置。 其中每种驱动都有一个默认的 queue 属性,用来存放使用时没有显示定义队列的任务。 12345// 分发到默认队列Job::dispatch();// 分发到 emails 队列Job::dispatch()->onQueue('emails'); 在项目的配置文件中,可以指定驱动,老版本中为 QUEUE_DRIVER,新版本中为QUEUE_CONNECTION , 驱动默认为 sync,这是一个本地的同步驱动,方便调试队列里的任务。 先以 redis 为例做一个邮件发送队列。 因为 laravel 的 redis 默认使用了 predis,所以先装下扩展: 1composer require 'predis/predis' 邮件配置,最后两项是手动添加的,否则会报错: 12345678MAIL_DRIVER=smtpMAIL_HOST=smtp.mxhichina.comMAIL_PORT=25MAIL_USERNAME=m@m-finder.comMAIL_PASSWORD=xxxxxxMAIL_ENCRYPTION=nullMAIL_FROM_NAME=M-finderMAIL_FROM_ADDRESS=m@m-finder.com 生成任务类命令行执行:php artisan make:job EmailJob,该命令会在 app/jobs 下自动创建文件。 在任务类中发送邮件: 12345678public function handle() { $email = $this->email; $content = '这是一封来自Laravel的队列测试邮件.'; Mail::raw($content, function ($message) use ($email) { $message->subject('[ 测试 ] 测试邮件SendMail - ' . date('Y-m-d H:i:s')); $message->to($email); });} 任务调度之前弄了登录事件和监听,就在监听里去触发吧。 1EmailJob::dispatch($guard->user)->onQueue('emails'); 开启队列1php artisan queue:work --tries=3 --timeout=30 --queue=emails 然后重新登录触发任务。可以看到邮箱已经有了提示: 邮件已经成功发出,接下来就可以在实际的需求中使用了。

2019-03-08
phpstorm 配置 laradock xdebug
本次操作为 win10 系统,理论上和其他系统无差异。 克隆 laradock 到本地:git clone https://github.com/Laradock/laradock.git 进入 laradock 文件夹, 生成配置文件:cp .\env-example .env 编辑 .env 配置文件: 1234WORKSPACE_INSTALL_XDEBUG=truePHP_FPM_INSTALL_XDEBUG=true 修改 laradock/php-fpm/xdebug.ini 和 laradock/workspace/xdebug.ini配置文件: 1234567891011121314151617xdebug.remote_host=dockerhostxdebug.remote_connect_back=0xdebug.remote_port=9000xdebug.idekey=PHPSTORMxdebug.remote_autostart=1xdebug.remote_enable=1xdebug.cli_color=0xdebug.profiler_enable=0xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"xdebug.remote_handler=dbgpxdebug.remote_mode=reqxdebug.var_display_max_children=-1xdebug.var_display_max_data=-1xdebug.var_display_max_depth=-1 然后在 laradock 同级新建 www 文件夹并在文件夹下新建 index.php 文件。修改 laradock/nginx/sites/default.conf 配置: 1root /var/www; build 服务: docker-compose bild php-fpm workspace 启动服务:docker-compose up -d nginx mysql workspace 打开 phpstorm,添加 php 设置和 server: 添加 php 时,要把 additional 里的两个内容填好。options 内容如下图: 1-dxdebug.remote_host=docker.for.win.localhost -dxdebug.remote_enable=1 -dxdebug.remote_port=9000 -dxdebug.remote_mode=req 建好以后,再添加 remote_debug: 配置好以后,启动 debug,打开电话按钮,添加断点刷新页面。 注: 配置好 xdebug 后,如果需要安装 laravel,需要把 phpstorm 关掉。否则会拦截的 composer 的请求。具体表现为执行任何 composer 的命令都没有反应。

2018-04-10
Docker使用教程-以Dockerfile定制镜像
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。 而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 理解镜像构成镜像是容器的基础,每次执行 docker run 的时候都会指定以哪个镜像作为容器运行的基础。 镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。 现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。 1docker run --name webserver -d -p 80:80 nginx 这条命令会用 nginx 镜像启动一个容器,该容器命名为 webserver,并且映射了宿主机的 80 端口,这样我们就可以在宿主机用浏览器去访问这个 nginx 服务器。docker的启动画面中有当前容器的 ip,例如:192.168.99.100,打开浏览器直接访问该 ip 就能看到默认的 Nginx 欢迎页面。 现在,我们来做点尝试,修改下nginx的欢迎页面。 1234$ docker exec -it webserver bashroot@bcd5b7c85e68:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.htmlroot@bcd5b7c85e68:/# exitexit 我们以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。 然后,我们用 Hello, Docker! 覆盖了 /usr/share/nginx/html/index.html 的内容。 现在我们再刷新浏览器的话,会发现内容被改变了。 我们修改了容器的文件,也就是改动了容器的存储层。要保存这些修改,可以使用 docker 提供的 docker commit 命令将存储层保存下来成为新的镜像。也就是说,是在原有镜像的基础上,再叠加上改动了的存储层并构成新的镜像。 这意味着每一次修改都会让存储层叠加,而且你所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。 想想就是件很恐怖的事情。😰 不过,存在即是真理,commit 虽然恐怖,但还是很有用武之地的,比如被入侵后保存现场和一些特殊场合。 使用 Dockerfile 定制镜像如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建和定制镜像,那么之前提及透明性和体积臃肿的问题就都会解决。 这个脚本就是 Dockerfile。 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 还是以上边的 nginx 为例。 创建一个文件夹,然后在文件夹内创建一个文本文件。 123mkdir /c/dockercd /c/dockertouch Dockerfile 其内容为: 12FROM nginxRUN echo '<h1>Hello, M-finder!</h1>' > /usr/share/nginx/html/index.html FROM 指定基础镜像所谓定制镜像,就是以一个镜像为基础,在其上进行定制。就像我们先运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。 RUN 执行命令RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种: shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。 1RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html run 命令应尽可能的压缩为一行,因为每一个 run 命令就是一层存储层,而且,命令应该遵循良好的代码格式,比如换行、缩进、注释等,会让维护、排障更为容易,最后也应该添加清理工作的命令。 构建镜像在 Dockerfile 文件所在目录执行: 1234567891011$ docker build -t nginx:v3 .Sending build context to Docker daemon 2.56kBStep 1/2 : FROM nginx ---> c5c4e8fa2cf7Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ---> Running in 4e2f0f98fbfeRemoving intermediate container 4e2f0f98fbfe ---> 8b70819a7261Successfully built 8b70819a7261Successfully tagged nginx:v3SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories. 从命令的输出结果中,我们可以清晰的看到镜像的构建过程。在 Step 2 中,如同我们之前所说的那样,RUN 指令启动了一个容器 4e2f0f98fbfe,执行了所要求的命令,并最后提交了这一层 c5c4e8fa2cf7,随后删除了所用到的这个容器 4e2f0f98fbfe。 这里我们使用了 docker build 命令进行镜像构建。其格式为: docker build [选项] <上下文路径/URL/->在这里我们指定了最终镜像的名称 -t nginx:v3,构建成功后,我们可以像之前运行 nginx 那样来运行这个镜像。

2020-01-14
win10 子系统(wsl1)运行 laradock
子系统出来挺长时间了,看看配置,公司的渣机也就能玩玩wsl1,也就是第一代子系统。 算了,就这么鼓捣吧。 子系统选择 Ubuntu。 安装子系统略 配置 docker官网配置手册 先卸载旧版docker: 1sudo apt-get remove docker docker-engine docker.io containerd runc 然后再继续安装: 12345678910111213141516171819202122232425262728# 更新索引sudo apt-get update# 安装软件,允许 apt 通过 https 访问存储库sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ software-properties-common# 添加Docker的官方GPG密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 设置存储库sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"# 安装 docker 客户端sudo apt-get install docker-ce# 赋权sudo usermod -aG docker $USER# 安装 docker-composesudo apt install docker-compose 关联 wsl 到 docker-for-windows在 wsl 中运行 1echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc wsl 目录挂载wsl 目录挂载默认在 /mnt/c,跟 docker-for-windows 的工作方式不一致,因此需要做下调整。 12345sudo vi /etc/wsl.conf[automount]root = /options = "metadata" 保存以后,重启 wsl。 启动laradock在 windows 的 laradock 目录中打开命令行,运行 bash 即可快速进入 wsl 中的对应目录,然后再执行 docker-compose up 命令就能启动服务。 启动完以后,宿主机直接访问即可。 如果配置虚拟域名,一样是在宿主机的 hosts 添加。

2019-08-23
在 laradock 环境中使用 laravel-swoole 加速你的 laravel 应用
在 laradock 环境中使用 laravel-swoole 加速你的 laravel 应用。 安装laravel-swoole12composer require swooletw/laravel-swoolephp artisan vendor:publish --tag=laravel-swoole 开放 workspace 端口在 laradock/workspace/Dockerfile 最后添加一行: 1EXPOSE 1215 然后重新 build workspace 容器。 修改 nginx 配置123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657upstream swoole-http { server workspace:1215;}map $http_upgrade $connection_upgrade { default upgrade; '' close;}server { listen 80; listen [::]:80; # For https # listen 443 ssl; # listen [::]:443 ssl ipv6only=on; # ssl_certificate /etc/nginx/ssl/default.crt; # ssl_certificate_key /etc/nginx/ssl/default.key; server_name study.test; root /var/www/laravel-learn/public; index index.php index.html index.htm; location = /index.php { # Ensure that there is no such file named "not_exists" # in your "public" directory. try_files /not_exists @swoole; } location / { try_files $uri $uri/ @swoole; } location @swoole { set $suffix ""; if ($uri = /index.php) { set $suffix "/"; } proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header SERVER_PORT $server_port; proxy_set_header REMOTE_ADDR $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # IF https # proxy_set_header HTTPS "on"; charset utf-8; proxy_pass http://swoole-http$suffix; }} 然后重启 nginx 修改 laravel env123SWOOLE_HTTP_HOST=workspaceSWOOLE_HTTP_DAEMONIZE=trueSWOOLE_HOT_RELOAD_ENABLE=true 启动 swoole1php artisan swoole:http start | stop | restart | resload 开发环境热更新调整 swoole_http 中 max_request = 1