美文网首页Docker
dockerfile构建镜像 && 搭建wordpress

dockerfile构建镜像 && 搭建wordpress

作者: 慕知 | 来源:发表于2021-03-26 19:34 被阅读0次

一,Dockerfile介绍

Dockerfile是由一行行志玲语句构成的一个,创建docker镜像的配置文件
三个部分组成: 基础(必须要有),镜像,运行指令,容器默认执行命令。

PS:
FROM是必须要的
所有的指令必须大写

二,dockerfile中常用的指令

1,FROM:指定基础镜像,必须为第一个命令

格式:
   FROM <image>
   FROM <image>:<tag>
   FROM <image>@<digest>

示例: FROM mysql:5.6;      (提供基础镜像)
注: tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像

2, MAINTAINER: 维护者信息

格式:
   MAINTAINER <name>

示例:
MAINTAINER Jasper Xu
MAINTAINER sorex@163.com
MAINTAINER Jasper Xu <sorex@163.com>
 



[root@\ docker~]# vim Dockerfile
FROM nginx
MAINTAINER zxx


[root@\ docker~]# docker build -t test:v1 .
Sending build context to Docker daemon  658.4MB
Step 1/2 : FROM nginx
 ---> f6d0b4767a6c
Step 2/2 : MAINTAINER zxx
 ---> Running in 5588d82876b8
Removing intermediate container 5588d82876b8
 ---> cc421ec1dc93
Successfully built cc421ec1dc93
Successfully tagged test:v1



