您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
Dockerfile构建lnmp(是docker而非docker-compose)(主机模式)
发布时间:2023-06-29 12:28:27编辑:雪饮阅读()
-
环境:
VMware® Workstation 17 Pro(17.0.2 build-21581411) 完整破解版
win11
虚拟机环境:
centos7.6 x64(1810)
Docker version 24.0.2, build cb74dfc
为什么采用主机模式?
为什么采用主机模式,主要是不晓得我安装win11后还是安装vmware workstation 17 pro后导致的无法桥接。
好像之前我是vmware workstation 15的时候是可以的,但是vmware workstation 17 pro支持建立win11虚拟机,之前我为了测试下win11不同版本的一个远程桌面服务的一个技术细节,所以用到了,但发现win11虚拟机里面可以桥接,只是centos7里面不行。。。
后面docker容器内部无法公网的原因,可能也是与无法桥接有关,因为无法桥接后我就使用了nat连接,也可能是nat连接对docker里面有影响也说不定吧。
所以我物理机连接虚拟机使用的是nat,而虚拟机内部的docker的运行模式就用主机模式,那么这里docker的主机模式,在这种情况下相当于和虚拟机共享了物理机的nat连接吧。
构建目标:
CentOS Linux release 7.9.2009 (Core)
php7.4.33
nginx1.8.1
mysql-5.7.33
依赖的文件
Centos-7.repo:
下载地址:http://mirrors.aliyun.com/repo/Centos-7.repo
libzip-1.2.0.tar.gz
下载地址:https://libzip.org/download/libzip-1.2.0.tar.gz
my.cnf:见后面附件
mysql-5.7.33-el7-x86_64.tar.gz
下载地址:https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-5.7.33-el7-x86_64.tar.gz
mysql-boost-5.7.33.tar.gz
下载地址:https://mirrors.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-boost-5.7.33.tar.gz
nginx-1.8.1.tar.gz
下载地址:http://nginx.org/download/nginx-1.8.1.tar.gz
nginx.conf:见后面附件
onig-6.9.5-rev1.tar.gz
下载地址:https://github.com/kkos/oniguruma/releases/download/v6.9.5_rev1/onig-6.9.5-rev1.tar.gz
pcre-8.40.tar.gz
下载地址:https://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz
php-7.4.33.tar.gz
下载地址:https://www.php.net/distributions/php-7.4.33.tar.gz
php.ini:见后面附件
start_services.sh:见后面附件
test.php:见后面附件
test2.php:见后面附件
wget-1.14-18.el7_6.1.x86_64.rpm
下载地址:ftp://ftp.pbone.net/mirror/vault.centos.org/7.8.2003/os/x86_64/Packages/wget-1.14-18.el7_6.1.x86_64.rpm
zlib-1.2.1.tar.gz
下载地址:
https://codeload.github.com/madler/zlib/tar.gz/refs/tags/v1.2.1
Dockerfile:见后面附件
构建镜像与容器运行
上面的文件全部整合到一个目录中,然后cd到这个目录中进行构建
docker build --network=host -f Dockerfile -t testimage . --progress=plain
容器运行
docker run --network=host -d testimage
由于是主机模式,那么有一个好处就是容器运行后容器内部的比如我们这里的nginx会直接可以通过虚拟机的ip访问,物理机可以直接访问虚拟机ip,而不用将运行的容器暴露端口映射给虚拟机。
但是带来的坏处就是,容器运行时候,与虚拟机端口冲突,即便虚拟机端口没有被占用,但是运行多个容器时候也就会冲突了,毕竟第一个容器运行后就已经占用了。
在构建镜像过程中或许也有此问题。
本次实践过程中的一些docker相关笔记
docker安装
环境依赖
yum -y install yum-utils device-mapper-persistent-data lvm2
docker镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
安装docker及docker相关的。(docker-ce 社区版 而ee是企业版)
yum install docker-ce docker-ce-cli containerd.io
启动Docker服务
systemctl start docker
设置开机自动启动
systemctl enable docker
安装ok
[root@localhost ~]# docker -v
Docker version 24.0.2, build cb74dfc
构建镜像
docker build -f Dockerfile -t testimage .
交互式运行容器
docker run -it testimage /bin/bash
交互式运行容器(桥接模式)
docker run --network=bridge -it testimage /bin/bash
不晓得为什么,我连接虚拟机用的是nat连接,但是启动docker容器的时候如果不加桥接模式,那么我与虚拟机的连接就断开了,是在进入了容器里面后就断开的
交互式运行容器(桥接模式)(退出即删除的容器)
docker run --rm --network=bridge -it testimage /bin/bash
交互式运行容器(主机模式)(退出即删除的容器)
docker run --rm --network=host -it testimage /bin/bash
不晓得为什么交互式运行容器(桥接模式)就容器内部无法上网
构建镜像(包含构建过程比如编译lnmp你手动编译的哪些命令的过程和结果输出)
docker build -f Dockerfile -t testimage . --progress=plain
构建镜像(包含构建过程)(包含构建所用网络模式)
docker build --network=host -f Dockerfile -t testimage . --progress=plain
交互式运行容器(主机模式)(退出即删除的容器)(暴露容器内部端口给宿主机端口)
docker run -p 8080:80 --rm --network=host -it testimage /bin/bash
docker容器内部路径映射到宿主机路径上的覆盖关系:
映射的那一瞬间是Docker会将容器内部的目录内容复制到宿主机的目录中,覆盖宿主机上的同名文件。
后面的docker容器内部文件产生会同步宿主机的这个目录,而宿主机这个目录中有文件产生也同样同步到docker容器内部的那个目录
交互式运行容器(主机模式)(退出即删除的容器)
docker run --rm --network=host -it testimage /bin/bash
-d后台运行:
docker run --network=host -d testimage
exec在后台运行时候进入某个容器
docker exec -it f9ba9e3fc289 /bin/bash
关于docker run运行一个容器的时候的主机模式的坑:
--network=host 参数会影响容器的网络配置,它将容器与主机共享网络命名空间。使用 --network=host 参数时,容器将直接使用主机的网络栈,而不会在容器内部创建独立的网络命名空间。
当你在容器内运行服务时,使用 --network=host 参数可以使容器内的服务直接绑定到主机上的 IP 地址和端口,而无需进行端口映射。这样,容器内的服务可以通过主机的 IP 地址和端口进行访问,就像是在主机上直接运行的一样。
然而,需要注意的是,使用 --network=host 参数会导致容器与主机之间的网络隔离性降低。容器内的进程可以直接访问主机上的网络接口和端口,这可能会增加一些安全风险。因此,在使用 --network=host 参数时,需要谨慎考虑安全性和网络隔离的需求。
如果你没有使用 --network=host 参数,容器将使用默认的网络配置,会在容器内部创建独立的网络命名空间,并使用 Docker 的网络机制进行网络隔离。在这种情况下,你可以使用端口映射(例如 -p 3306:3306)将容器内的端口映射到主机上的端口,以便从主机或其他网络节点访问容器内的服务。
附件
关键字词:Dockerfile