docker-Dockfile创建镜像image

文档《docker从入门到实践》

声明:该文章并不会另你掌握docker,仅仅是如何学习。

在这里插入图片描述
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  1. 从已经创建的容器中更新镜像,并且提交这个镜像
  2. 使用 Dockerfile 指令来创建一个新的镜像

Dockfile

在这里插入图片描述

FROM centos:latest
RUN groupadd -r redis \
&& useradd  -r -g redis redis
RUN yum -y update \
&& yum -y install epel-release \
&& yum -y install redis \
&& yum -y install net-tools
EXPOSE 6379

这是一个centos系统的redis服务 开放的端口是6379;注意\符号是书写上的换行,使之更直观,但不是真正的换行,代表书写换行但其实是尾随连接。而真正的换行处不可以用\,如FROM与RUN是两行,FROM后不可以用\,否则就是语法错误。该文件共有四行,FROM,RUN,RUN,EXPOSE。

注意事项

最好将Dockfile放在空目录下,不要放在该目录下放入无关紧要的文件,否则docker会把其他文件也打包成镜像,使得镜像十分的臃肿。

在这里插入图片描述

创建镜像

在 Dockerfile 文件所在目录执行:
docker build --help
在这里插入图片描述
语法:docker build [选项] <上下文路径/URL/->

创建镜像命令docker build -t redis .

-t = tag 指定tag名称 ;注意 redis后边跟着的.点,代表上下文路径,当前目录。docker会把该目录下所有的区域当作上下文区域,所以该目录下只能是必要文件。

docker build 会在这里插入图片描述

build命令会根据Dockfile创建一个只读文件系统

查看镜像命令 docker image ls

在这里插入图片描述
由于docker build -t redis . 由于没有指定tag,所以默认latest。重新看-t命令
在这里插入图片描述
所以为了区分,一般是docker build -t redis:1.0 . 来标记镜像。

docker image ls -a

默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数 = list all
在这里插入图片描述
在这里插入图片描述

虚悬镜像

文档中提到ls -a 显示的<none>标签的虚悬镜像,不同于ls列出的虚悬镜像。前者是一些镜像的依赖,后者是可以任意删除的。
在这里插入图片描述
当再次通过同一dockfile创建新的镜像时,新镜像会使用已安装的镜像层,安装会很快。
docker build -t redis:1.0 . 用来区分latest。

这里体现了FROM,RUN,RUN,EXPOSE 四行=四步。
在这里插入图片描述
在这里插入图片描述
redis:1.0 和 redis:latest 是两个不同的镜像。然而它们共用了相同的中间层镜像。