[root@\ docker~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         v1        cc421ec1dc93   25 seconds ago   133MB


[root@\ docker~]# docker inspect test:v1 | grep Author
        "Author": "zxx",

3, RUN:构建镜像时执行的命令

基于FROM指定的docker镜像,运行一个指令;将结果反应给新的镜像
执行的指令必须是镜像中已经存在的命令(比如nginx里不可以执行ip a)


[root@\ docker~]# vim Dockerfile
FROM nginx
MAINTAINER zxx
RUN echo 'hello' > /usr/share/nginx/html/index.html



[root@\ docker~]# docker build -t test:v2 .


[root@\ docker~]# docker run -it test:v2 bash
root@fe1d23720d97:/# cd /usr/share/nginx/html/
root@fe1d23720d97:/usr/share/nginx/html# cat index.html
hello

4, CMD:构建容器后调用,也就是在容器启动时才进行调用

[root@\ docker~]# vim Dockerfile
FROM nginx
MAINTAINER zxx
RUN echo 'hello' > /usr/share/nginx/html/index.html
CMD /bin/bash



[root@\ docker~]# docker build -t test:v3 .

#运行镜像会直接进入到bash中
[root@\ docker~]# docker run -it test:v3
root@43a5544061af:/#


5, ADD:将本地文件添加到容器中(可以解压,支持tar包解压;支持远程下载)

[root@\ docker~]# vim Dockerfile
FROM centos:7
ADD php.tar.gz /root          # 可以使用ADD 下载链接  /root

[root@\ docker~]# docker build -t test:v5 .


[root@\ docker~]# docker run -it test:v5 bash
[root@021d11772a60 /]# cd /root
[root@021d11772a60 ~]# ls
anaconda-ks.cfg                          php71w-cli-7.1.31-1.w7.x86_64.rpm
autoconf-2.69-11.el7.noarch.rpm          php71w-common-7.1.31-1.w7.x86_64.rpm
automake-1.13.4-3.el7.noarch.rpm         php71w-devel-7.1.31-1.w7.x86_64.rpm
libX11-1.6.5-2.el7.x86_64.rpm            php71w-embedded-7.1.31-1.w7.x86_64.rpm
... ...

6, COPY:功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源

[root@\ docker~]# vim Dockerfile
FROM centos:7
COPY php.tar.gz /root


[root@\ docker~]# docker build -t test:v4 .

[root@\ docker~]# docker run -it test:v4 bash
[root@fd0af3e93312 /]# cd /root
[root@fd0af3e93312 ~]# ls
anaconda-ks.cfg  php.tar.gz

7, ENV:设置容器的环境变量

8, EXPOSE:指定于外界交互的端口

只有制定了expose,才可以使用-P;可以指定多个端口


[root@\ docker~]# vim Dockerfile
FROM nginx
EXPOSE 8080
CMD nginx -g "daemon off;"



[root@\ docker~]# docker build -t test:v7 .

[root@\ docker~]# docker run -d test:v7


[root@\ docker~]# docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED             STATUS             PORTS                    NAMES
0c713e9b2158   test:v7         "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds       80/tcp, 8080/tcp         silly_elgamal


9, ARG ,用于指定传递给构建运行时的变量

用于构建镜像时,传入的参数   



[root@\ docker~]# vim Dockerfile
FROM centos:7
ARG APP=xxx
RUN yum install -y $APP
CMD nginx -g "daemon off;"



[root@\ docker~]# docker build  --build-arg=APP=nginx -t test:v8 .
Sending build context to Docker daemon  678.3MB
Step 1/4 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/4 : ARG APP=xxx
 ---> Running in b4da42ad3020
Removing intermediate container b4da42ad3020
 ---> 93b0f3cc8330
Step 3/4 : RUN yum install -y $APP
 ---> Running in b56d19cbbeca
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.ustc.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.ustc.edu.cn
No package nginx available.
Error: Nothing to do

# -build-arg=APP=nginx 可改变指定设置的变量,如果不指定nginx,那么下载的就是xxx

10, VOLUME:用于指定持久化目录

-- 设置需要挂载的目录;没有实现挂载
FROM centos:7
VOLUME ["/opt","/var/log"]
CMD nginx -g "daemon off;"


[root@\ docker~]# docker build -t test:v9 .

[root@\ docker~]# docker inspect test:v9
...
"Volumes": {
                "/opt": {},
                "/var/log": {}
            },


# 提醒作用,使用该镜像就知道需要挂载哪个目录

11, WORKDIR:工作目录,类似于 cd 命令

[root@\ docker~]# vim Dockerfile
FROM centos:7
WORKDIR /opt
CMD nginx -g "daemon off;"


[root@\ docker~]# docker build -t test:v10 .

# 运行时的开始目录就是/opt
[root@\ docker~]# docker run -it test:v10 bash
[root@3b5c6dd984e9 opt]#


# 设置后,RUN CMD ADD COPY等命令都会在该目录下执行

12, ONBUILD:用于设置镜像触发器

触发条件:当前镜像用作基础镜像时触发



[root@\ docker~]# vim Dockerfile
FROM centos:7 
WORKDIR /opt
ONBUILD RUN echo "偷镜像吗"
CMD nginx -g "daemon off;"

# 生成镜像
[root@\ docker~]# docker build -t test:v11 .
Sending build context to Docker daemon  678.3MB
Step 1/4 : FROM centos:7
 ---> 8652b9f0cb4c
Step 2/4 : WORKDIR /opt
 ---> Using cache
 ---> 1cbdd9c77083
Step 3/4 : ONBUILD RUN echo "偷镜像吗"
 ---> Running in cef2b047e2e9
Removing intermediate container cef2b047e2e9
 ---> f89871fbdf03
Step 4/4 : CMD nginx -g "daemon off;"
 ---> Running in 75a8053f9dc5
Removing intermediate container 75a8053f9dc5
 ---> f8e928a8f19e
Successfully built f8e928a8f19e
Successfully tagged test:v11



#把镜像11当作基础镜像
[root@\ docker~]# vim Dockerfile
FROM test:v11
WORKDIR /opt
ONBUILD RUN echo "偷镜像吗"
CMD nginx -g "daemon off;"


# 执行时会先出现“偷镜像吗”
[root@\ docker~]# docker build -t test:v12 .
Sending build context to Docker daemon  678.3MB
Step 1/4 : FROM test:v11
# Executing 1 build trigger
 ---> Running in c6a05b668887
偷镜像吗
Removing intermediate container c6a05b668887
 ---> 8a3b66d9e8bc
Step 2/4 : WORKDIR /opt
 ---> Running in e032ee131f16
Removing intermediate container e032ee131f16
 ---> 592bf106a608
Step 3/4 : ONBUILD RUN echo "偷镜像吗"
 ---> Running in 84e37e1576ff
Removing intermediate container 84e37e1576ff
 ---> e94d5f5de7f4
Step 4/4 : CMD nginx -g "daemon off;"
 ---> Running in 678e52ffc6fa
Removing intermediate container 678e52ffc6fa
 ---> b0aa928e2876
Successfully built b0aa928e2876
Successfully tagged test:v12

三,搭建LNMP(注意,虚拟机要内存2G,cpu2核)

1,创建网桥及目录

[root@\ docker~]# docker network create lnmp
14db2907cadaca14dcf78aa2d8f461e0a3d39f2bded2662292f1f925e958cdd1

#查看网桥
[root@\ docker~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d083bc15c0d9   bridge    bridge    local
deb1424a66c9   host      host      local
14db2907cada   lnmp      bridge    local
f1c26e4592d9   none      null      local


# 创建目录
[root@\ docker~]# mkdir lnmp
[root@\ docker~]# cd lnmp/
[root@\ docker~/lnmp]# mkdir nginx
[root@\ docker~/lnmp]# mkdir php
[root@\ docker~/lnmp]# mkdir wordpress

2,搭建LNMP_nginx

[root@\ docker~/lnmp/nginx]# ll
-rw-r--r-- 1 root root 396 2021-03-24 11:50 default.conf
-rw-r--r-- 1 root root 178 2021-03-24 11:27 Dockerfile
-rw-r--r-- 1 root root 641 2021-03-24 11:36 nginx.conf


#准备好官方源
[root@\ docker/lnmp/nginx]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true






# 准备好配置文件
[root@\ docker~/lnmp/nginx]# cat default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location ~ \.php$ {
        root           html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        include        fastcgi_params;
    }
 }



#准备好nginx配置文件nginx.conf;并修改用户 更改用户名user www




#编辑Dockerfile
[root@\ docker/lnmp/nginx]# vim DockerfileFROM centos:7
ADD nginx.repo /etc/yum.repos.d/
RUN yum install -y nginx
RUN useradd www
ADD default.conf /etc/nginx/conf.d/
ADD nginx.conf /etc/nginx/
EXPOSE 80
WORKDIR /usr/share/nginx
CMD nginx -g "daemon off;"


PS:
以上文件可以在宿主机先下载好nginx;或者打开一个nginx容器,用docker cp 把需要的文件复制在文件夹中


# 在当前生成镜像
[root@\ docker~/lnmp/nginx]# docker build -t lnmp-nginx:v1 .


2,搭建lnmp_php


[root@\ docker~/lnmp]# cd php

#下载php包,注意版本选择5.6,支持mysql扩展库
[root@\ docker~]# wget https://www.php.net/distributions/php-5.6.40.tar.gz


#把php复制在容器中
[root@\ docker~]# docker cp php-5.6.40.tar.gz 3757b128b9b5:/opt/

# 新建立一个容器,在里面编译安装php
[root@\ docker~]# docker run -it centos:7 bash
[root@3757b128b9b5 /]# cd /opt/
[root@3757b128b9b5 opt]# ls
php-5.6.40.tar.gz




# 安装依赖包
[root@3757b128b9b5 php-5.6.40]# yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers




#解压php
[root@3757b128b9b5 opt]# tar xf php-5.6.40.tar.gz
[root@a011352ebb65 opt]# ls
php-5.6.40  php-5.6.40.tar.gz



#编译
[root@3757b128b9b5 opt]# cd php-5.6.40
[root@3757b128b9b5 php-5.6.40]# ./configure --with-mysql --enable-fpm

[root@3757b128b9b5 php-5.6.40]# make -j
[root@3757b128b9b5 php-5.6.40]# make install  


# 检查mysql扩展库
[root@3757b128b9b5 php-5.6.40]# php -m | grep mysql
mysql
mysqlnd