<think>好的,我现在需要帮助用户在CentOS 7/8系统上使用Docker搭建LNMP环境,并且通过Dockerfile构建Apache镜像。首先,我需要理清楚用户的具体需求。用户的问题分为几个部分:安装配置Docker,拉取CentOS基础镜像并运行;搭建LNMP环境,包括MySQL、Nginx、PHP-FPM,配置数据卷和网络隔离,部署WordPress;以及用Dockerfile基于CentOS镜像构建Apache Web服务镜像。 首先,安装Docker。根据引用中的信息,用户可能已经看过一些安装教程,比如在CentOS配置Swap,安装Jenkins等。CentOS 7和8的安装步骤可能略有不同,特别是8可能需要启用特定的仓库。需要确保Docker安装完成后设置开机启动,这样服务就能永久性启动了。这部分需要检查官方文档以确保步骤正确,比如添加Docker仓库,安装docker-ce,启动并启用服务,以及将用户加入docker组避免sudo。 接下来是拉取CentOS基础镜像。用户可能希望用这个镜像作为基础来构建其他服务,比如Apache。这部分比较简单,直接使用docker pull centos即可,但需要注意版本标签,比如centos:7或centos:8。 然后是搭建LNMP环境。根据引用中的内容,用户提到使用docker-compose来管理服务,比如在引用[2]和[3]中,他们使用了docker-compose.yml文件定义服务,包括网络、数据卷、环境变量等。LNMP需要三个服务:MySQL、Nginx、PHP-FPM。需要创建自定义网络,确保容器之间可以通信,比如通过depends_on设置依赖关系,PHP可能需要连接MySQL,Nginx需要连接PHP-FPM。数据卷方面,MySQL的数据目录、Nginx的配置和网站根目录、PHP的配置都需要挂载到宿主机,以便持久化和修改。 部署WordPress的话,可能需要将WordPress文件放在Nginx的html目录下,并配置数据库连接。这里需要确保MySQL容器创建了对应的数据库和用户,WordPress的wp-config.php文件正确配置数据库信息。PHP可能需要安装额外的扩展,如pdo_mysql、gd等,这在引用[4]中用户通过docker exec进入容器安装扩展,或者通过Dockerfile构建自定义PHP镜像。例如,用户提到在Dockerfile中安装必要扩展,然后构建镜像,这样在docker-compose中使用这个自定义镜像。 关于Dockerfile构建Apache镜像,用户希望基于CentOS镜像。步骤可能包括安装Apache、配置服务、暴露端口,设置启动命令。需要编写Dockerfile,使用RUN命令安装httpd,复制配置文件,设置VOLUME和WORKDIR,然后CMD启动Apache。构建完成后,可以运行容器并测试访问。 需要注意的问题包括:网络配置是否正确,容器间的通信是否通过自定义网络;数据卷挂载路径是否存在,权限是否正确;PHP扩展是否安装完全,比如pdo_mysql对于WordPress是必须的;MySQL的安全设置,比如root密码和新建用户;Nginx的配置是否正确指向PHP-FPM的地址和端口;以及Dockerfile中的指令是否正确,比如使用yum安装软件,处理依赖关系。 可能遇到的错误:如果PHP无法连接MySQL,可能是网络问题或MySQL用户权限问题;Nginx返回502错误,可能是PHP-FPM没有正确运行或配置错误;Apache镜像无法启动,可能是Dockerfile中的命令有误,比如没有使用正确的守护进程启动方式。 需要参考用户提供的引用,比如引用[3]中提到的创建Dockerfile来安装PHP扩展,引用[4]中运行PHP容器并挂载配置文件的步骤,引用[5]中使用--link连接容器的方法,但现在更推荐使用自定义网络。在docker-compose中,服务之间的连接可以通过服务名称自动解析,所以不需要手动链接。 总结步骤:安装Docker -> 拉取CentOS镜像 -> 编写docker-compose.yml定义LNMP服务(MySQL、PHP、Nginx)-> 配置数据卷和网络 -> 构建自定义PHP镜像(如果需要扩展)-> 部署WordPress -> 编写Apache的Dockerfile并构建镜像。 现在需要将这些步骤详细分解,确保用户能够一步步操作,同时注意命令的正确性和配置文件的正确位置。例如,docker-compose.yml中的volumes路径是否正确,环境变量是否正确设置,以及如何测试每个服务是否正常运行。</think>### 一、CentOS 7/8 安装与配置 Docker 1. **卸载旧版本(如有)** ```bash sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine ``` 2. **安装依赖工具** ```bash sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ``` 3. **添加 Docker 官方仓库** ```bash sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ``` 4. **安装 Docker 并启动服务** ```bash sudo yum install -y docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker # 永久性启动服务 ``` 5. **验证安装** ```bash sudo docker run hello-world # 若显示欢迎信息则成功 ``` 6. **配置用户权限(可选)** ```bash sudo usermod -aG docker $USER # 将当前用户加入docker组,避免使用sudo ``` --- ### 二、搭建 LNMP 环境(Docker Compose 方式) 1. **创建项目目录** ```bash mkdir ~/docker-lnmp && cd ~/docker-lnmp ``` 2. **编写 `docker-compose.yml` 文件** ```yaml version: '3' services: mysql: image: mysql:8.0 container_name: mysql-server networks: - lnmp-network volumes: - mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress_user MYSQL_PASSWORD: wordpress_password restart: always php: build: ./php # 使用自定义PHP镜像(需Dockerfile) container_name: php-fpm networks: - lnmp-network volumes: - ./html:/var/www/html # 网站代码目录 depends_on: - mysql nginx: image: nginx:latest container_name: nginx-server networks: - lnmp-network ports: - "80:80" volumes: - ./html:/var/www/html - ./nginx/conf.d:/etc/nginx/conf.d # Nginx配置文件 depends_on: - php restart: always volumes: mysql-data: networks: lnmp-network: driver: bridge ``` 3. **创建 PHP 自定义镜像(含扩展)** - 在 `~/docker-lnmp/php` 目录下创建 `Dockerfile`: ```dockerfile FROM php:7.4-fpm RUN docker-php-ext-install pdo pdo_mysql gd # 安装必要扩展[^1] ``` 4. **启动服务** ```bash docker-compose up -d ``` 5. **验证服务** ```bash docker ps -a # 检查容器状态 curl http://localhost # 测试Nginx响应 ``` --- ### 三、部署 WordPress 1. **下载 WordPress 到 `html` 目录** ```bash cd ~/docker-lnmp/html wget https://wordpress.org/latest.tar.gz tar -zxvf latest.tar.gz --strip-components=1 ``` 2. **配置数据库连接** 修改 `wp-config.php`: ```php define('DB_NAME', 'wordpress'); define('DB_USER', 'wordpress_user'); define('DB_PASSWORD', 'wordpress_password'); define('DB_HOST', 'mysql-server'); # 使用容器名称作为主机名[^2] ``` --- ### 四、构建 Apache Web 服务镜像 1. **创建 Dockerfile** ```dockerfile FROM centos:7 RUN yum install -y httpd COPY ./html /var/www/html EXPOSE 80 CMD ["httpd", "-D", "FOREGROUND"] ``` 2. **构建镜像** ```bash docker build -t my-apache . ``` 3. **运行容器** ```bash docker run -d --name my-apache -p 8080:80 -v $(pwd)/html:/var/www/html my-apache ``` --- ### 五、关键配置说明 1. **数据卷挂载** - MySQL数据持久化:`mysql-data` 卷避免容器删除后数据丢失[^3] - Nginx配置热更新:通过挂载 `conf.d` 目录实现配置动态加载[^4] 2. **网络隔离** 自定义网络 `lnmp-network` 确保容器间通过服务名称直接通信[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值