# 复制php.ini到/usr/local/lib(php --ini查看是没有该文件的)
[root@3757b128b9b5 php-5.6.40]# php --ini
Configuration File (php.ini) Path: /usr/local/lib
Loaded Configuration File:         (none)
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

[root@3757b128b9b5 php-5.6.40]# cp php.ini-development /usr/local/lib/php.ini

[root@3757b128b9b5 php-5.6.40]# php --ini
Configuration File (php.ini) Path: /usr/local/lib
Loaded Configuration File:         /usr/local/lib/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)


# 以上编译好可以打标签先保存在自己的仓库以备使用

把容器保存为镜像
[root@\ docker~]# docker commit -a 'zxx' -m '编译好的php' 3757b128b9b5 php:v1-fpm-mysql
sha256:b2c1d6c762d0906341dadd1f28084ecceaa23674143c6778fb3de0f1080af0dd
[root@\ docker~]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
php          v1-fpm-mysql   b2c1d6c762d0   9 seconds ago   1.05GB



# 登录自己的官网镜像上传
[root@\ docker~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: urbanezxx
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded


#先打标签
[root@\ docker~]# docker tag b2c1d6c762d0 urbanezxx/php:v1-fpm-mysql
#上传
[root@\ docker~]# docker push urbanezxx/php:v1-fpm-mysql






# 
[root@\ docker~]# docker cp 3757b128b9b5:/usr/local/etc/php-fpm.conf.default /lnmp/php/
[root@\ docker~]# cd /lnmp/php/
[root@\ docker/lnmp/php]# ll
total 28
-rw-r--r--. 1 root root   104 Mar 26 11:18 Dockerfile
-rw-r--r--. 1 root root 23024 Mar 26 11:06 php-fpm.conf.default
[root@\ docker/lnmp/php]# mv php-fpm.conf.default php-fpm.conf


# 修改php-fpm.conf
request_terminate_timeout = 0
listen = 9000
user = www
group = www


# 以编译好的php镜像为基础搭建新的镜像
[root@\ docker/lnmp/php]# vim Dockerfile 
FROM php:v1-fpm-mysql
RUN useradd www
ADD php-fpm.conf /usr/local/etc/
EXPOSE 9000
CMD ["php-fpm","-F"]



# 生成镜像
[root@\ docker/lnmp/php]# docker build -t lnmp-php:v1 .

3,搭建wordpress

准备好wordpress包


#先开启mysql
[root@\ docker/lnmp/nginx]# docker run -d -e MYSQL_ROOT_PASSWORD=123 --network=lnmp --name mysql mysql:5.7


# 再开启php
[root@\ docker/lnmp/nginx]# docker run -d -v /lnmp/wordpress/wordpress:/usr/share/nginx/html --network=lnmp --name php lnmp-php:v1


# 最后开启nginx
[root@\ zxx/lnmp/nginx]# docker run -d -v /lnmp/wordpress/wordpress:/usr/share/nginx/html -p 80:80 --network=lnmp --name nginx lnmp-nginx:v1
f14b4fae5452df6f6be8105d1475810ff290a223bb9f8070c52895584442fa5d



# 查看3个容器都已经启动
[root@\ zxx/lnmp/nginx]# docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                 NAMES
f14b4fae5452   lnmp-nginx:v1   "/bin/sh -c 'nginx -…"   3 seconds ago    Up 2 seconds    0.0.0.0:80->80/tcp    nginx
8ac1839c2a76   lnmp-php:v1     "php-fpm -F"             44 seconds ago   Up 43 seconds   9000/tcp              php
196fb1237a32   mysql:5.7  

4,验证

image.png image.png

遇到以上问题可以修改

[root@\ docker/lnmp/wordpress/wordpress]# cp wp-config-sample.php wp-config.php

#清空内容并把提示中的代码输入进去,修改
[root@\ docker/lnmp/wordpress/wordpress]# vim wp-config.php 


define( 'WP_DEBUG', true );  # false修改为true

相关文章

网友评论

    本文标题:dockerfile构建镜像 && 搭建wordpress

    本文链接:https://www.haomeiwen.com/subject/jegchltx.html